t 2.8.0 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,7 +8,7 @@ module T
8
8
  MAX_PAGE = 51
9
9
 
10
10
  def collect_with_max_id(collection = [], max_id = nil, &block)
11
- tweets = retryable(:tries => 3, :on => Twitter::Error, :sleep => 0) do
11
+ tweets = Retryable.retryable(tries: 3, on: Twitter::Error, sleep: 0) do
12
12
  yield(max_id)
13
13
  end
14
14
  return collection if tweets.nil?
@@ -31,7 +31,7 @@ module T
31
31
  end
32
32
 
33
33
  def collect_with_page(collection = ::Set.new, page = 1, previous = nil, &block) # rubocop:disable ParameterLists
34
- tweets = retryable(:tries => 3, :on => Twitter::Error, :sleep => 0) do
34
+ tweets = Retryable.retryable(tries: 3, on: Twitter::Error, sleep: 0) do
35
35
  block.call(page)
36
36
  end
37
37
  return collection if tweets.nil? || tweets == previous || page >= MAX_PAGE
@@ -17,8 +17,8 @@ module T
17
17
  end
18
18
 
19
19
  desc 'block USER [USER...]', 'Unblock users.'
20
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify input as Twitter user IDs instead of screen names.'
21
- method_option 'force', :aliases => '-f', :type => :boolean
20
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify input as Twitter user IDs instead of screen names.'
21
+ method_option 'force', aliases: '-f', type: :boolean
22
22
  def block(user, *users)
23
23
  unblocked_users, number = fetch_users(users.unshift(user), options) do |users_to_unblock|
24
24
  client.unblock(users_to_unblock)
@@ -29,7 +29,7 @@ module T
29
29
  end
30
30
 
31
31
  desc 'dm [DIRECT_MESSAGE_ID] [DIRECT_MESSAGE_ID...]', 'Delete the last Direct Message sent.'
32
- method_option 'force', :aliases => '-f', :type => :boolean
32
+ method_option 'force', aliases: '-f', type: :boolean
33
33
  def dm(direct_message_id, *direct_message_ids)
34
34
  direct_message_ids.unshift(direct_message_id)
35
35
  require 't/core_ext/string'
@@ -48,10 +48,10 @@ module T
48
48
  end
49
49
  end
50
50
  end
51
- map %w[d m] => :dm
51
+ map %w(d m) => :dm
52
52
 
53
53
  desc 'favorite TWEET_ID [TWEET_ID...]', 'Delete favorites.'
54
- method_option 'force', :aliases => '-f', :type => :boolean
54
+ method_option 'force', aliases: '-f', type: :boolean
55
55
  def favorite(status_id, *status_ids)
56
56
  status_ids.unshift(status_id)
57
57
  require 't/core_ext/string'
@@ -63,18 +63,18 @@ module T
63
63
  end
64
64
  else
65
65
  status_ids.each do |status_id_to_unfavorite|
66
- status = client.status(status_id_to_unfavorite, :include_my_retweet => false)
66
+ status = client.status(status_id_to_unfavorite, include_my_retweet: false)
67
67
  return unless yes? "Are you sure you want to remove @#{status.user.screen_name}'s status: \"#{status.full_text}\" from your favorites? [y/N]"
68
68
  client.unfavorite(status_id_to_unfavorite)
69
69
  say "@#{@rcfile.active_profile[0]} unfavorited @#{status.user.screen_name}'s status: \"#{status.full_text}\""
70
70
  end
71
71
  end
72
72
  end
73
- map %w[fave favourite] => :favorite
73
+ map %w(fave favourite) => :favorite
74
74
 
75
75
  desc 'list LIST', 'Delete a list.'
76
- method_option 'force', :aliases => '-f', :type => :boolean
77
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify list via ID instead of slug.'
76
+ method_option 'force', aliases: '-f', type: :boolean
77
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify list via ID instead of slug.'
78
78
  def list(list)
79
79
  if options['id']
80
80
  require 't/core_ext/string'
@@ -89,8 +89,8 @@ module T
89
89
  end
90
90
 
91
91
  desc 'mute USER [USER...]', 'Unmute users.'
92
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify input as Twitter user IDs instead of screen names.'
93
- method_option 'force', :aliases => '-f', :type => :boolean
92
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify input as Twitter user IDs instead of screen names.'
93
+ method_option 'force', aliases: '-f', type: :boolean
94
94
  def mute(user, *users)
95
95
  unmuted_users, number = fetch_users(users.unshift(user), options) do |users_to_unmute|
96
96
  client.unmute(users_to_unmute)
@@ -100,26 +100,38 @@ module T
100
100
  say "Run `#{File.basename($PROGRAM_NAME)} mute #{unmuted_users.collect { |unmuted_user| "@#{unmuted_user.screen_name}" }.join(' ')}` to mute."
101
101
  end
102
102
 
103
+ desc 'account SCREEN_NAME [CONSUMER_KEY]', 'delete account or consumer key from t'
104
+ def account(account, key = nil)
105
+ if key && @rcfile.profiles[account].keys.length == 1
106
+ continue = ask 'There is only one API key associated with this account, removing it will disable all functionality, are you sure you want to delete it? [y/N]'
107
+ return if continue.downcase != 'y'
108
+ elsif key
109
+ return @rcfile.delete_key(account, key)
110
+ else
111
+ @rcfile.delete_profile(account)
112
+ end
113
+ end
114
+
103
115
  desc 'status TWEET_ID [TWEET_ID...]', 'Delete Tweets.'
104
- method_option 'force', :aliases => '-f', :type => :boolean
116
+ method_option 'force', aliases: '-f', type: :boolean
105
117
  def status(status_id, *status_ids)
106
118
  status_ids.unshift(status_id)
107
119
  require 't/core_ext/string'
108
120
  status_ids.collect!(&:to_i)
109
121
  if options['force']
110
- tweets = client.destroy_status(status_ids, :trim_user => true)
122
+ tweets = client.destroy_status(status_ids, trim_user: true)
111
123
  tweets.each do |status|
112
124
  say "@#{@rcfile.active_profile[0]} deleted the Tweet: \"#{status.full_text}\""
113
125
  end
114
126
  else
115
127
  status_ids.each do |status_id_to_delete|
116
- status = client.status(status_id_to_delete, :include_my_retweet => false)
128
+ status = client.status(status_id_to_delete, include_my_retweet: false)
117
129
  return unless yes? "Are you sure you want to permanently delete @#{status.user.screen_name}'s status: \"#{status.full_text}\"? [y/N]"
118
- client.destroy_status(status_id_to_delete, :trim_user => true)
130
+ client.destroy_status(status_id_to_delete, trim_user: true)
119
131
  say "@#{@rcfile.active_profile[0]} deleted the Tweet: \"#{status.full_text}\""
120
132
  end
121
133
  end
122
134
  end
123
- map %w[post tweet update] => :status
135
+ map %w(post tweet update) => :status
124
136
  end
125
137
  end
@@ -0,0 +1,49 @@
1
+ module T
2
+ class Identicon
3
+ # Six-bit number (0-63)
4
+ attr_accessor :bits
5
+
6
+ # Eight-bit number (0-255)
7
+ attr_accessor :color
8
+
9
+ def initialize(number)
10
+ # Bottom six bits
11
+ @bits = number & 0x3f
12
+
13
+ # Next highest eight bits
14
+ @fcolor = (number >> 6) & 0xff
15
+
16
+ # Next highest eight bits
17
+ @bcolor = (number >> 14) & 0xff
18
+ end
19
+
20
+ def lines
21
+ ["#{bg @bits[0]} #{bg @bits[1]} #{bg @bits[0]} #{reset}",
22
+ "#{bg @bits[2]} #{bg @bits[3]} #{bg @bits[2]} #{reset}",
23
+ "#{bg @bits[4]} #{bg @bits[5]} #{bg @bits[4]} #{reset}"]
24
+ end
25
+
26
+ private
27
+
28
+ def reset
29
+ "\033[0m"
30
+ end
31
+
32
+ def bg(bit)
33
+ bit == 0 ? "\033[48;5;#{@bcolor}m" : "\033[48;5;#{@fcolor}m"
34
+ end
35
+ end
36
+
37
+ class << Identicon
38
+ def for_user_name(string)
39
+ Identicon.new(digest(string))
40
+ end
41
+
42
+ private
43
+
44
+ def digest(string)
45
+ require 'digest'
46
+ Digest::MD5.digest(string).chars.inject(0) { |a, e| (a << 8) | e.ord }
47
+ end
48
+ end
49
+ end
@@ -23,7 +23,7 @@ module T
23
23
  end
24
24
 
25
25
  desc 'add LIST USER [USER...]', 'Add members to a list.'
26
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify input as Twitter user IDs instead of screen names.'
26
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify input as Twitter user IDs instead of screen names.'
27
27
  def add(list_name, user, *users)
28
28
  added_users, number = fetch_users(users.unshift(user), options) do |users_to_add|
29
29
  client.add_list_members(list_name, users_to_add)
@@ -39,16 +39,16 @@ module T
39
39
  end
40
40
 
41
41
  desc 'create LIST [DESCRIPTION]', 'Create a new list.'
42
- method_option 'private', :aliases => '-p', :type => :boolean
42
+ method_option 'private', aliases: '-p', type: :boolean
43
43
  def create(list_name, description = nil)
44
- opts = description ? {:description => description} : {}
45
- opts.merge!(:mode => 'private') if options['private']
44
+ opts = description ? {description: description} : {}
45
+ opts.merge!(mode: 'private') if options['private']
46
46
  client.create_list(list_name, opts)
47
47
  say "@#{@rcfile.active_profile[0]} created the list \"#{list_name}\"."
48
48
  end
49
49
 
50
50
  desc 'information [USER/]LIST', 'Retrieves detailed information about a Twitter list.'
51
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
51
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
52
52
  def information(user_list)
53
53
  owner, list_name = extract_owner(user_list, options)
54
54
  list = client.list(owner, list_name)
@@ -71,15 +71,15 @@ module T
71
71
  print_table(array)
72
72
  end
73
73
  end
74
- map %w[details] => :information
74
+ map %w(details) => :information
75
75
 
76
76
  desc 'members [USER/]LIST', 'Returns the members of a Twitter list.'
77
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
78
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify user via ID instead of screen name.'
79
- method_option 'long', :aliases => '-l', :type => :boolean, :desc => 'Output in long format.'
80
- method_option 'reverse', :aliases => '-r', :type => :boolean, :desc => 'Reverse the order of the sort.'
81
- method_option 'sort', :aliases => '-s', :type => :string, :enum => %w[favorites followers friends listed screen_name since tweets tweeted], :default => 'screen_name', :desc => 'Specify the order of the results.', :banner => 'ORDER'
82
- method_option 'unsorted', :aliases => '-u', :type => :boolean, :desc => 'Output is not sorted.'
77
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
78
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify user via ID instead of screen name.'
79
+ method_option 'long', aliases: '-l', type: :boolean, desc: 'Output in long format.'
80
+ method_option 'reverse', aliases: '-r', type: :boolean, desc: 'Reverse the order of the sort.'
81
+ method_option 'sort', aliases: '-s', type: :string, enum: %w(favorites followers friends listed screen_name since tweets tweeted), default: 'screen_name', desc: 'Specify the order of the results.', banner: 'ORDER'
82
+ method_option 'unsorted', aliases: '-u', type: :boolean, desc: 'Output is not sorted.'
83
83
  def members(user_list)
84
84
  owner, list_name = extract_owner(user_list, options)
85
85
  users = client.list_members(owner, list_name).to_a
@@ -87,7 +87,7 @@ module T
87
87
  end
88
88
 
89
89
  desc 'remove LIST USER [USER...]', 'Remove members from a list.'
90
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify input as Twitter user IDs instead of screen names.'
90
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify input as Twitter user IDs instead of screen names.'
91
91
  def remove(list_name, user, *users)
92
92
  removed_users, number = fetch_users(users.unshift(user), options) do |users_to_remove|
93
93
  client.remove_list_members(list_name, users_to_remove)
@@ -103,13 +103,13 @@ module T
103
103
  end
104
104
 
105
105
  desc 'timeline [USER/]LIST', 'Show tweet timeline for members of the specified list.'
106
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
107
- method_option 'decode_uris', :aliases => '-d', :type => :boolean, :desc => 'Decodes t.co URLs into their original form.'
108
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify user via ID instead of screen name.'
109
- method_option 'long', :aliases => '-l', :type => :boolean, :desc => 'Output in long format.'
110
- method_option 'number', :aliases => '-n', :type => :numeric, :default => DEFAULT_NUM_RESULTS, :desc => 'Limit the number of results.'
111
- method_option 'relative_dates', :aliases => '-a', :type => :boolean, :desc => 'Show relative dates.'
112
- method_option 'reverse', :aliases => '-r', :type => :boolean, :desc => 'Reverse the order of the sort.'
106
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
107
+ method_option 'decode_uris', aliases: '-d', type: :boolean, desc: 'Decodes t.co URLs into their original form.'
108
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify user via ID instead of screen name.'
109
+ method_option 'long', aliases: '-l', type: :boolean, desc: 'Output in long format.'
110
+ method_option 'number', aliases: '-n', type: :numeric, default: DEFAULT_NUM_RESULTS, desc: 'Limit the number of results.'
111
+ method_option 'relative_dates', aliases: '-a', type: :boolean, desc: 'Show relative dates.'
112
+ method_option 'reverse', aliases: '-r', type: :boolean, desc: 'Reverse the order of the sort.'
113
113
  def timeline(user_list)
114
114
  owner, list_name = extract_owner(user_list, options)
115
115
  count = options['number'] || DEFAULT_NUM_RESULTS
@@ -120,6 +120,6 @@ module T
120
120
  end
121
121
  print_tweets(tweets)
122
122
  end
123
- map %w[tl] => :timeline
123
+ map %w(tl) => :timeline
124
124
  end
125
125
  end
@@ -104,7 +104,7 @@ module T
104
104
  Kernel.send(element.class.name.to_sym, format[index] % element)
105
105
  end
106
106
  end
107
- print_table(array, :truncate => true)
107
+ print_table(array, truncate: true)
108
108
  else
109
109
  print_table(array)
110
110
  end
@@ -112,15 +112,53 @@ module T
112
112
  end
113
113
 
114
114
  def print_message(from_user, message)
115
+ require 'htmlentities'
116
+
115
117
  case options['color']
118
+ when 'icon'
119
+ print_identicon(from_user, message)
120
+ say
121
+ say
116
122
  when 'auto'
117
123
  say(" @#{from_user}", [:bold, :yellow])
124
+ print_wrapped(HTMLEntities.new.decode(message), indent: 3)
125
+ say
118
126
  else
119
127
  say(" @#{from_user}")
128
+ print_wrapped(HTMLEntities.new.decode(message), indent: 3)
129
+ say
120
130
  end
131
+ end
132
+
133
+ def print_identicon(from_user, message)
121
134
  require 'htmlentities'
122
- print_wrapped(HTMLEntities.new.decode(message), :indent => 3)
123
- say
135
+ require 't/identicon'
136
+ icon = Identicon.for_user_name(from_user)
137
+
138
+ # Save 6 chars for icon, ensure at least 3 lines long
139
+ lines = wrapped(HTMLEntities.new.decode(message), indent: 2, width: terminal_width - (6 + 5))
140
+ lines.unshift(set_color(" @#{from_user}", :bold, :yellow))
141
+ lines.push(*(3 - lines.length).times.map { '' })
142
+
143
+ $stdout.puts lines.zip(icon.lines).map { |x, i| " #{i || ' '}#{x}" }
144
+ end
145
+
146
+ def wrapped(message, options = {})
147
+ indent = options[:indent] || 0
148
+ width = options[:width] || terminal_width - indent
149
+ paras = message.split("\n\n")
150
+
151
+ paras.map! do |unwrapped|
152
+ unwrapped.strip.squeeze(' ').gsub(/.{1,#{width}}(?:\s|\Z)/) { ($& + 5.chr).gsub(/\n\005/, "\n").gsub(/\005/, "\n") }
153
+ end
154
+
155
+ lines = paras.inject([]) do |memo, para|
156
+ memo.concat(para.split("\n").map { |line| line.insert(0, ' ' * indent) })
157
+ memo.push ''
158
+ end
159
+
160
+ lines.pop
161
+ lines
124
162
  end
125
163
 
126
164
  def print_tweets(tweets)
@@ -96,6 +96,16 @@ module T
96
96
  send(:initialize)
97
97
  end
98
98
 
99
+ def delete_profile(profile)
100
+ profiles.delete(profile)
101
+ write
102
+ end
103
+
104
+ def delete_key(profile, key)
105
+ profiles[profile].delete(key)
106
+ write
107
+ end
108
+
99
109
  private
100
110
 
101
111
  def active_profile?
@@ -25,14 +25,14 @@ module T
25
25
  end
26
26
 
27
27
  desc 'all QUERY', "Returns the #{DEFAULT_NUM_RESULTS} most recent Tweets that match the specified query."
28
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
29
- method_option 'decode_uris', :aliases => '-d', :type => :boolean, :desc => 'Decodes t.co URLs into their original form.'
30
- method_option 'long', :aliases => '-l', :type => :boolean, :desc => 'Output in long format.'
31
- method_option 'number', :aliases => '-n', :type => :numeric, :default => DEFAULT_NUM_RESULTS
32
- method_option 'relative_dates', :aliases => '-a', :type => :boolean, :desc => 'Show relative dates.'
28
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
29
+ method_option 'decode_uris', aliases: '-d', type: :boolean, desc: 'Decodes t.co URLs into their original form.'
30
+ method_option 'long', aliases: '-l', type: :boolean, desc: 'Output in long format.'
31
+ method_option 'number', aliases: '-n', type: :numeric, default: DEFAULT_NUM_RESULTS
32
+ method_option 'relative_dates', aliases: '-a', type: :boolean, desc: 'Show relative dates.'
33
33
  def all(query)
34
34
  count = options['number'] || DEFAULT_NUM_RESULTS
35
- opts = {:count => MAX_SEARCH_RESULTS}
35
+ opts = {count: MAX_SEARCH_RESULTS}
36
36
  opts[:include_entities] = !!options['decode_uris']
37
37
  tweets = client.search(query, opts).take(count)
38
38
  tweets.reverse! if options['reverse']
@@ -57,15 +57,15 @@ module T
57
57
  end
58
58
 
59
59
  desc 'favorites [USER] QUERY', "Returns Tweets you've favorited that match the specified query."
60
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
61
- method_option 'decode_uris', :aliases => '-d', :type => :boolean, :desc => 'Decodes t.co URLs into their original form.'
62
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify user via ID instead of screen name.'
63
- method_option 'long', :aliases => '-l', :type => :boolean, :desc => 'Output in long format.'
64
- method_option 'relative_dates', :aliases => '-a', :type => :boolean, :desc => 'Show relative dates.'
60
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
61
+ method_option 'decode_uris', aliases: '-d', type: :boolean, desc: 'Decodes t.co URLs into their original form.'
62
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify user via ID instead of screen name.'
63
+ method_option 'long', aliases: '-l', type: :boolean, desc: 'Output in long format.'
64
+ method_option 'relative_dates', aliases: '-a', type: :boolean, desc: 'Show relative dates.'
65
65
  def favorites(*args)
66
66
  query = args.pop
67
67
  user = args.pop
68
- opts = {:count => MAX_NUM_RESULTS}
68
+ opts = {count: MAX_NUM_RESULTS}
69
69
  opts[:include_entities] = !!options['decode_uris']
70
70
  if user
71
71
  require 't/core_ext/string'
@@ -85,17 +85,17 @@ module T
85
85
  end
86
86
  print_tweets(tweets)
87
87
  end
88
- map %w[faves] => :favorites
88
+ map %w(faves) => :favorites
89
89
 
90
90
  desc 'list [USER/]LIST QUERY', 'Returns Tweets on a list that match the specified query.'
91
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
92
- method_option 'decode_uris', :aliases => '-d', :type => :boolean, :desc => 'Decodes t.co URLs into their original form.'
93
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify user via ID instead of screen name.'
94
- method_option 'long', :aliases => '-l', :type => :boolean, :desc => 'Output in long format.'
95
- method_option 'relative_dates', :aliases => '-a', :type => :boolean, :desc => 'Show relative dates.'
91
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
92
+ method_option 'decode_uris', aliases: '-d', type: :boolean, desc: 'Decodes t.co URLs into their original form.'
93
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify user via ID instead of screen name.'
94
+ method_option 'long', aliases: '-l', type: :boolean, desc: 'Output in long format.'
95
+ method_option 'relative_dates', aliases: '-a', type: :boolean, desc: 'Show relative dates.'
96
96
  def list(user_list, query)
97
97
  owner, list_name = extract_owner(user_list, options)
98
- opts = {:count => MAX_NUM_RESULTS}
98
+ opts = {count: MAX_NUM_RESULTS}
99
99
  opts[:include_entities] = !!options['decode_uris']
100
100
  tweets = collect_with_max_id do |max_id|
101
101
  opts[:max_id] = max_id unless max_id.nil?
@@ -108,12 +108,12 @@ module T
108
108
  end
109
109
 
110
110
  desc 'mentions QUERY', 'Returns Tweets mentioning you that match the specified query.'
111
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
112
- method_option 'decode_uris', :aliases => '-d', :type => :boolean, :desc => 'Decodes t.co URLs into their original form.'
113
- method_option 'long', :aliases => '-l', :type => :boolean, :desc => 'Output in long format.'
114
- method_option 'relative_dates', :aliases => '-a', :type => :boolean, :desc => 'Show relative dates.'
111
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
112
+ method_option 'decode_uris', aliases: '-d', type: :boolean, desc: 'Decodes t.co URLs into their original form.'
113
+ method_option 'long', aliases: '-l', type: :boolean, desc: 'Output in long format.'
114
+ method_option 'relative_dates', aliases: '-a', type: :boolean, desc: 'Show relative dates.'
115
115
  def mentions(query)
116
- opts = {:count => MAX_NUM_RESULTS}
116
+ opts = {count: MAX_NUM_RESULTS}
117
117
  opts[:include_entities] = !!options['decode_uris']
118
118
  tweets = collect_with_max_id do |max_id|
119
119
  opts[:max_id] = max_id unless max_id.nil?
@@ -124,18 +124,18 @@ module T
124
124
  end
125
125
  print_tweets(tweets)
126
126
  end
127
- map %w[replies] => :mentions
127
+ map %w(replies) => :mentions
128
128
 
129
129
  desc 'retweets [USER] QUERY', "Returns Tweets you've retweeted that match the specified query."
130
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
131
- method_option 'decode_uris', :aliases => '-d', :type => :boolean, :desc => 'Decodes t.co URLs into their original form.'
132
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify user via ID instead of screen name.'
133
- method_option 'long', :aliases => '-l', :type => :boolean, :desc => 'Output in long format.'
134
- method_option 'relative_dates', :aliases => '-a', :type => :boolean, :desc => 'Show relative dates.'
130
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
131
+ method_option 'decode_uris', aliases: '-d', type: :boolean, desc: 'Decodes t.co URLs into their original form.'
132
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify user via ID instead of screen name.'
133
+ method_option 'long', aliases: '-l', type: :boolean, desc: 'Output in long format.'
134
+ method_option 'relative_dates', aliases: '-a', type: :boolean, desc: 'Show relative dates.'
135
135
  def retweets(*args)
136
136
  query = args.pop
137
137
  user = args.pop
138
- opts = {:count => MAX_NUM_RESULTS}
138
+ opts = {count: MAX_NUM_RESULTS}
139
139
  opts[:include_entities] = !!options['decode_uris']
140
140
  if user
141
141
  require 't/core_ext/string'
@@ -155,21 +155,21 @@ module T
155
155
  end
156
156
  print_tweets(tweets)
157
157
  end
158
- map %w[rts] => :retweets
158
+ map %w(rts) => :retweets
159
159
 
160
160
  desc 'timeline [USER] QUERY', 'Returns Tweets in your timeline that match the specified query.'
161
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
162
- method_option 'decode_uris', :aliases => '-d', :type => :boolean, :desc => 'Decodes t.co URLs into their original form.'
163
- method_option 'exclude', :aliases => '-e', :type => :string, :enum => %w[replies retweets], :desc => 'Exclude certain types of Tweets from the results.', :banner => 'TYPE'
164
- method_option 'id', :aliases => '-i', :type => :boolean, :desc => 'Specify user via ID instead of screen name.'
165
- method_option 'long', :aliases => '-l', :type => :boolean, :desc => 'Output in long format.'
166
- method_option 'max_id', :aliases => '-m', :type => :numeric, :desc => 'Returns only the results with an ID less than the specified ID.'
167
- method_option 'relative_dates', :aliases => '-a', :type => :boolean, :desc => 'Show relative dates.'
168
- method_option 'since_id', :aliases => '-s', :type => :numeric, :desc => 'Returns only the results with an ID greater than the specified ID.'
161
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
162
+ method_option 'decode_uris', aliases: '-d', type: :boolean, desc: 'Decodes t.co URLs into their original form.'
163
+ method_option 'exclude', aliases: '-e', type: :string, enum: %w(replies retweets), desc: 'Exclude certain types of Tweets from the results.', banner: 'TYPE'
164
+ method_option 'id', aliases: '-i', type: :boolean, desc: 'Specify user via ID instead of screen name.'
165
+ method_option 'long', aliases: '-l', type: :boolean, desc: 'Output in long format.'
166
+ method_option 'max_id', aliases: '-m', type: :numeric, desc: 'Returns only the results with an ID less than the specified ID.'
167
+ method_option 'relative_dates', aliases: '-a', type: :boolean, desc: 'Show relative dates.'
168
+ method_option 'since_id', aliases: '-s', type: :numeric, desc: 'Returns only the results with an ID greater than the specified ID.'
169
169
  def timeline(*args)
170
170
  query = args.pop
171
171
  user = args.pop
172
- opts = {:count => MAX_NUM_RESULTS}
172
+ opts = {count: MAX_NUM_RESULTS}
173
173
  opts[:exclude_replies] = true if options['exclude'] == 'replies'
174
174
  opts[:include_entities] = !!options['decode_uris']
175
175
  opts[:include_rts] = false if options['exclude'] == 'retweets'
@@ -193,18 +193,18 @@ module T
193
193
  end
194
194
  print_tweets(tweets)
195
195
  end
196
- map %w[tl] => :timeline
196
+ map %w(tl) => :timeline
197
197
 
198
198
  desc 'users QUERY', 'Returns users that match the specified query.'
199
- method_option 'csv', :aliases => '-c', :type => :boolean, :desc => 'Output in CSV format.'
200
- method_option 'long', :aliases => '-l', :type => :boolean, :desc => 'Output in long format.'
201
- method_option 'relative_dates', :aliases => '-a', :type => :boolean, :desc => 'Show relative dates.'
202
- method_option 'reverse', :aliases => '-r', :type => :boolean, :desc => 'Reverse the order of the sort.'
203
- method_option 'sort', :aliases => '-s', :type => :string, :enum => %w[favorites followers friends listed screen_name since tweets tweeted], :default => 'screen_name', :desc => 'Specify the order of the results.', :banner => 'ORDER'
204
- method_option 'unsorted', :aliases => '-u', :type => :boolean, :desc => 'Output is not sorted.'
199
+ method_option 'csv', aliases: '-c', type: :boolean, desc: 'Output in CSV format.'
200
+ method_option 'long', aliases: '-l', type: :boolean, desc: 'Output in long format.'
201
+ method_option 'relative_dates', aliases: '-a', type: :boolean, desc: 'Show relative dates.'
202
+ method_option 'reverse', aliases: '-r', type: :boolean, desc: 'Reverse the order of the sort.'
203
+ method_option 'sort', aliases: '-s', type: :string, enum: %w(favorites followers friends listed screen_name since tweets tweeted), default: 'screen_name', desc: 'Specify the order of the results.', banner: 'ORDER'
204
+ method_option 'unsorted', aliases: '-u', type: :boolean, desc: 'Output is not sorted.'
205
205
  def users(query)
206
206
  users = collect_with_page do |page|
207
- client.user_search(query, :page => page)
207
+ client.user_search(query, page: page)
208
208
  end
209
209
  print_users(users)
210
210
  end