Module: Mez
- Defined in:
- lib/mez.rb,
lib/mez/VERSION.rb
Constant Summary collapse
- APP_DIR =
if OS.windows? File.join(File.('~'), 'appdata', 'local', 'mez') else File.join(File.('~'), '.mez') end
- CONFIG =
File.join(APP_DIR, 'folders.json')
- DB =
if File.exist?(File.join(APP_DIR, 'folders.db')) SQLite3::Database.new(File.join(APP_DIR, 'folders.db')) else FileUtils.mkdir_p(APP_DIR) unless File.exist?(APP_DIR) db = SQLite3::Database.new(File.join(APP_DIR, 'folders.db')) db.execute('CREATE TABLE folders (name string, date string, size int, PRIMARY KEY ("name", "date"))') db end
- VERSION =
'0.8.2'.freeze
Class Method Summary collapse
- .closing_line(total_size, total_difference) ⇒ Object
-
.difference_report(n) ⇒ String
Format a number for the ‘change’ column, meaning a + or - prefix and a number in bytes converted to a comma-separated number in IEC megabytes.
-
.folder_size(folder) ⇒ Integer
Calculates the size of a folder and its contents as an integer.
-
.humanise(num) ⇒ String
Uses commas as separators to make large numbers human-readable.
- .intro_line ⇒ Object
-
.prefix(n) ⇒ String
Provide a “+” or “-” prefix based on whether ‘n` is positive or negative.
- .report(name, size, difference) ⇒ Object
-
.setsize(folderset) ⇒ Integer
Take an array of folder names, and return their total size in bytes.
- .update(name, size) ⇒ Object
- .yesterday_size(name) ⇒ Object
Class Method Details
.closing_line(total_size, total_difference) ⇒ Object
104 105 106 107 108 109 |
# File 'lib/mez.rb', line 104 def self.closing_line(total_size, total_difference) puts('-' * 80) puts 'TOTAL SIZE: ' + humanise(total_size / 1_000_000) + ('TOTAL CHANGE: ' + humanise(total_difference / 1_000_000)).rjust(59) end |
.difference_report(n) ⇒ String
Format a number for the ‘change’ column, meaning a + or - prefix and a number in bytes converted to a comma-separated number in IEC megabytes.
74 75 76 |
# File 'lib/mez.rb', line 74 def self.difference_report(n) n.zero? ? '' : prefix(n) + humanise(n.abs / 1_000_000) end |
.folder_size(folder) ⇒ Integer
Calculates the size of a folder and its contents as an integer. On Windows, uses the Win32 API, which caches folder information and makes repeated calls to this function very fast. On other systems, sums individual file sizes.
34 35 36 37 38 39 40 41 42 43 |
# File 'lib/mez.rb', line 34 def self.folder_size(folder) if OS.windows? # Much faster for repeated calls than calculating sizes in Ruby. WIN32OLE.new('Scripting.FileSystemObject').getFolder(folder).size.to_i else size = 0 Dir.glob(File.join(folder, '**', '*')) { |file| size += File.size(file) } size end end |
.humanise(num) ⇒ String
Uses commas as separators to make large numbers human-readable.
49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/mez.rb', line 49 def self.humanise(num) (prefix(num) == '-' ? '-' : '') + num .abs .to_s .split('') .reverse .each_slice(3) .map(&:join) .join(',') .reverse end |
.intro_line ⇒ Object
91 92 93 94 |
# File 'lib/mez.rb', line 91 def self.intro_line puts "\nFOLDERSET".ljust(56) + 'SIZE (MB)' + 'CHANGE (MB)'.rjust(16) puts('-' * 80) end |
.prefix(n) ⇒ String
Provide a “+” or “-” prefix based on whether ‘n` is positive or negative.
65 66 67 |
# File 'lib/mez.rb', line 65 def self.prefix(n) n >= 0 ? '+' : '-' end |
.report(name, size, difference) ⇒ Object
85 86 87 88 89 |
# File 'lib/mez.rb', line 85 def self.report(name, size, difference) puts name.ljust(54) + humanise(size / 1_000_000).rjust(10) + difference_report(difference).rjust(16) end |
.setsize(folderset) ⇒ Integer
Take an array of folder names, and return their total size in bytes.
100 101 102 |
# File 'lib/mez.rb', line 100 def self.setsize(folderset) folderset.reduce(0) { |acc, elem| acc + Mez.folder_size(elem) } end |
.update(name, size) ⇒ Object
111 112 113 114 115 |
# File 'lib/mez.rb', line 111 def self.update(name, size) DB.execute('INSERT OR REPLACE INTO folders (name, size, date) VALUES (?,?,?)', name, size, Date.today.to_s) end |
.yesterday_size(name) ⇒ Object
78 79 80 81 82 83 |
# File 'lib/mez.rb', line 78 def self.yesterday_size(name) DB.get_first_value('SELECT size FROM folders WHERE name = ? AND date <> ? ORDER BY date DESC LIMIT 1', name, Date.today.to_s) end |