t 0.9.7 → 0.9.8
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/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
|