weigh 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Weigh
2
2
 
3
+ [![Build Status](https://travis-ci.org/xaque208/weigh.png?branch=master)](https://travis-ci.org/xaque208/weigh)
4
+
3
5
  A small ruby utility to weigh directory contents. Heavy stuff to the bottom.
4
6
 
5
7
  ## Example output
data/bin/weigh CHANGED
@@ -1,6 +1,13 @@
1
1
  #! /usr/bin/env ruby
2
- # Weigh directory contents
2
+
3
+ # Summarize the size of directories and rank the totals.
3
4
 
4
5
  require 'weigh/cli'
6
+ require 'colored'
5
7
 
6
- Weigh::CLI.run ARGV
8
+ begin
9
+ Weigh::CLI.command.run ARGV
10
+ rescue Interrupt
11
+ $stderr.puts "Terminating!".red
12
+ exit 1
13
+ end
data/lib/weigh/cli.rb CHANGED
@@ -1,44 +1,44 @@
1
- require 'weigh/flags'
2
- require 'weigh/runner'
1
+ require 'weigh/run'
2
+ require 'weigh/util'
3
+ require 'cri'
3
4
 
4
- module Weigh
5
- class CLI
5
+ module Weigh::CLI
6
6
 
7
- attr_reader :flags
8
- attr_reader :runner
7
+ def self.command
8
+ @cmd ||= Cri::Command.define do
9
+ name 'weigh'
10
+ usage 'weigh [options] <path1> <path2>'
11
+ summary 'Summarize the size of directories and files'
9
12
 
10
- def initialize(flags)
11
- @flags = flags
12
- @runner = Weigh::Runner.new(@flags)
13
- end
13
+ w = Weigh::Run.new
14
14
 
15
- def run
16
- if flags.help?
17
- puts flags
18
- exit
15
+ flag :h, :help, 'show help for this command' do |value, cmd|
16
+ puts cmd.help
17
+ exit 0
19
18
  end
20
19
 
21
- runner.run
22
- end
23
-
24
- def self.shutdown
25
- puts "Terminating..."
26
- exit 0
27
- end
28
-
29
- Signal.trap("TERM") do
30
- shutdown()
31
- end
20
+ flag :V, :version, 'show help for this command' do |value, cmd|
21
+ require 'weigh/version'
22
+ puts "Weigh.rb version " + Weigh::VERSION
23
+ exit 0
24
+ end
32
25
 
33
- Signal.trap("INT") do
34
- shutdown()
35
- end
26
+ flag :v, :verbose, 'speak up' do |value, cmd|
27
+ w.verbose = true
28
+ end
36
29
 
37
- def self.run(*args)
38
- flags = Weigh::Flags.new args
30
+ flag :d, :depth, 'Sumarize deeper than depth' do |value, cmd|
31
+ #w.depth = value
32
+ end
39
33
 
40
- return Weigh::CLI.new(flags).run
34
+ run do |opts, args, cmd|
35
+ if args.size > 0
36
+ w.pathlist = args
37
+ end
38
+ w.run
39
+ w.report
40
+ exit 0
41
+ end
41
42
  end
42
-
43
43
  end
44
44
  end
data/lib/weigh/run.rb ADDED
@@ -0,0 +1,86 @@
1
+ require 'weigh/util'
2
+ require 'find'
3
+
4
+ module Weigh
5
+ class Run
6
+
7
+ attr_accessor :verbose, :pathlist
8
+
9
+ def initialize(pathlist=['.'])
10
+ @pathlist = pathlist
11
+
12
+ @data = {
13
+ :total_size => 0,
14
+ :summary => {},
15
+ :count => 0
16
+ }
17
+ end
18
+
19
+ def verbose=(value)
20
+ @verbose = value
21
+ end
22
+
23
+ def verbose
24
+ @verbose
25
+ end
26
+
27
+ def pathlist=(value)
28
+ @pathlist = value
29
+ end
30
+
31
+ def pathlist
32
+ @pathlist
33
+ end
34
+
35
+ def run
36
+ # Dig into each path given
37
+ @pathlist.each do |p|
38
+ Find.find(p) do |path|
39
+ @data[:count] += 1
40
+
41
+ # Skip symlinks
42
+ next if FileTest.symlink?(path)
43
+
44
+ if FileTest.directory?(path)
45
+
46
+ # Skip the path that we are already on
47
+ next if p == path
48
+
49
+ # Summarize the directory data
50
+ ret = Weigh::Util.sum_dir(path,@verbose)
51
+ dir_size = ret[:dir_size]
52
+
53
+ # Skip empty directories
54
+ next if dir_size == 0
55
+
56
+ # Record the data from the directory
57
+ @data[:count] += ret[:count]
58
+ @data[:total_size] += dir_size
59
+
60
+ # Add a trailing slash to the key for directories
61
+ pathname = path + "/"
62
+
63
+ @data[:summary][pathname] = dir_size
64
+
65
+ Find.prune
66
+ else
67
+ # Store the size of the current file
68
+ size = FileTest.size(path)
69
+
70
+ # Don't count zero sized files
71
+ next if size == 0
72
+
73
+ @data[:total_size] += size
74
+ @data[:summary][path] = size
75
+ end
76
+ end
77
+ end
78
+
79
+ @data
80
+ end
81
+
82
+ def report
83
+ Weigh::Util.report @data
84
+ end
85
+ end
86
+ end
data/lib/weigh/util.rb CHANGED
@@ -1,6 +1,11 @@
1
1
  module Weigh
2
2
  module Util
3
3
 
4
+ # Convert a byte count into something a bit more human friendly
5
+ #
6
+ # @param [Int] a byte count
7
+ #
8
+ # @return [String] human readable byte count
4
9
  def self.neat_size(bytes)
5
10
  # return a human readble size from the bytes supplied
6
11
  bytes = bytes.to_f
@@ -20,73 +25,68 @@ module Weigh
20
25
  neat
21
26
  end
22
27
 
28
+ # Sumarize the size of the given directory
29
+ #
30
+ # @param [String] full path to directory
31
+ # @param [Boolean] increase verbosity
32
+ #
33
+ # @return Hash {:dir_size => Hash, :count => Int}
23
34
  def self.sum_dir(dir,verbose=false)
24
35
  # return the size of a given directory
25
36
  #"Entering: #{dir}"
26
- count=0
27
- dir_size=0
28
- data={}
37
+ count = 0
38
+ dir_size = 0
39
+ data = {}
40
+
29
41
  Find.find(dir) do |path|
30
- count += 1
31
- next if FileTest.symlink?(path)
32
- next if dir == path
33
- if FileTest.directory?(path)
34
- ret = sum_dir(path,verbose)
35
- size = ret[:dir_size]
36
- count += ret[:count]
37
- dir_size += size
38
- Find.prune
39
- else
40
- size = FileTest.size(path)
41
- #puts "File: #{path} is #{size}"
42
- puts "Found zero size file: #{path}" if verbose
43
- dir_size += size
42
+ begin
43
+ puts path if verbose
44
+ count += 1
45
+ if FileTest.symlink?(path)
46
+ puts "skipping symlink " + path if verbose
47
+ next
48
+ end
49
+ if dir == path and File.directory?(path)
50
+ puts "skipping current directory " + path if verbose
51
+ next
52
+ end
53
+ if FileTest.directory?(path)
54
+ ret = sum_dir(path,verbose)
55
+ size = ret[:dir_size]
56
+ count += ret[:count]
57
+ dir_size += size
58
+ Find.prune
59
+ else
60
+ size = FileTest.size(path)
61
+ #puts "File: #{path} is #{size}"
62
+ puts "Found zero size file: #{path}" if verbose
63
+ dir_size += size
64
+ end
65
+ rescue IOError
66
+ puts "file vanished: " + path
44
67
  end
45
68
  end
46
- #puts "Exiting: #{dir} with #{dir_size}"
47
69
  data[:dir_size] = dir_size
48
70
  data[:count] = count
49
71
  data
50
72
  end
51
73
 
52
- def self.report(summary,total_size)
53
- summary.sort{|a,b| a[1]<=>b[1]}.each { |elem|
74
+ # Print a summary of the received data
75
+ #
76
+ # @param [Hash]
77
+ #
78
+ # @returns [Hash] the unmodified data
79
+ def self.report(data)
80
+ data[:summary].sort{|a,b| a[1]<=>b[1]}.each { |elem|
54
81
  size = elem[1]
55
82
  filename = elem[0]
56
83
  puts sprintf("%15s %s\n", neat_size(size), filename)
57
84
  }
58
85
 
59
86
  puts sprintf("%16s %s\n", "---", "---")
60
- puts sprintf("%15s %s\n", self.neat_size(total_size), ":total size")
87
+ puts sprintf("%15s %s\n", self.neat_size(data[:total_size]), ":total size")
61
88
  puts sprintf("%16s %s\n", "---", "---")
62
- end
63
89
 
64
- def sum_dir(dir,verbose=false)
65
- # return the size of a given directory
66
- #"Entering: #{dir}"
67
- count=0
68
- dir_size=0
69
- data={}
70
- Find.find(dir) do |path|
71
- count += 1
72
- next if FileTest.symlink?(path)
73
- next if dir == path
74
- if FileTest.directory?(path)
75
- ret = sum_dir(path,verbose)
76
- size = ret[:dir_size]
77
- count += ret[:count]
78
- dir_size += size
79
- Find.prune
80
- else
81
- size = FileTest.size(path)
82
- #puts "File: #{path} is #{size}"
83
- puts "Found zero size file: #{path}" if verbose
84
- dir_size += size
85
- end
86
- end
87
- #puts "Exiting: #{dir} with #{dir_size}"
88
- data[:dir_size] = dir_size
89
- data[:count] = count
90
90
  data
91
91
  end
92
92
  end
data/lib/weigh/version.rb CHANGED
@@ -1,7 +1,3 @@
1
1
  module Weigh
2
- VERSION = '0.0.3'
3
-
4
- def self.version
5
- VERSION
6
- end
2
+ VERSION = '0.1.0'
7
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weigh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-12 00:00:00.000000000 Z
12
+ date: 2014-05-12 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Useful utility to weigh the directory contents and sort the output by
15
15
  size in a neatly formatted list.
@@ -21,8 +21,7 @@ extra_rdoc_files: []
21
21
  files:
22
22
  - bin/weigh
23
23
  - lib/weigh/cli.rb
24
- - lib/weigh/flags.rb
25
- - lib/weigh/runner.rb
24
+ - lib/weigh/run.rb
26
25
  - lib/weigh/util.rb
27
26
  - lib/weigh/version.rb
28
27
  - README.md
@@ -51,3 +50,4 @@ signing_key:
51
50
  specification_version: 3
52
51
  summary: Weigh directory contents
53
52
  test_files: []
53
+ has_rdoc:
data/lib/weigh/flags.rb DELETED
@@ -1,48 +0,0 @@
1
- require 'optparse'
2
-
3
- module Weigh
4
- class Flags
5
-
6
- attr_reader :args
7
- attr_reader :verbose
8
- attr_reader :depth
9
- attr_reader :pathlist
10
-
11
- def initialize(*args)
12
- @args = []
13
- @verbose = false
14
- @depth = 1
15
- @pathlist = []
16
-
17
- @options = OptionParser.new do|o|
18
- o.banner = "Usage: #{File.basename $0} [options] [file|directory...]\n\n"
19
-
20
- o.on( '--verbose', '-v', 'Speak up' ) do
21
- @verbose = true
22
- end
23
-
24
- o.on( '--depth DEPTH', '-d', 'Sumarize deeper than DEPTH' ) do|d|
25
- @depth = d
26
- end
27
-
28
- o.on( '-h', '--help', 'Display this screen' ) do
29
- @help = true
30
- end
31
- end
32
-
33
- @args = @options.parse!
34
-
35
- if ARGV.size > 0
36
- ARGV.each do |f|
37
- @pathlist << f
38
- end
39
- else
40
- @pathlist << "."
41
- end
42
-
43
- def help?
44
- @help
45
- end
46
- end
47
- end
48
- end
data/lib/weigh/runner.rb DELETED
@@ -1,47 +0,0 @@
1
- require 'weigh/util'
2
- require 'pp'
3
- require 'find'
4
-
5
- module Weigh
6
- class Runner
7
-
8
- attr_reader :flags
9
-
10
- def initialize(flags)
11
- @flags = flags
12
- end
13
-
14
- def run
15
- total_size = 0
16
- summary = {}
17
- count = 0
18
- sumdep = @flags.depth
19
-
20
- @flags.pathlist.each do |p|
21
- curdep = 0
22
- Find.find(p) do |path|
23
- count += 1
24
- next if FileTest.symlink?(path)
25
- if FileTest.directory?(path)
26
- next if p == path
27
- ret = Weigh::Util.sum_dir(path,@flags.verbose)
28
- dir_size = ret[:dir_size]
29
- next if dir_size == 0
30
- count += ret[:count]
31
- total_size += dir_size
32
- summary["#{path}/"] = dir_size
33
- Find.prune
34
- else
35
- size = FileTest.size(path)
36
- next if size == 0
37
- total_size += size
38
- summary["#{path}"] = size
39
- end
40
- end
41
- end
42
-
43
- Weigh::Util.report(summary,total_size)
44
- end
45
-
46
- end
47
- end