colorls 0.1.6 → 0.1.7
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.
- 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
|