colorls 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/colorls.rb +1 -0
- data/lib/colorls/core.rb +55 -65
- data/lib/colorls/flags.rb +25 -5
- data/lib/colorls/load_from_yaml.rb +11 -0
- data/lib/colorls/version.rb +1 -1
- data/lib/yaml/dark_colors.yaml +26 -0
- data/lib/yaml/light_colors.yaml +26 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1466b9e0c4a5e7e722f61b3bc23c72393c84b209
|
4
|
+
data.tar.gz: 2e7fb89508e0e73a5ebf2c895d9054bb2961ea91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e9549e3bb540525c3b7118eae86ac2b77bd4d325e5c0e1764866cc82274ffc80010b997b0996c9173f9b921afdbd4afcf1c364e0e67ccee3ec77161db1b43d4
|
7
|
+
data.tar.gz: f8f3c48565b330c01dd075b8a1a9e056913d7d1079c196aa7adf350645c8d0fd9fc80264f3393d7334c212f8f168535cc6f8aba22ef332e1005b5cae7357a534
|
data/lib/colorls.rb
CHANGED
data/lib/colorls/core.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
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, almost_all: false, tree: false)
|
4
|
+
one_per_line: false, long: false, almost_all: false, tree: false, colors: [])
|
5
5
|
@input = input || Dir.pwd
|
6
6
|
@count = {folders: 0, recognized_files: 0, unrecognized_files: 0}
|
7
7
|
@all = all
|
@@ -13,6 +13,7 @@ module ColorLS
|
|
13
13
|
@long = long
|
14
14
|
@tree = tree
|
15
15
|
@screen_width = ::TermInfo.screen_size.last
|
16
|
+
@colors = colors
|
16
17
|
|
17
18
|
@contents = init_contents(@input)
|
18
19
|
@max_widths = @contents.map(&:length)
|
@@ -20,7 +21,7 @@ module ColorLS
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def ls
|
23
|
-
return print "\n Nothing to show here\n".colorize(:
|
24
|
+
return print "\n Nothing to show here\n".colorize(@colors[:empty]) if @contents.empty?
|
24
25
|
|
25
26
|
if @tree
|
26
27
|
print "\n"
|
@@ -52,8 +53,8 @@ module ColorLS
|
|
52
53
|
@total_content_length = @contents.length
|
53
54
|
|
54
55
|
return @contents unless @long
|
55
|
-
init_user_lengths
|
56
|
-
init_group_lengths
|
56
|
+
init_user_lengths(path)
|
57
|
+
init_group_lengths(path)
|
57
58
|
@contents
|
58
59
|
end
|
59
60
|
|
@@ -62,25 +63,25 @@ module ColorLS
|
|
62
63
|
@contents.keep_if { |x| !x.start_with? '.' } unless @all || @almost_all
|
63
64
|
end
|
64
65
|
|
65
|
-
def init_user_lengths
|
66
|
+
def init_user_lengths(path)
|
66
67
|
@userlength = @contents.map do |c|
|
67
|
-
next 0 unless File.exist?("#{
|
68
|
+
next 0 unless File.exist?("#{path}/#{c}")
|
68
69
|
begin
|
69
|
-
user = Etc.getpwuid(File.stat("#{
|
70
|
+
user = Etc.getpwuid(File.stat("#{path}/#{c}").uid).name
|
70
71
|
rescue ArgumentError
|
71
|
-
user = File.stat("#{
|
72
|
+
user = File.stat("#{path}/#{c}").uid
|
72
73
|
end
|
73
74
|
user.to_s.length
|
74
75
|
end.max
|
75
76
|
end
|
76
77
|
|
77
|
-
def init_group_lengths
|
78
|
+
def init_group_lengths(path)
|
78
79
|
@grouplength = @contents.map do |c|
|
79
|
-
next 0 unless File.exist?("#{
|
80
|
+
next 0 unless File.exist?("#{path}/#{c}")
|
80
81
|
begin
|
81
|
-
group = Etc.getgrgid(File.stat("#{
|
82
|
+
group = Etc.getgrgid(File.stat("#{path}/#{c}").gid).name
|
82
83
|
rescue ArgumentError
|
83
|
-
group = File.stat("#{
|
84
|
+
group = File.stat("#{path}/#{c}").gid
|
84
85
|
end
|
85
86
|
group.to_s.length
|
86
87
|
end.max
|
@@ -113,10 +114,10 @@ module ColorLS
|
|
113
114
|
end
|
114
115
|
|
115
116
|
def init_icons
|
116
|
-
@files = load_from_yaml('files.yaml')
|
117
|
-
@file_aliases = load_from_yaml('file_aliases.yaml', true)
|
118
|
-
@folders = load_from_yaml('folders.yaml')
|
119
|
-
@folder_aliases = load_from_yaml('folder_aliases.yaml', true)
|
117
|
+
@files = ColorLS.load_from_yaml('files.yaml')
|
118
|
+
@file_aliases = ColorLS.load_from_yaml('file_aliases.yaml', true)
|
119
|
+
@folders = ColorLS.load_from_yaml('folders.yaml')
|
120
|
+
@folder_aliases = ColorLS.load_from_yaml('folder_aliases.yaml', true)
|
120
121
|
|
121
122
|
@file_keys = @files.keys
|
122
123
|
@file_aliase_keys = @file_aliases.keys
|
@@ -148,32 +149,32 @@ module ColorLS
|
|
148
149
|
end
|
149
150
|
|
150
151
|
def in_line(chunk_size)
|
151
|
-
return false if @max_widths.sum +
|
152
|
+
return false if @max_widths.sum + 8 * chunk_size > @screen_width
|
152
153
|
true
|
153
154
|
end
|
154
155
|
|
155
156
|
def display_report
|
156
157
|
print "\n Found #{@total_content_length} contents in directory "
|
157
|
-
.colorize(:
|
158
|
+
.colorize(@colors[:report])
|
158
159
|
|
159
|
-
print File.expand_path(@input).to_s.colorize(:
|
160
|
+
print File.expand_path(@input).to_s.colorize(@colors[:dir])
|
160
161
|
|
161
162
|
puts "\n\n\tFolders\t\t\t: #{@count[:folders]}"\
|
162
163
|
"\n\tRecognized files\t: #{@count[:recognized_files]}"\
|
163
164
|
"\n\tUnrecognized files\t: #{@count[:unrecognized_files]}"
|
164
|
-
.colorize(:
|
165
|
+
.colorize(@colors[:report])
|
165
166
|
end
|
166
167
|
|
167
168
|
def mode_info(stat)
|
168
169
|
mode = ''
|
169
170
|
stat.mode.to_s(2).rjust(16, '0')[-9..-1].each_char.with_index do |c, i|
|
170
171
|
if c == '0'
|
171
|
-
mode += '-'.colorize(:
|
172
|
+
mode += '-'.colorize(@colors[:no_access])
|
172
173
|
else
|
173
174
|
case (i % 3)
|
174
|
-
when 0 then mode += 'r'.colorize(:
|
175
|
-
when 1 then mode += 'w'.colorize(:
|
176
|
-
when 2 then mode += 'x'.colorize(:
|
175
|
+
when 0 then mode += 'r'.colorize(@colors[:read])
|
176
|
+
when 1 then mode += 'w'.colorize(@colors[:write])
|
177
|
+
when 2 then mode += 'x'.colorize(@colors[:exec])
|
177
178
|
end
|
178
179
|
end
|
179
180
|
end
|
@@ -187,7 +188,7 @@ module ColorLS
|
|
187
188
|
user = stat.uid
|
188
189
|
end
|
189
190
|
user = user.to_s.ljust(@userlength, ' ')
|
190
|
-
user.colorize(:
|
191
|
+
user.colorize(@colors[:user]) if user == Etc.getlogin
|
191
192
|
end
|
192
193
|
|
193
194
|
def group_info(stat)
|
@@ -196,71 +197,61 @@ module ColorLS
|
|
196
197
|
rescue ArgumentError
|
197
198
|
group = stat.gid
|
198
199
|
end
|
199
|
-
group.to_s.ljust(@grouplength, ' ')
|
200
|
+
group.to_s.ljust(@grouplength, ' ').colorize(@colors[:normal])
|
200
201
|
end
|
201
202
|
|
202
203
|
def size_info(stat)
|
203
204
|
size = Filesize.from("#{stat.size} B").pretty.split(' ')
|
204
|
-
"#{size[0][0..-4].rjust(3,' ')} #{size[1].ljust(3,' ')}"
|
205
|
+
"#{size[0][0..-4].rjust(3,' ')} #{size[1].ljust(3,' ')}".colorize(@colors[:normal])
|
205
206
|
end
|
206
207
|
|
207
208
|
def mtime_info(stat)
|
208
|
-
mtime = stat.mtime.asctime
|
209
|
-
mtime = mtime.colorize(:
|
210
|
-
mtime = mtime.colorize(:
|
209
|
+
mtime = stat.mtime.asctime.colorize(@colors[:no_modifier])
|
210
|
+
mtime = mtime.colorize(@colors[:day_old]) if Time.now - stat.mtime < 24 * 60 * 60
|
211
|
+
mtime = mtime.colorize(@colors[:hour_old]) if Time.now - stat.mtime < 60 * 60
|
211
212
|
mtime
|
212
213
|
end
|
213
214
|
|
214
|
-
def long_info(content)
|
215
|
+
def long_info(path, content)
|
215
216
|
return '' unless @long
|
216
|
-
unless File.exist?("#{
|
217
|
-
return '[No Info]'.colorize(:
|
217
|
+
unless File.exist?("#{path}/#{content}")
|
218
|
+
return '[No Info]'.colorize(@colors[:error]) + ' ' * (39 + @userlength + @grouplength)
|
218
219
|
end
|
219
|
-
stat = File.stat("#{
|
220
|
+
stat = File.stat("#{path}/#{content}")
|
220
221
|
[mode_info(stat), user_info(stat), group_info(stat), size_info(stat), mtime_info(stat)].join(' ')
|
221
222
|
end
|
222
223
|
|
223
|
-
def symlink_info(content)
|
224
|
-
return '' unless @long && File.lstat("#{
|
225
|
-
if File.exist?("#{
|
226
|
-
" ⇒ #{File.readlink("#{
|
224
|
+
def symlink_info(path, content)
|
225
|
+
return '' unless @long && File.lstat("#{path}/#{content}").symlink?
|
226
|
+
if File.exist?("#{path}/#{content}")
|
227
|
+
" ⇒ #{File.readlink("#{path}/#{content}")}/".colorize(@colors[:link])
|
227
228
|
else
|
228
|
-
' ⇒ [Dead link]'.colorize(:
|
229
|
+
' ⇒ [Dead link]'.colorize(@colors[:dead_link])
|
229
230
|
end
|
230
231
|
end
|
231
232
|
|
232
|
-
def slash?(content)
|
233
|
-
Dir.exist?("#{
|
233
|
+
def slash?(path, content)
|
234
|
+
Dir.exist?("#{path}/#{content}") ? '/'.colorize(@colors[:dir]) : ' '
|
234
235
|
end
|
235
236
|
|
236
|
-
def fetch_string(content, key, color, increment)
|
237
|
+
def fetch_string(path, content, key, color, increment)
|
237
238
|
@count[increment] += 1
|
238
239
|
value = increment == :folders ? @folders[key] : @files[key]
|
239
240
|
logo = value.gsub(/\\u[\da-f]{4}/i) { |m| [m[-4..-1].to_i(16)].pack('U') }
|
240
241
|
|
241
242
|
[
|
242
|
-
long_info(content),
|
243
|
+
long_info(path, content),
|
243
244
|
logo.colorize(color),
|
244
|
-
"#{content.colorize(color)}#{slash?(content)}#{symlink_info(content)}"
|
245
|
+
"#{content.colorize(color)}#{slash?(path, content)}#{symlink_info(path, content)}"
|
245
246
|
].join(' ')
|
246
247
|
end
|
247
248
|
|
248
|
-
def load_from_yaml(filename, aliase=false)
|
249
|
-
filepath = File.join(File.dirname(__FILE__),"../yaml/#{filename}")
|
250
|
-
yaml = YAML.safe_load(File.read(filepath)).symbolize_keys
|
251
|
-
return yaml unless aliase
|
252
|
-
yaml
|
253
|
-
.to_a
|
254
|
-
.map! { |k, v| [k, v.to_sym] }
|
255
|
-
.to_h
|
256
|
-
end
|
257
|
-
|
258
249
|
def ls_line(chunk)
|
259
250
|
print "\n"
|
260
251
|
chunk.each_with_index do |content, i|
|
261
252
|
break if content.empty?
|
262
253
|
|
263
|
-
print " #{fetch_string(content, *options(@input, content))}"
|
254
|
+
print " #{fetch_string(@input, content, *options(@input, content))}"
|
264
255
|
print ' ' * (@max_widths[i] - content.length) unless @one_per_line || @long
|
265
256
|
end
|
266
257
|
end
|
@@ -268,29 +259,28 @@ module ColorLS
|
|
268
259
|
def options(path, content)
|
269
260
|
if Dir.exist?("#{path}/#{content}")
|
270
261
|
key = content.to_sym
|
271
|
-
|
262
|
+
color = @colors[:dir]
|
263
|
+
return [:folder, color, :folders] unless @all_folders.include?(key)
|
272
264
|
key = @folder_aliases[key] unless @folder_keys.include?(key)
|
273
|
-
return [key,
|
265
|
+
return [key, color, :folders]
|
274
266
|
end
|
275
267
|
|
276
|
-
|
277
|
-
|
278
|
-
return [key, :green, :recognized_files] if @file_keys.include?(key)
|
268
|
+
color = @colors[:recognized_file]
|
269
|
+
return [content.downcase.to_sym, color, :recognized_files] if @file_keys.include?(key)
|
279
270
|
|
280
271
|
key = content.split('.').last.downcase.to_sym
|
281
|
-
|
282
|
-
return %i[file yellow unrecognized_files] unless @all_files.include?(key)
|
272
|
+
return [:file, @colors[:unrecognized_file], :unrecognized_files] unless @all_files.include?(key)
|
283
273
|
|
284
274
|
key = @file_aliases[key] unless @file_keys.include?(key)
|
285
|
-
[key,
|
275
|
+
[key, color, :recognized_files]
|
286
276
|
end
|
287
277
|
|
288
278
|
def tree_traverse(path, prespace, indent)
|
289
279
|
contents = init_contents(path)
|
290
280
|
contents.each do |content|
|
291
281
|
icon = content == contents.last || Dir.exist?("#{path}/#{content}") ? ' └──' : ' ├──'
|
292
|
-
print tree_branch_preprint(prespace, indent, icon).colorize(:
|
293
|
-
print " #{fetch_string(content, *options(path, content))} \n"
|
282
|
+
print tree_branch_preprint(prespace, indent, icon).colorize(@colors[:tree])
|
283
|
+
print " #{fetch_string(path, content, *options(path, content))} \n"
|
294
284
|
next unless Dir.exist? "#{path}/#{content}"
|
295
285
|
tree_traverse("#{path}/#{content}", prespace + indent, indent)
|
296
286
|
end
|
data/lib/colorls/flags.rb
CHANGED
@@ -2,6 +2,8 @@ module ColorLS
|
|
2
2
|
class Flags
|
3
3
|
def initialize(*args)
|
4
4
|
@args = args
|
5
|
+
set_color_opts
|
6
|
+
|
5
7
|
@opts = {
|
6
8
|
show: fetch_show_opts,
|
7
9
|
sort: fetch_sort_opts,
|
@@ -10,7 +12,8 @@ module ColorLS
|
|
10
12
|
report: flag_given?(%w[-r --report]),
|
11
13
|
one_per_line: flag_given?(%w[-1]) || !STDOUT.tty?,
|
12
14
|
long: flag_given?(%w[-l --long]),
|
13
|
-
tree: flag_given?(%w[-t --tree])
|
15
|
+
tree: flag_given?(%w[-t --tree]),
|
16
|
+
colors: @colors
|
14
17
|
}
|
15
18
|
|
16
19
|
@args.keep_if { |arg| !arg.start_with?('-') }
|
@@ -35,13 +38,30 @@ module ColorLS
|
|
35
38
|
false
|
36
39
|
end
|
37
40
|
|
41
|
+
def set_color_opts
|
42
|
+
light_colors = flag_given? %w[--light]
|
43
|
+
dark_colors = flag_given? %w[--dark]
|
44
|
+
|
45
|
+
if light_colors && dark_colors
|
46
|
+
@colors = ColorLS.load_from_yaml('dark_colors.yaml', true)
|
47
|
+
STDERR.puts "\n Restrain from using --light and --dark flags together."
|
48
|
+
.colorize(@colors[:error])
|
49
|
+
elsif light_colors
|
50
|
+
@colors = ColorLS.load_from_yaml('light_colors.yaml', true)
|
51
|
+
else # default colors
|
52
|
+
@colors = ColorLS.load_from_yaml('dark_colors.yaml', true)
|
53
|
+
end
|
54
|
+
|
55
|
+
@colors
|
56
|
+
end
|
57
|
+
|
38
58
|
def fetch_show_opts
|
39
59
|
show_dirs_only = flag_given? %w[-d --dirs]
|
40
60
|
show_files_only = flag_given? %w[-f --files]
|
41
61
|
|
42
62
|
if show_files_only && show_dirs_only
|
43
|
-
STDERR.puts "\n
|
44
|
-
.colorize(:
|
63
|
+
STDERR.puts "\n Restrain from using -d and -f flags together."
|
64
|
+
.colorize(@colors[:error])
|
45
65
|
return nil
|
46
66
|
else
|
47
67
|
return :files if show_files_only
|
@@ -55,8 +75,8 @@ module ColorLS
|
|
55
75
|
sort_files_first = flag_given? %w[-sf --sort-files]
|
56
76
|
|
57
77
|
if sort_dirs_first && sort_files_first
|
58
|
-
STDERR.puts "\n
|
59
|
-
.colorize(:
|
78
|
+
STDERR.puts "\n Restrain from using -sd and -sf flags together."
|
79
|
+
.colorize(@colors[:error])
|
60
80
|
return nil
|
61
81
|
else
|
62
82
|
return :files if sort_files_first
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module ColorLS
|
2
|
+
def self.load_from_yaml(filename, aliase=false)
|
3
|
+
filepath = File.join(File.dirname(__FILE__),"../yaml/#{filename}")
|
4
|
+
yaml = YAML.safe_load(File.read(filepath)).symbolize_keys
|
5
|
+
return yaml unless aliase
|
6
|
+
yaml
|
7
|
+
.to_a
|
8
|
+
.map! { |k, v| [k, v.to_sym] }
|
9
|
+
.to_h
|
10
|
+
end
|
11
|
+
end
|
data/lib/colorls/version.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
# Main Colors
|
2
|
+
unrecognized_file: yellow
|
3
|
+
recognized_file: green
|
4
|
+
dir: blue
|
5
|
+
|
6
|
+
# Link
|
7
|
+
dead_link: red
|
8
|
+
link: cyan
|
9
|
+
|
10
|
+
# Access Modes
|
11
|
+
write: magenta
|
12
|
+
read: yellow
|
13
|
+
exec: cyan
|
14
|
+
no_access: grey
|
15
|
+
|
16
|
+
# Age
|
17
|
+
day_old: yellow
|
18
|
+
hour_old: green
|
19
|
+
no_modifier: white
|
20
|
+
|
21
|
+
# Random
|
22
|
+
report: white
|
23
|
+
user: green
|
24
|
+
tree: cyan
|
25
|
+
empty: yellow
|
26
|
+
normal: white
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# Main Colors
|
2
|
+
unrecognized_file: yellow
|
3
|
+
recognized_file: green
|
4
|
+
dir: blue
|
5
|
+
|
6
|
+
# Link
|
7
|
+
dead_link: red
|
8
|
+
link: cyan
|
9
|
+
|
10
|
+
# Access Modes
|
11
|
+
write: red
|
12
|
+
read: yellow
|
13
|
+
exec: blue
|
14
|
+
no_access: black
|
15
|
+
|
16
|
+
# Age
|
17
|
+
day_old: yellow
|
18
|
+
hour_old: green
|
19
|
+
no_modifier: black
|
20
|
+
|
21
|
+
# Random
|
22
|
+
report: black
|
23
|
+
user: green
|
24
|
+
tree: cyan
|
25
|
+
empty: yellow
|
26
|
+
normal: black
|
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.
|
4
|
+
version: 0.1.7
|
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-
|
11
|
+
date: 2017-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -158,11 +158,14 @@ files:
|
|
158
158
|
- lib/colorls.rb
|
159
159
|
- lib/colorls/core.rb
|
160
160
|
- lib/colorls/flags.rb
|
161
|
+
- lib/colorls/load_from_yaml.rb
|
161
162
|
- lib/colorls/version.rb
|
163
|
+
- lib/yaml/dark_colors.yaml
|
162
164
|
- lib/yaml/file_aliases.yaml
|
163
165
|
- lib/yaml/files.yaml
|
164
166
|
- lib/yaml/folder_aliases.yaml
|
165
167
|
- lib/yaml/folders.yaml
|
168
|
+
- lib/yaml/light_colors.yaml
|
166
169
|
- readme/pending.png
|
167
170
|
- readme/usage1.png
|
168
171
|
- readme/usage2.png
|