t 0.9.7 → 0.9.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -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