# File lib/timetrap/cli.rb, line 195 def archive ee = selected_entries if ask_user "Archive #{ee.count} entries? " ee.each do |e| next unless e.end e.update :sheet => "_#{e.sheet}" end else warn "archive aborted!" end end
# File lib/timetrap/cli.rb, line 254 def backend exec "sqlite3 #{DB_NAME}" end
# File lib/timetrap/cli.rb, line 149 def commands Timetrap::CLI::USAGE.scan(/\* \w+/).map{|s| s.gsub(/\* /, '')} end
# File lib/timetrap/cli.rb, line 207 def configure Config.configure! puts "Config file is at #{Config::PATH.inspect}" end
# File lib/timetrap/cli.rb, line 153 def deprecated_commands { 'switch' => 'sheet', 'running' => 'now', 'format' => 'display' } end
# File lib/timetrap/cli.rb, line 338 def display entries = selected_entries if entries == [] warn "No entries were selected to display." else puts format_entries(entries) end end
# File lib/timetrap/cli.rb, line 212 def edit entry = case when args['-i'] warn "Editing entry with id #{args['-i'].inspect}" Entry[args['-i']] when Timer.active_entry warn "Editing running entry" Timer.active_entry when Timer.last_checkout warn "Editing last entry you checked out of" Timer.last_checkout end unless entry warn "Can't find entry" return end warn "" entry.update :start => args['-s'] if args['-s'] =~ /.+/ entry.update :end => args['-e'] if args['-e'] =~ /.+/ # update sheet if args['-m'] =~ /.+/ if entry == Timer.active_entry Timer.current_sheet = args['-m'] end entry.update :sheet => args['-m'] end # update notes if unused_args =~ /.+/ note = unused_args if args['-z'] note = [entry.note, note].join(Config['append_notes_delimiter']) end entry.update :note => note end puts format_entries(entry) end
# File lib/timetrap/cli.rb, line 178 def handle_invalid_command(command) if !command puts USAGE elsif mapping = deprecated_commands.detect{|(k,v)| k =~ %^#{command}|} deprecated, current = *mapping warn "The #{deprecated.inspect} command is deprecated in favor of #{current.inspect}. Sorry for the inconvenience." send current else warn "Invalid command: #{command.inspect}" end end
# File lib/timetrap/cli.rb, line 258 def in if Config['auto_checkout'] Timer.stop_all(args['-a']).each do |checked_out_of| warn "Checked out of sheet #{checked_out_of.sheet.inspect}." end end if Config['require_note'] && !Timer.running? && unused_args.empty? $stderr.print("Please enter a note for this entry:\n> ") self.unused_args = $stdin.gets end Timer.start unused_args, args['-a'] warn "Checked into sheet #{Timer.current_sheet.inspect}." end
# File lib/timetrap/cli.rb, line 141 def invoke args['-h'] ? puts(USAGE) : invoke_command_if_valid rescue StandardError, LoadError => e raise e if args['--debug'] warn e.message exit 1 unless defined? TEST_MODE end
# File lib/timetrap/cli.rb, line 161 def invoke_command_if_valid if args.unused.empty? && Timetrap::Config['default_command'] self.args = Getopt::Declare.new(USAGE.dup, Timetrap::Config['default_command']) end command = args.unused.shift set_global_options case (valid = commands.select{|name| name =~ %^#{command}|}).size when 1 then send valid[0] else handle_invalid_command(command) end end
# File lib/timetrap/cli.rb, line 314 def kill if e = Entry[args['-i']] out = "are you sure you want to delete entry #{e.id}? " out << "(#{e.note}) " if e.note.to_s =~ /.+/ if ask_user out e.destroy warn "it's dead" else warn "will not kill" end elsif (sheets = Entry.map{|e| e.sheet }.uniq).include?(sheet = unused_args) victims = Entry.filter(:sheet => sheet).count if ask_user "are you sure you want to delete #{victims} entries on sheet #{sheet.inspect}? " Entry.filter(:sheet => sheet).destroy warn "killed #{victims} entries" else warn "will not kill" end else victim = args['-i'] ? args['-i'].to_s.inspect : sheet.inspect warn ["can't find #{victim} to kill", 'sheets:', *sheets].join("\n") end end
# File lib/timetrap/cli.rb, line 366 def list sheets = ([Timer.current_sheet] | Entry.sheets).map do |sheet| sheet_atts = {:total => 0, :running => 0, :today => 0} entries = Timetrap::Entry.filter(:sheet => sheet) if entries.empty? sheet_atts.merge(:name => sheet) else entries.inject(sheet_atts) do |m, e| e_end = e.end_or_now m[:name] ||= sheet m[:total] += (e_end.to_i - e.start.to_i) m[:running] += (e_end.to_i - e.start.to_i) unless e.end m[:today] += (e_end.to_i - e.start.to_i) if same_day?(Time.now, e.start) m end end end.sort_by{|sheet| sheet[:name].downcase} width = sheets.sort_by{|h|h[:name].length }.last[:name].length + 4 width = 10 if width < 10 puts " %-#{width}s%-12s%-12s%s" % ["Timesheet", "Running", "Today", "Total Time"] sheets.each do |sheet| star = sheet[:name] == Timer.current_sheet ? '*' : sheet[:name] == Timer.last_sheet ? '-' : ' ' puts "#{star}%-#{width}s%-12s%-12s%s" % [ sheet[:running], sheet[:today], sheet[:total] ].map(&method(:format_seconds)).unshift(sheet[:name]) end end
# File lib/timetrap/cli.rb, line 426 def month d = Chronic.parse( args['-s'] || Date.today ) beginning_of_month = Date.new( d.year, d.month ) end_of_month = if d.month == 12 # handle edgecase Date.new( d.year + 1, 1) - 1 else Date.new( d.year, d.month+1 ) - 1 end args['-s'] = beginning_of_month.to_s args['-e'] = end_of_month.to_s display end
# File lib/timetrap/cli.rb, line 396 def now if !Timer.running? warn "*#{Timer.current_sheet}: not running" end Timer.running_entries.each do |entry| current = entry.sheet == Timer.current_sheet out = current ? '*' : ' ' out << "#{entry.sheet}: #{format_duration(entry.duration)}".gsub(/ /, ' ') out << " (#{entry.note})" if entry.note =~ /.+/ puts out end end
# File lib/timetrap/cli.rb, line 296 def out if Config['auto_checkout'] stopped = Timer.stop_all(args['-a']).each do |checked_out_of| warn "Checked out of sheet #{checked_out_of.sheet.inspect}." end if stopped.empty? warn "No running entries to stop." end else sheet = sheet_name_from_string(unused_args) if Timer.stop sheet, args['-a'] warn "Checked out of sheet #{sheet.inspect}." else warn "No running entry on sheet #{sheet.inspect}." end end end
# File lib/timetrap/cli.rb, line 137 def parse arguments args.parse arguments end
# File lib/timetrap/cli.rb, line 274 def resume entry = case when args['-i'] entry = Entry[args['-i']] warn "Resuming entry with id #{args['-i'].inspect} (#{entry.note})" entry when Timer.last_checkout last = Timer.last_checkout warn "Resuming last entry you checked out of (#{last.note})" last end unless entry warn "Can't find entry" return end self.unused_args = entry.note || unused_args self.in end
currently just sets whether output should be rounded to 15 min intervals
# File lib/timetrap/cli.rb, line 191 def set_global_options Timetrap::Entry.round = true if args['-r'] end
# File lib/timetrap/cli.rb, line 347 def sheet sheet = unused_args case sheet when nil, '' list return when '-' if Timer.last_sheet sheet = Timer.last_sheet else warn 'LAST_SHEET is not set' return end end Timer.current_sheet = sheet warn "Switching to sheet #{sheet.inspect}" end
# File lib/timetrap/cli.rb, line 409 def today args['-s'] = Date.today.to_s display end
# File lib/timetrap/cli.rb, line 174 def valid_command(command) return commands.include?(command) end
Generated with the Darkfish Rdoc Generator 2.