t 0.9.7 → 0.9.8
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/t.rb +1 -1
- data/lib/t/authorizable.rb +10 -2
- data/lib/t/cli.rb +92 -28
- data/lib/t/collectable.rb +7 -4
- data/lib/t/delete.rb +13 -6
- data/lib/t/format_helpers.rb +44 -44
- data/lib/t/list.rb +22 -14
- data/lib/t/printable.rb +156 -145
- data/lib/t/rcfile.rb +2 -1
- data/lib/t/requestable.rb +21 -21
- data/lib/t/search.rb +12 -8
- data/lib/t/set.rb +3 -3
- data/lib/t/stream.rb +13 -5
- data/lib/t/version.rb +1 -1
- data/spec/cli_spec.rb +190 -78
- data/spec/fixtures/search.json +111 -1
- data/spec/fixtures/statuses.json +180 -0
- data/spec/format_helpers_spec.rb +96 -0
- data/spec/list_spec.rb +24 -5
- data/spec/search_spec.rb +23 -3
- metadata +4 -2
data/lib/t/delete.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
|
-
require 'retryable'
|
2
|
-
require 't/core_ext/enumerable'
|
3
|
-
require 't/core_ext/string'
|
4
|
-
require 't/rcfile'
|
5
|
-
require 't/requestable'
|
6
1
|
require 'thor'
|
7
2
|
|
8
3
|
module T
|
4
|
+
autoload :RCFile, 't/rcfile'
|
5
|
+
autoload :Requestable, 't/requestable'
|
9
6
|
class Delete < Thor
|
10
7
|
include T::Requestable
|
11
8
|
|
@@ -21,11 +18,15 @@ module T
|
|
21
18
|
method_option "force", :aliases => "-f", :type => :boolean, :default => false
|
22
19
|
def block(user, *users)
|
23
20
|
users.unshift(user)
|
21
|
+
require 't/core_ext/string'
|
24
22
|
if options['id']
|
25
23
|
users.map!(&:to_i)
|
26
24
|
else
|
27
25
|
users.map!(&:strip_ats)
|
28
26
|
end
|
27
|
+
require 't/core_ext/enumerable'
|
28
|
+
require 'retryable'
|
29
|
+
require 'twitter'
|
29
30
|
users = users.threaded_map do |user|
|
30
31
|
retryable(:tries => 3, :on => Twitter::Error::ServerError, :sleep => 0) do
|
31
32
|
client.unblock(user)
|
@@ -41,6 +42,7 @@ module T
|
|
41
42
|
method_option "force", :aliases => "-f", :type => :boolean, :default => false
|
42
43
|
def dm(direct_message_id, *direct_message_ids)
|
43
44
|
direct_message_ids.unshift(direct_message_id)
|
45
|
+
require 't/core_ext/string'
|
44
46
|
direct_message_ids.map!(&:to_i)
|
45
47
|
direct_message_ids.each do |direct_message_id|
|
46
48
|
unless options['force']
|
@@ -57,6 +59,7 @@ module T
|
|
57
59
|
method_option "force", :aliases => "-f", :type => :boolean, :default => false
|
58
60
|
def favorite(status_id, *status_ids)
|
59
61
|
status_ids.unshift(status_id)
|
62
|
+
require 't/core_ext/string'
|
60
63
|
status_ids.map!(&:to_i)
|
61
64
|
status_ids.each do |status_id|
|
62
65
|
unless options['force']
|
@@ -73,7 +76,10 @@ module T
|
|
73
76
|
method_option "force", :aliases => "-f", :type => :boolean, :default => false
|
74
77
|
method_option "id", :aliases => "-i", :type => "boolean", :default => false, :desc => "Specify list via ID instead of slug."
|
75
78
|
def list(list)
|
76
|
-
|
79
|
+
if options['id']
|
80
|
+
require 't/core_ext/string'
|
81
|
+
list = list.to_i
|
82
|
+
end
|
77
83
|
list = client.list(list)
|
78
84
|
unless options['force']
|
79
85
|
return unless yes? "Are you sure you want to permanently delete the list \"#{list.name}\"? [y/N]"
|
@@ -86,6 +92,7 @@ module T
|
|
86
92
|
method_option "force", :aliases => "-f", :type => :boolean, :default => false
|
87
93
|
def status(status_id, *status_ids)
|
88
94
|
status_ids.unshift(status_id)
|
95
|
+
require 't/core_ext/string'
|
89
96
|
status_ids.map!(&:to_i)
|
90
97
|
status_ids.each do |status_id|
|
91
98
|
unless options['force']
|
data/lib/t/format_helpers.rb
CHANGED
@@ -1,61 +1,61 @@
|
|
1
|
-
require 'date'
|
2
|
-
|
3
1
|
module T
|
4
2
|
module FormatHelpers
|
5
|
-
|
3
|
+
private
|
6
4
|
|
7
5
|
# https://github.com/rails/rails/blob/bd8a970/actionpack/lib/action_view/helpers/date_helper.rb
|
8
|
-
def
|
9
|
-
to_time = Time.now
|
6
|
+
def distance_of_time_in_words(from_time, to_time=Time.now)
|
10
7
|
seconds = (to_time - from_time).abs
|
11
|
-
|
12
|
-
|
13
|
-
when 1
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
else
|
22
|
-
fyear = from_time.year
|
23
|
-
fyear += 1 if from_time.month >= 3
|
24
|
-
tyear = to_time.year
|
25
|
-
tyear -= 1 if to_time.month < 3
|
26
|
-
leap_years = (fyear > tyear) ? 0 : (fyear..tyear).count{|x| Date.leap?(x)}
|
27
|
-
minute_offset_for_leap_year = leap_years * 1440
|
28
|
-
minutes_with_offset = minutes - minute_offset_for_leap_year
|
29
|
-
remainder = (minutes_with_offset % 525600)
|
30
|
-
distance_in_years = (minutes_with_offset / 525600)
|
31
|
-
if remainder < 131400
|
32
|
-
pluralize distance_in_years, 'about %d year'
|
33
|
-
elsif remainder < 394200
|
34
|
-
pluralize distance_in_years, 'over %d year'
|
35
|
-
else
|
36
|
-
pluralize distance_in_years + 1, 'almost %d year'
|
8
|
+
minutes = seconds / 60
|
9
|
+
case minutes
|
10
|
+
when 0...1
|
11
|
+
case seconds
|
12
|
+
when 0...1
|
13
|
+
'a split second'
|
14
|
+
when 1...2
|
15
|
+
'a second'
|
16
|
+
when 2...60
|
17
|
+
'%d seconds' % seconds
|
37
18
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
19
|
+
when 1...2
|
20
|
+
'a minute'
|
21
|
+
when 2...60
|
22
|
+
'%d minutes' % minutes
|
23
|
+
when 60...120
|
24
|
+
'an hour'
|
25
|
+
# 120 minutes up to 23.5 hours
|
26
|
+
when 120...1410
|
27
|
+
'%d hours' % (minutes.to_f / 60.0).round
|
28
|
+
# 23.5 hours up to 48 hours
|
29
|
+
when 1410...2880
|
30
|
+
'a day'
|
31
|
+
# 48 hours up to 29.5 days
|
32
|
+
when 2880...42480
|
33
|
+
'%d days' % (minutes.to_f / 1440.0).round
|
34
|
+
# 29.5 days up to 60 days
|
35
|
+
when 42480...86400
|
36
|
+
'a month'
|
37
|
+
# 60 days up to 11.5 months
|
38
|
+
when 86400...503700
|
39
|
+
'%d months' % (minutes.to_f / 43800.0).round
|
40
|
+
# 11.5 months up to 2 years
|
41
|
+
when 503700...1051200
|
42
|
+
'a year'
|
46
43
|
else
|
47
|
-
|
44
|
+
'%d years' % (minutes.to_f / 525600.0).round
|
48
45
|
end
|
49
46
|
end
|
47
|
+
alias :time_ago_in_words :distance_of_time_in_words
|
48
|
+
alias :time_from_now_in_words :distance_of_time_in_words
|
50
49
|
|
51
50
|
def strip_tags(html)
|
52
51
|
html.gsub(/<.+?>/, '')
|
53
52
|
end
|
54
53
|
|
55
|
-
def number_with_delimiter(
|
56
|
-
digits =
|
57
|
-
|
58
|
-
groups.join('
|
54
|
+
def number_with_delimiter(number, delimiter=",")
|
55
|
+
digits = number.to_s.split(//)
|
56
|
+
require 'active_support/core_ext/array/grouping'
|
57
|
+
groups = digits.reverse.in_groups_of(3).map{|g| g.join('')}
|
58
|
+
groups.join(delimiter).reverse
|
59
59
|
end
|
60
60
|
|
61
61
|
end
|
data/lib/t/list.rb
CHANGED
@@ -1,18 +1,11 @@
|
|
1
|
-
require 'active_support/core_ext/array/grouping'
|
2
|
-
require 't/format_helpers'
|
3
|
-
require 'csv'
|
4
|
-
# 'fastercsv' required on Ruby versions < 1.9
|
5
|
-
require 'fastercsv' unless Array.new.respond_to?(:to_csv)
|
6
|
-
require 'retryable'
|
7
|
-
require 't/collectable'
|
8
|
-
require 't/core_ext/enumerable'
|
9
|
-
require 't/core_ext/string'
|
10
|
-
require 't/printable'
|
11
|
-
require 't/rcfile'
|
12
|
-
require 't/requestable'
|
13
1
|
require 'thor'
|
14
2
|
|
15
3
|
module T
|
4
|
+
autoload :Collectable, 't/collectable'
|
5
|
+
autoload :FormatHelpers, 't/format_helpers'
|
6
|
+
autoload :Printable, 't/printable'
|
7
|
+
autoload :RCFile, 't/rcfile'
|
8
|
+
autoload :Requestable, 't/requestable'
|
16
9
|
class List < Thor
|
17
10
|
include T::Collectable
|
18
11
|
include T::Printable
|
@@ -35,11 +28,16 @@ module T
|
|
35
28
|
method_option "id", :aliases => "-i", :type => "boolean", :default => false, :desc => "Specify input as Twitter user IDs instead of screen names."
|
36
29
|
def add(list, user, *users)
|
37
30
|
users.unshift(user)
|
31
|
+
require 't/core_ext/string'
|
38
32
|
if options['id']
|
39
33
|
users.map!(&:to_i)
|
40
34
|
else
|
41
35
|
users.map!(&:strip_ats)
|
42
36
|
end
|
37
|
+
require 'active_support/core_ext/array/grouping'
|
38
|
+
require 't/core_ext/enumerable'
|
39
|
+
require 'retryable'
|
40
|
+
require 'twitter'
|
43
41
|
users.in_groups_of(MAX_USERS_PER_REQUEST, false).threaded_each do |user_id_group|
|
44
42
|
retryable(:tries => 3, :on => Twitter::Error::ServerError, :sleep => 0) do
|
45
43
|
client.list_add_members(list, user_id_group)
|
@@ -57,8 +55,8 @@ module T
|
|
57
55
|
|
58
56
|
desc "create LIST [DESCRIPTION]", "Create a new list."
|
59
57
|
method_option "private", :aliases => "-p", :type => :boolean
|
60
|
-
def create(list, description=
|
61
|
-
opts = description
|
58
|
+
def create(list, description=nil)
|
59
|
+
opts = description ? {:description => description} : {}
|
62
60
|
opts.merge!(:mode => 'private') if options['private']
|
63
61
|
client.list_create(list, opts)
|
64
62
|
say "@#{@rcfile.active_profile[0]} created the list \"#{list}\"."
|
@@ -72,6 +70,7 @@ module T
|
|
72
70
|
list = owner
|
73
71
|
owner = @rcfile.active_profile[0]
|
74
72
|
else
|
73
|
+
require 't/core_ext/string'
|
75
74
|
owner = if options['id']
|
76
75
|
owner.to_i
|
77
76
|
else
|
@@ -80,6 +79,8 @@ module T
|
|
80
79
|
end
|
81
80
|
list = client.list(owner, list)
|
82
81
|
if options['csv']
|
82
|
+
require 'csv'
|
83
|
+
require 'fastercsv' unless Array.new.respond_to?(:to_csv)
|
83
84
|
say ["ID", "Description", "Slug", "Screen name", "Created at", "Members", "Subscribers", "Following", "Mode", "URL"].to_csv
|
84
85
|
say [list.id, list.description, list.slug, list.user.screen_name, csv_formatted_time(list), list.member_count, list.subscriber_count, list.following?, list.mode, "https://twitter.com#{list.uri}"].to_csv
|
85
86
|
else
|
@@ -117,6 +118,7 @@ module T
|
|
117
118
|
list = owner
|
118
119
|
owner = @rcfile.active_profile[0]
|
119
120
|
else
|
121
|
+
require 't/core_ext/string'
|
120
122
|
owner = if options['id']
|
121
123
|
owner.to_i
|
122
124
|
else
|
@@ -133,11 +135,16 @@ module T
|
|
133
135
|
method_option "id", :aliases => "-i", :type => "boolean", :default => false, :desc => "Specify input as Twitter user IDs instead of screen names."
|
134
136
|
def remove(list, user, *users)
|
135
137
|
users.unshift(user)
|
138
|
+
require 't/core_ext/string'
|
136
139
|
if options['id']
|
137
140
|
users.map!(&:to_i)
|
138
141
|
else
|
139
142
|
users.map!(&:strip_ats)
|
140
143
|
end
|
144
|
+
require 'active_support/core_ext/array/grouping'
|
145
|
+
require 't/core_ext/enumerable'
|
146
|
+
require 'retryable'
|
147
|
+
require 'twitter'
|
141
148
|
users.in_groups_of(MAX_USERS_PER_REQUEST, false).threaded_each do |user_id_group|
|
142
149
|
retryable(:tries => 3, :on => Twitter::Error::ServerError, :sleep => 0) do
|
143
150
|
client.list_remove_members(list, user_id_group)
|
@@ -165,6 +172,7 @@ module T
|
|
165
172
|
list = owner
|
166
173
|
owner = @rcfile.active_profile[0]
|
167
174
|
else
|
175
|
+
require 't/core_ext/string'
|
168
176
|
owner = if options['id']
|
169
177
|
owner.to_i
|
170
178
|
else
|
data/lib/t/printable.rb
CHANGED
@@ -1,11 +1,3 @@
|
|
1
|
-
require 'csv'
|
2
|
-
# 'fastercsv' required on Ruby versions < 1.9
|
3
|
-
require 'fastercsv' unless Array.new.respond_to?(:to_csv)
|
4
|
-
require 'htmlentities'
|
5
|
-
require 't/core_ext/kernel'
|
6
|
-
require 'thor/shell/color'
|
7
|
-
require 'time'
|
8
|
-
|
9
1
|
module T
|
10
2
|
module Printable
|
11
3
|
MAX_SCREEN_NAME_SIZE = 20
|
@@ -13,160 +5,179 @@ module T
|
|
13
5
|
STATUS_HEADINGS = ["ID", "Posted at", "Screen name", "Text"]
|
14
6
|
USER_HEADINGS = ["ID", "Since", "Tweets", "Favorites", "Listed", "Following", "Followers", "Screen name", "Name"]
|
15
7
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
8
|
+
private
|
9
|
+
|
10
|
+
def build_long_list(list)
|
11
|
+
[list.id, ls_formatted_time(list), "@#{list.user.screen_name}", list.slug, list.member_count, list.subscriber_count, list.mode, list.description]
|
12
|
+
end
|
13
|
+
|
14
|
+
def build_long_status(status)
|
15
|
+
require 'htmlentities'
|
16
|
+
[status.id, ls_formatted_time(status), "@#{status.from_user}", HTMLEntities.new.decode(status.full_text).gsub(/\n+/, ' ')]
|
17
|
+
end
|
18
|
+
|
19
|
+
def build_long_user(user)
|
20
|
+
[user.id, ls_formatted_time(user), user.statuses_count, user.favourites_count, user.listed_count, user.friends_count, user.followers_count, "@#{user.screen_name}", user.name]
|
21
|
+
end
|
22
|
+
|
23
|
+
def csv_formatted_time(object, key=:created_at)
|
24
|
+
time = object.send(key.to_sym)
|
25
|
+
time.utc.strftime("%Y-%m-%d %H:%M:%S %z")
|
26
|
+
end
|
27
|
+
|
28
|
+
def ls_formatted_time(object, key=:created_at)
|
29
|
+
time = T.local_time(object.send(key.to_sym))
|
30
|
+
require 'active_support/core_ext/date/calculations'
|
31
|
+
require 'active_support/core_ext/integer/time'
|
32
|
+
require 'active_support/core_ext/numeric/time'
|
33
|
+
if time > 6.months.ago
|
34
|
+
time.strftime("%b %e %H:%M")
|
35
|
+
else
|
36
|
+
time.strftime("%b %e %Y")
|
20
37
|
end
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
38
|
+
end
|
39
|
+
|
40
|
+
def print_csv_list(list)
|
41
|
+
require 'csv'
|
42
|
+
require 'fastercsv' unless Array.new.respond_to?(:to_csv)
|
43
|
+
say [list.id, csv_formatted_time(list), list.user.screen_name, list.slug, list.member_count, list.subscriber_count, list.mode, list.description].to_csv
|
44
|
+
end
|
45
|
+
|
46
|
+
def print_csv_status(status)
|
47
|
+
require 'csv'
|
48
|
+
require 'fastercsv' unless Array.new.respond_to?(:to_csv)
|
49
|
+
require 'htmlentities'
|
50
|
+
say [status.id, csv_formatted_time(status), status.from_user, HTMLEntities.new.decode(status.full_text)].to_csv
|
51
|
+
end
|
52
|
+
|
53
|
+
def print_csv_user(user)
|
54
|
+
require 'csv'
|
55
|
+
require 'fastercsv' unless Array.new.respond_to?(:to_csv)
|
56
|
+
say [user.id, csv_formatted_time(user), user.statuses_count, user.favourites_count, user.listed_count, user.friends_count, user.followers_count, user.screen_name, user.name].to_csv
|
57
|
+
end
|
58
|
+
|
59
|
+
def print_lists(lists)
|
60
|
+
lists = lists.sort_by{|list| list.slug.downcase} unless options['unsorted']
|
61
|
+
if options['posted']
|
62
|
+
lists = lists.sort_by{|user| user.created_at}
|
63
|
+
elsif options['members']
|
64
|
+
lists = lists.sort_by{|user| user.member_count}
|
65
|
+
elsif options['mode']
|
66
|
+
lists = lists.sort_by{|user| user.mode}
|
67
|
+
elsif options['subscribers']
|
68
|
+
lists = lists.sort_by{|user| user.subscriber_count}
|
28
69
|
end
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
time = T.local_time object.send(key.to_sym)
|
37
|
-
if time > 6.months.ago
|
38
|
-
time.strftime("%b %e %H:%M")
|
39
|
-
else
|
40
|
-
time.strftime("%b %e %Y")
|
70
|
+
lists.reverse! if options['reverse']
|
71
|
+
if options['csv']
|
72
|
+
require 'csv'
|
73
|
+
require 'fastercsv' unless Array.new.respond_to?(:to_csv)
|
74
|
+
say LIST_HEADINGS.to_csv unless lists.empty?
|
75
|
+
lists.each do |list|
|
76
|
+
print_csv_list(list)
|
41
77
|
end
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
say [list.id, csv_formatted_time(list), list.user.screen_name, list.slug, list.member_count, list.subscriber_count, list.mode, list.description].to_csv
|
46
|
-
end
|
47
|
-
|
48
|
-
def print_csv_status(status)
|
49
|
-
say [status.id, csv_formatted_time(status), status.from_user, HTMLEntities.new.decode(status.full_text)].to_csv
|
50
|
-
end
|
51
|
-
|
52
|
-
def print_csv_user(user)
|
53
|
-
say [user.id, csv_formatted_time(user), user.statuses_count, user.favourites_count, user.listed_count, user.friends_count, user.followers_count, user.screen_name, user.name].to_csv
|
54
|
-
end
|
55
|
-
|
56
|
-
def print_lists(lists)
|
57
|
-
lists = lists.sort_by{|list| list.slug.downcase} unless options['unsorted']
|
58
|
-
if options['posted']
|
59
|
-
lists = lists.sort_by{|user| user.created_at}
|
60
|
-
elsif options['members']
|
61
|
-
lists = lists.sort_by{|user| user.member_count}
|
62
|
-
elsif options['mode']
|
63
|
-
lists = lists.sort_by{|user| user.mode}
|
64
|
-
elsif options['subscribers']
|
65
|
-
lists = lists.sort_by{|user| user.subscriber_count}
|
66
|
-
end
|
67
|
-
lists.reverse! if options['reverse']
|
68
|
-
if options['csv']
|
69
|
-
say LIST_HEADINGS.to_csv unless lists.empty?
|
70
|
-
lists.each do |list|
|
71
|
-
print_csv_list(list)
|
72
|
-
end
|
73
|
-
elsif options['long']
|
74
|
-
array = lists.map do |list|
|
75
|
-
build_long_list(list)
|
76
|
-
end
|
77
|
-
format = options['format'] || LIST_HEADINGS.size.times.map{"%s"}
|
78
|
-
print_table_with_headings(array, LIST_HEADINGS, format)
|
79
|
-
else
|
80
|
-
print_attribute(lists, :full_name)
|
78
|
+
elsif options['long']
|
79
|
+
array = lists.map do |list|
|
80
|
+
build_long_list(list)
|
81
81
|
end
|
82
|
+
format = options['format'] || LIST_HEADINGS.size.times.map{"%s"}
|
83
|
+
print_table_with_headings(array, LIST_HEADINGS, format)
|
84
|
+
else
|
85
|
+
print_attribute(lists, :full_name)
|
82
86
|
end
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
87
|
+
end
|
88
|
+
|
89
|
+
def print_attribute(array, attribute)
|
90
|
+
if STDOUT.tty?
|
91
|
+
print_in_columns(array.map(&attribute.to_sym))
|
92
|
+
else
|
93
|
+
array.each do |element|
|
94
|
+
say element.send(attribute.to_sym)
|
91
95
|
end
|
92
96
|
end
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
97
|
+
end
|
98
|
+
|
99
|
+
def print_table_with_headings(array, headings, format)
|
100
|
+
return if array.flatten.empty?
|
101
|
+
if STDOUT.tty?
|
102
|
+
array.unshift(headings)
|
103
|
+
require 't/core_ext/kernel'
|
104
|
+
array.map! do |row|
|
105
|
+
row.each_with_index.map do |element, index|
|
106
|
+
Kernel.send(element.class.name.to_sym, format[index] % element)
|
102
107
|
end
|
103
|
-
print_table(array, :truncate => true)
|
104
|
-
else
|
105
|
-
print_table(array)
|
106
108
|
end
|
109
|
+
print_table(array, :truncate => true)
|
110
|
+
else
|
111
|
+
print_table(array)
|
107
112
|
end
|
113
|
+
end
|
108
114
|
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
end
|
115
|
-
print_wrapped(HTMLEntities.new.decode(status.full_text), :indent => 3)
|
116
|
-
say
|
115
|
+
def print_status(status)
|
116
|
+
if STDOUT.tty? && !options['no-color']
|
117
|
+
say(" @#{status.from_user}", [:bold, :yellow])
|
118
|
+
else
|
119
|
+
say(" @#{status.from_user}")
|
117
120
|
end
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
121
|
+
require 'htmlentities'
|
122
|
+
print_wrapped(HTMLEntities.new.decode(status.full_text), :indent => 3)
|
123
|
+
say
|
124
|
+
end
|
125
|
+
|
126
|
+
def print_statuses(statuses)
|
127
|
+
statuses.reverse! if options['reverse'] || options['stream']
|
128
|
+
if options['csv']
|
129
|
+
require 'csv'
|
130
|
+
require 'fastercsv' unless Array.new.respond_to?(:to_csv)
|
131
|
+
say STATUS_HEADINGS.to_csv unless statuses.empty?
|
132
|
+
statuses.each do |status|
|
133
|
+
print_csv_status(status)
|
134
|
+
end
|
135
|
+
elsif options['long']
|
136
|
+
array = statuses.map do |status|
|
137
|
+
build_long_status(status)
|
138
|
+
end
|
139
|
+
format = options['format'] || STATUS_HEADINGS.size.times.map{"%s"}
|
140
|
+
print_table_with_headings(array, STATUS_HEADINGS, format)
|
141
|
+
else
|
142
|
+
statuses.each do |status|
|
143
|
+
print_status(status)
|
136
144
|
end
|
137
145
|
end
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
146
|
+
end
|
147
|
+
|
148
|
+
def print_users(users)
|
149
|
+
users = users.sort_by{|user| user.screen_name.downcase} unless options['unsorted']
|
150
|
+
if options['posted']
|
151
|
+
users = users.sort_by{|user| user.created_at}
|
152
|
+
elsif options['favorites']
|
153
|
+
users = users.sort_by{|user| user.favourites_count}
|
154
|
+
elsif options['followers']
|
155
|
+
users = users.sort_by{|user| user.followers_count}
|
156
|
+
elsif options['friends']
|
157
|
+
users = users.sort_by{|user| user.friends_count}
|
158
|
+
elsif options['listed']
|
159
|
+
users = users.sort_by{|user| user.listed_count}
|
160
|
+
elsif options['tweets']
|
161
|
+
users = users.sort_by{|user| user.statuses_count}
|
162
|
+
end
|
163
|
+
users.reverse! if options['reverse']
|
164
|
+
if options['csv']
|
165
|
+
require 'csv'
|
166
|
+
require 'fastercsv' unless Array.new.respond_to?(:to_csv)
|
167
|
+
say USER_HEADINGS.to_csv unless users.empty?
|
168
|
+
users.each do |user|
|
169
|
+
print_csv_user(user)
|
153
170
|
end
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
users.each do |user|
|
158
|
-
print_csv_user(user)
|
159
|
-
end
|
160
|
-
elsif options['long']
|
161
|
-
array = users.map do |user|
|
162
|
-
build_long_user(user)
|
163
|
-
end
|
164
|
-
format = options['format'] || USER_HEADINGS.size.times.map{"%s"}
|
165
|
-
print_table_with_headings(array, USER_HEADINGS, format)
|
166
|
-
else
|
167
|
-
print_attribute(users, :screen_name)
|
171
|
+
elsif options['long']
|
172
|
+
array = users.map do |user|
|
173
|
+
build_long_user(user)
|
168
174
|
end
|
175
|
+
format = options['format'] || USER_HEADINGS.size.times.map{"%s"}
|
176
|
+
print_table_with_headings(array, USER_HEADINGS, format)
|
177
|
+
else
|
178
|
+
print_attribute(users, :screen_name)
|
169
179
|
end
|
180
|
+
end
|
170
181
|
|
171
182
|
end
|
172
183
|
end
|