colorls 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf8682c25dbecfcc9ceaac1d2c7f795327e9d463
4
- data.tar.gz: 17073384fc2d7c650e745c33690de0a967e011b0
3
+ metadata.gz: 4985c3a5528c2e34ab5e8ccac1efbbd139e5d5a1
4
+ data.tar.gz: b54dc73e35b4d524b648c1348222dce052175b09
5
5
  SHA512:
6
- metadata.gz: dd9f01a4a4366534770b5285e020e32e749392889a12442ac05904c4f6ab76b5913c8518bdd816bec2e2398796258e2225e71ed9a7f1685ca62892e2e82a768c
7
- data.tar.gz: 863c44d9919e67f56552f8cdb5825ac41edb05902236737dfd8e3f711b9eeaed44e2e84940610ee718b71619aac5aeca1d58cb15057ab57763c0cf58c9c76d61
6
+ metadata.gz: 6ee0668a87a81f540e2e828a3f01e43f05180d16a9447b92d6eb65c14e9f0cd7afe1c23b6d1ac3a918748b2f8a9e5e11f5a51e7e9777ce9e80a572b315e01234
7
+ data.tar.gz: 5859c0c78a18285d9cbea49b4197d1173cfb1dbf3cfc452a4455d53d5b04ba311e057dc2776120f2a715c888d59be2b13b750280d07f7bb0d975bdeb236b6874
@@ -12,16 +12,21 @@ script:
12
12
  - bundle exec rspec
13
13
  - rake install
14
14
  - colorls
15
+ - colorls -1
15
16
  - colorls -a
17
+ - colorls -A
16
18
  - colorls -d
17
19
  - colorls -f
20
+ - colorls -l
21
+ - colorls -l spec/fixtures/symlinks
22
+ - colorls -r
18
23
  - colorls -sd
19
24
  - colorls -sf
20
- - colorls -1
21
- - colorls -r
22
- - colorls -l
25
+ - colorls -t
26
+ - colorls spec/fixtures/symlinks
23
27
  - colorls README.md
24
28
  - colorls *
29
+ - colorls | grep /
25
30
 
26
31
  install:
27
32
  - gem install bundler
@@ -1,58 +1,70 @@
1
1
  module ColorLS
2
2
  class Core
3
3
  def initialize(input=nil, all: false, report: false, sort: false, show: false,
4
- one_per_line: false, long: false)
4
+ one_per_line: false, long: false, almost_all: false, tree: false)
5
5
  @input = input || Dir.pwd
6
6
  @count = {folders: 0, recognized_files: 0, unrecognized_files: 0}
7
7
  @all = all
8
+ @almost_all = almost_all
8
9
  @report = report
9
10
  @sort = sort
10
11
  @show = show
11
12
  @one_per_line = one_per_line
12
13
  @long = long
14
+ @tree = tree
13
15
  @screen_width = ::TermInfo.screen_size.last
14
16
 
15
- init_contents
17
+ @contents = init_contents(@input)
16
18
  @max_widths = @contents.map(&:length)
17
19
  init_icons
18
20
  end
19
21
 
20
22
  def ls
21
- if @contents.empty?
22
- print "Nothing to show here\n".colorize(:yellow)
23
+ return print "\n Nothing to show here\n".colorize(:yellow) if @contents.empty?
24
+
25
+ if @tree
26
+ print "\n"
27
+ tree_traverse(@input, 0, 2)
23
28
  else
24
29
  @contents = chunkify
25
30
  @max_widths = @contents.transpose.map { |c| c.map(&:length).max }
26
31
  @contents.each { |chunk| ls_line(chunk) }
27
- print "\n"
28
- display_report if @report
29
32
  end
33
+ print "\n"
34
+ display_report if @report
30
35
 
31
36
  true
32
37
  end
33
38
 
34
39
  private
35
40
 
36
- def init_contents
37
- @contents = if Dir.exist?(@input)
38
- Dir.entries(@input) - %w[. ..]
41
+ def init_contents(path)
42
+ @contents = if Dir.exist?(path)
43
+ Dir.entries(path)
39
44
  else
40
- [@input]
45
+ [path]
41
46
  end
42
47
 
43
- @contents.keep_if { |x| !x.start_with? '.' } unless @all
44
- filter_contents if @show
45
- sort_contents if @sort
48
+ filter_hidden_contents
49
+ filter_contents(path) if @show
50
+ sort_contents(path) if @sort
46
51
 
47
52
  @total_content_length = @contents.length
48
53
 
49
- return unless @long
54
+ return @contents unless @long
50
55
  init_user_lengths
51
56
  init_group_lengths
57
+ @contents
58
+ end
59
+
60
+ def filter_hidden_contents
61
+ @contents -= %w[. ..] unless @all
62
+ @contents.keep_if { |x| !x.start_with? '.' } unless @all || @almost_all
52
63
  end
53
64
 
54
65
  def init_user_lengths
55
66
  @userlength = @contents.map do |c|
67
+ next 0 unless File.exist?("#{@input}/#{c}")
56
68
  begin
57
69
  user = Etc.getpwuid(File.stat("#{@input}/#{c}").uid).name
58
70
  rescue ArgumentError
@@ -64,6 +76,7 @@ module ColorLS
64
76
 
65
77
  def init_group_lengths
66
78
  @grouplength = @contents.map do |c|
79
+ next 0 unless File.exist?("#{@input}/#{c}")
67
80
  begin
68
81
  group = Etc.getgrgid(File.stat("#{@input}/#{c}").gid).name
69
82
  rescue ArgumentError
@@ -73,20 +86,20 @@ module ColorLS
73
86
  end.max
74
87
  end
75
88
 
76
- def filter_contents
89
+ def filter_contents(path)
77
90
  @contents.keep_if do |x|
78
- next Dir.exist?("#{@input}/#{x}") if @show == :dirs
79
- !Dir.exist?("#{@input}/#{x}")
91
+ next Dir.exist?("#{path}/#{x}") if @show == :dirs
92
+ !Dir.exist?("#{path}/#{x}")
80
93
  end
81
94
  end
82
95
 
83
- def sort_contents
84
- @contents.sort! { |a, b| cmp_by_dirs(a, b) }
96
+ def sort_contents(path)
97
+ @contents.sort! { |a, b| cmp_by_dirs(path, a, b) }
85
98
  end
86
99
 
87
- def cmp_by_dirs(a, b)
88
- is_a_dir = Dir.exist?("#{@input}/#{a}")
89
- is_b_dir = Dir.exist?("#{@input}/#{b}")
100
+ def cmp_by_dirs(path, a, b)
101
+ is_a_dir = Dir.exist?("#{path}/#{a}")
102
+ is_b_dir = Dir.exist?("#{path}/#{b}")
90
103
 
91
104
  return cmp_by_alpha(a, b) unless is_a_dir ^ is_b_dir
92
105
 
@@ -135,7 +148,7 @@ module ColorLS
135
148
  end
136
149
 
137
150
  def in_line(chunk_size)
138
- return false if @max_widths.sum + 6 * chunk_size > @screen_width
151
+ return false if @max_widths.sum + 7 * chunk_size > @screen_width
139
152
  true
140
153
  end
141
154
 
@@ -199,8 +212,25 @@ module ColorLS
199
212
  end
200
213
 
201
214
  def long_info(content)
215
+ return '' unless @long
216
+ unless File.exist?("#{@input}/#{content}")
217
+ return '[No Info]'.colorize(:red) + ' ' * (39 + @userlength + @grouplength)
218
+ end
202
219
  stat = File.stat("#{@input}/#{content}")
203
- "#{mode_info(stat)} #{user_info(stat)} #{group_info(stat)} #{size_info(stat)} #{mtime_info(stat)} "
220
+ [mode_info(stat), user_info(stat), group_info(stat), size_info(stat), mtime_info(stat)].join(' ')
221
+ end
222
+
223
+ def symlink_info(content)
224
+ return '' unless @long && File.lstat("#{@input}/#{content}").symlink?
225
+ if File.exist?("#{@input}/#{content}")
226
+ " ⇒ #{File.readlink("#{@input}/#{content}")}/".colorize(:cyan)
227
+ else
228
+ ' ⇒ [Dead link]'.colorize(:red)
229
+ end
230
+ end
231
+
232
+ def slash?(content)
233
+ Dir.exist?("#{@input}/#{content}") ? '/'.colorize(:blue) : ' '
204
234
  end
205
235
 
206
236
  def fetch_string(content, key, color, increment)
@@ -208,7 +238,11 @@ module ColorLS
208
238
  value = increment == :folders ? @folders[key] : @files[key]
209
239
  logo = value.gsub(/\\u[\da-f]{4}/i) { |m| [m[-4..-1].to_i(16)].pack('U') }
210
240
 
211
- "#{@long ? long_info(content) : ''} #{logo.colorize(color)} #{content.colorize(color)}"
241
+ [
242
+ long_info(content),
243
+ logo.colorize(color),
244
+ "#{content.colorize(color)}#{slash?(content)}#{symlink_info(content)}"
245
+ ].join(' ')
212
246
  end
213
247
 
214
248
  def load_from_yaml(filename, aliase=false)
@@ -226,14 +260,13 @@ module ColorLS
226
260
  chunk.each_with_index do |content, i|
227
261
  break if content.empty?
228
262
 
229
- print " #{fetch_string(content, *options(content))}"
230
- print Dir.exist?("#{@input}/#{content}") ? '/'.colorize(:blue) : ' '
231
- print ' ' * (@max_widths[i] - content.length)
263
+ print " #{fetch_string(content, *options(@input, content))}"
264
+ print ' ' * (@max_widths[i] - content.length) unless @one_per_line || @long
232
265
  end
233
266
  end
234
267
 
235
- def options(content)
236
- if Dir.exist?("#{@input}/#{content}")
268
+ def options(path, content)
269
+ if Dir.exist?("#{path}/#{content}")
237
270
  key = content.to_sym
238
271
  return %i[folder blue folders] unless @all_folders.include?(key)
239
272
  key = @folder_aliases[key] unless @folder_keys.include?(key)
@@ -251,5 +284,21 @@ module ColorLS
251
284
  key = @file_aliases[key] unless @file_keys.include?(key)
252
285
  [key, :green, :recognized_files]
253
286
  end
287
+
288
+ def tree_traverse(path, prespace, indent)
289
+ contents = init_contents(path)
290
+ contents.each do |content|
291
+ icon = content == contents.last || Dir.exist?("#{path}/#{content}") ? ' └──' : ' ├──'
292
+ print tree_branch_preprint(prespace, indent, icon).colorize(:cyan)
293
+ print " #{fetch_string(content, *options(path, content))} \n"
294
+ next unless Dir.exist? "#{path}/#{content}"
295
+ tree_traverse("#{path}/#{content}", prespace + indent, indent)
296
+ end
297
+ end
298
+
299
+ def tree_branch_preprint(prespace, indent, prespace_icon)
300
+ return prespace_icon if prespace.zero?
301
+ ' │ ' * (prespace/indent) + prespace_icon + '─' * indent
302
+ end
254
303
  end
255
304
  end
@@ -6,21 +6,24 @@ module ColorLS
6
6
  show: fetch_show_opts,
7
7
  sort: fetch_sort_opts,
8
8
  all: flag_given?(%w[-a --all]),
9
+ almost_all: flag_given?(%w[-A --almost-all]),
9
10
  report: flag_given?(%w[-r --report]),
10
- one_per_line: flag_given?(%w[-1]),
11
- long: flag_given?(%w[-l --long])
11
+ one_per_line: flag_given?(%w[-1]) || !STDOUT.tty?,
12
+ long: flag_given?(%w[-l --long]),
13
+ tree: flag_given?(%w[-t --tree])
12
14
  }
13
15
 
14
- return if @opts[:show].nil? || @opts[:sort].nil?
15
-
16
16
  @args.keep_if { |arg| !arg.start_with?('-') }
17
17
  end
18
18
 
19
19
  def process
20
+ incompatible = report_incompatible_flags
21
+ return STDERR.puts "\n #{incompatible}".colorize(:red) if incompatible
22
+
20
23
  return Core.new(@opts).ls if @args.empty?
21
24
 
22
25
  @args.each do |path|
23
- next STDERR.puts "\n Specified path '#{path}' doesn't exist.".colorize(:red) unless File.exist?(path)
26
+ next STDERR.puts "\n Specified path '#{path}' doesn't exist.".colorize(:red) unless File.exist?(path)
24
27
  Core.new(path, @opts).ls
25
28
  end
26
29
  end
@@ -37,7 +40,7 @@ module ColorLS
37
40
  show_files_only = flag_given? %w[-f --files]
38
41
 
39
42
  if show_files_only && show_dirs_only
40
- STDERR.puts "\n Restrain from using -d and -f flags together."
43
+ STDERR.puts "\n Restrain from using -d and -f flags together."
41
44
  .colorize(:red)
42
45
  return nil
43
46
  else
@@ -52,7 +55,7 @@ module ColorLS
52
55
  sort_files_first = flag_given? %w[-sf --sort-files]
53
56
 
54
57
  if sort_dirs_first && sort_files_first
55
- STDERR.puts "\n Restrain from using -sd and -sf flags together."
58
+ STDERR.puts "\n Restrain from using -sd and -sf flags together."
56
59
  .colorize(:red)
57
60
  return nil
58
61
  else
@@ -61,5 +64,15 @@ module ColorLS
61
64
  false
62
65
  end
63
66
  end
67
+
68
+ def report_incompatible_flags
69
+ return '' if @opts[:show].nil? || @opts[:sort].nil?
70
+
71
+ return 'Restrain from using -t (--tree) and -r (--report) flags together.' if @opts[:tree] && @opts[:report]
72
+
73
+ return 'Restrain from using -t (--tree) and -a (--all) flags together.' if @opts[:tree] && @opts[:all]
74
+
75
+ nil
76
+ end
64
77
  end
65
78
  end
@@ -1,3 +1,3 @@
1
1
  module ColorLS
2
- VERSION = '0.1.5'.freeze
2
+ VERSION = '0.1.6'.freeze
3
3
  end
@@ -59,5 +59,6 @@ vim: "\ue62b"
59
59
  windows: "\uf17a"
60
60
  xls: "\uf1c3"
61
61
  xml: "\ue619"
62
+ yarn.lock: "\ue718"
62
63
  yml: "\uf481"
63
64
  zip: "\uf410"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: colorls
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Athitya Kumar
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-07-10 00:00:00.000000000 Z
11
+ date: 2017-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize