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.
@@ -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
- list = list.to_i if options['id']
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']
@@ -1,61 +1,61 @@
1
- require 'date'
2
-
3
1
  module T
4
2
  module FormatHelpers
5
- private
3
+ private
6
4
 
7
5
  # https://github.com/rails/rails/blob/bd8a970/actionpack/lib/action_view/helpers/date_helper.rb
8
- def distance_of_time_in_words_to_now(from_time)
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
- case (minutes = seconds / 60)
12
- when 0 then 'less than a minute'
13
- when 1 then '1 minute'
14
- when 2..44 then '%d minutes' % minutes
15
- when 45..89 then 'about 1 hour'
16
- when 90..1439 then 'about %d hours' % (minutes.to_f / 60.0).round
17
- when 1440..2519 then '1 day'
18
- when 2520..43199 then '%d days' % (minutes.to_f / 1440.0).round
19
- when 43200..86399 then 'about 1 month'
20
- when 86400..525599 then '%d months' % (minutes.to_f / 43200.0).round
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
- end
39
- end
40
- alias time_ago_in_words distance_of_time_in_words_to_now
41
-
42
- def pluralize(count, word)
43
- word += 's' if count.to_i > 1
44
- if word.include? '%'
45
- word % count
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
- "%d #{word}" % count
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(num)
56
- digits = num.to_s.split(//)
57
- groups = digits.reverse.in_groups_of(3).map {|g| g.join('') }
58
- groups.join(',').reverse
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
@@ -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.blank? ? {} : {:description => 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
@@ -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
- private
17
-
18
- def build_long_list(list)
19
- [list.id, ls_formatted_time(list), "@#{list.user.screen_name}", list.slug, list.member_count, list.subscriber_count, list.mode, list.description]
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
- def build_long_status(status)
23
- [status.id, ls_formatted_time(status), "@#{status.from_user}", HTMLEntities.new.decode(status.full_text).gsub(/\n+/, ' ')]
24
- end
25
-
26
- def build_long_user(user)
27
- [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]
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
- def csv_formatted_time(object, key=:created_at)
31
- time = object.send(key.to_sym)
32
- time.utc.strftime("%Y-%m-%d %H:%M:%S %z")
33
- end
34
-
35
- def ls_formatted_time(object, key=:created_at)
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
- end
43
-
44
- def print_csv_list(list)
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
- def print_attribute(array, attribute)
85
- if STDOUT.tty?
86
- print_in_columns(array.map(&attribute.to_sym))
87
- else
88
- array.each do |element|
89
- say element.send(attribute.to_sym)
90
- end
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
- def print_table_with_headings(array, headings, format)
95
- return if array.flatten.empty?
96
- if STDOUT.tty?
97
- array.unshift(headings)
98
- array.map! do |row|
99
- row.each_with_index.map do |element, index|
100
- Kernel.send(element.class.name.to_sym, format[index] % element)
101
- end
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
- def print_status(status)
110
- if STDOUT.tty? && !options['no-color']
111
- say(" @#{status.from_user}", [:bold, :yellow])
112
- else
113
- say(" @#{status.from_user}")
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
- def print_statuses(statuses)
120
- statuses.reverse! if options['reverse'] || options['stream']
121
- if options['csv']
122
- say STATUS_HEADINGS.to_csv unless statuses.empty?
123
- statuses.each do |status|
124
- print_csv_status(status)
125
- end
126
- elsif options['long']
127
- array = statuses.map do |status|
128
- build_long_status(status)
129
- end
130
- format = options['format'] || STATUS_HEADINGS.size.times.map{"%s"}
131
- print_table_with_headings(array, STATUS_HEADINGS, format)
132
- else
133
- statuses.each do |status|
134
- print_status(status)
135
- end
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
- def print_users(users)
140
- users = users.sort_by{|user| user.screen_name.downcase} unless options['unsorted']
141
- if options['posted']
142
- users = users.sort_by{|user| user.created_at}
143
- elsif options['favorites']
144
- users = users.sort_by{|user| user.favourites_count}
145
- elsif options['followers']
146
- users = users.sort_by{|user| user.followers_count}
147
- elsif options['friends']
148
- users = users.sort_by{|user| user.friends_count}
149
- elsif options['listed']
150
- users = users.sort_by{|user| user.listed_count}
151
- elsif options['tweets']
152
- users = users.sort_by{|user| user.statuses_count}
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
- users.reverse! if options['reverse']
155
- if options['csv']
156
- say USER_HEADINGS.to_csv unless users.empty?
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