class TheFox::Wallet::ListCommand
List entries. Per default this command lists all entries of today. @TODO Use terminal-table for output? github.com/tj/terminal-table
Constants
- NAME
Public Instance Methods
run()
click to toggle source
# File lib/wallet/command_list.rb, line 10 def run puts wallet = Wallet.new(@options[:wallet_path]) entries = wallet.entries(@options[:entry_date], @options[:entry_category].to_s) # Get max length of all columns. entries_l = entries .map{ |day_name, day_items| day_items.count } .inject{ |sum, n| sum + n } .to_s .length title_l = entries .map{ |month_item| month_item[1].map{ |day_item| day_item['title'].length }} .flatten .max .to_i revenue_l = entries .map{ |month_item| month_item[1].map{ |day_item| (NUMBER_FORMAT % day_item['revenue']).length } } .flatten .max .to_i expense_l = entries .map{ |month_item| month_item[1].map{ |day_item| (NUMBER_FORMAT % day_item['expense']).length } } .flatten .max .to_i balance_l = entries .map{ |month_item| month_item[1].map{ |day_item| (NUMBER_FORMAT % day_item['balance']).length } } .flatten .max .to_i category_l = entries .map{ |month_item| month_item[1].map{ |day_item| day_item['category'].length } } .flatten .max .to_i comment_l = entries .map{ |month_item| month_item[1].map{ |day_item| day_item['comment'].length } } .flatten .max .to_i has_category_col = entries.map{ |month_item| month_item[1].map{ |day_item| day_item['category'] } }.flatten.select{ |i| i != 'default' }.count > 0 has_comment_col = entries .map{ |month_item| month_item[1].map{ |day_item| day_item['comment'] } } .flatten .select{ |i| i != '' } .count > 0 # Limit some columns to a maximum length. if title_l < 6 title_l = 6 end if title_l > 25 title_l = 25 end if revenue_l < 7 revenue_l = 7 end if expense_l < 7 expense_l = 7 end if balance_l < 7 balance_l = 7 end if category_l < 8 category_l = 8 end if comment_l > 25 comment_l = 25 end # Format String for each column. entries_f = "%#{entries_l}s" title_f = "%-#{title_l}s" revenue_f = "%#{revenue_l}s" expense_f = "%#{expense_l}s" balance_f = "%#{balance_l}s" category_f = "%-#{category_l}s" comment_f = "%-#{comment_l}s" # Create a table header. header = '' header << '#' * entries_l << ' ' header << 'Date ' << ' ' * 7 header << title_f % 'Title' << ' ' header << revenue_f % 'Revenue' << ' ' header << expense_f % 'Expense' << ' ' header << balance_f % 'Balance' if has_category_col header << ' ' << category_f % 'Category' end if has_comment_col header << ' ' << comment_f % 'Comment' end header_l = header.length header.sub!(/ +$/, '') # Print table header. puts header puts '-' * header_l # Sums revenue_total = 0.0 expense_total = 0.0 balance_total = 0.0 entry_no = 0 # Iterate all days. entries.sort.each do |day_name, day_items| # Iterate all entries of a day. day_items.each do |entry| entry_no += 1 title = entry['title'] if title.length >= 25 title = title[0, 22] << '...' end revenue_total += entry['revenue'] expense_total += entry['expense'] balance_total += entry['balance'] category = entry['category'] == 'default' ? '' : entry['category'] comment = entry['comment'] if comment.length >= 25 comment = comment[0, 22] << '...' end out = '' out << entries_f % entry_no out << ' ' << '%10s' % entry['date'] out << ' ' << title_f % title out << ' ' << revenue_f % (NUMBER_FORMAT % entry['revenue']) out << ' ' << expense_f % (NUMBER_FORMAT % entry['expense']) out << ' ' << balance_f % (NUMBER_FORMAT % entry['balance']) out << ' ' << category_f % category if has_category_col out << ' ' << comment_f % comment if has_comment_col out.sub!(/ +$/, '') puts out end end puts out = '' out << ' ' * (12 + entries_l) out << ' ' << title_f % 'TOTAL' out << ' ' << revenue_f % (NUMBER_FORMAT % revenue_total) out << ' ' << expense_f % (NUMBER_FORMAT % expense_total) out << ' ' << balance_f % (NUMBER_FORMAT % balance_total) puts out end