lib/waddup/cli.rb in waddup-0.0.1 vs lib/waddup/cli.rb in waddup-0.0.2
- old
+ new
@@ -1,75 +1,151 @@
\ No newline at end of file
+require 'chronic'
+
+module Waddup
+
+ class CLI
+
+ attr_accessor :sources, :from, :to
+
+ KEYWORDS = {
+ :sources => %w[with],
+ :from => %w[from since],
+ :to => %w[to until uptil upto through]
+ }
+
+ KEYWORD_BOUNDARY = "(?:\\s#{KEYWORDS.values.flatten.join('|\\s')}|\\Z)"
+
+ def parse!
+ parse_keyword :sources do |match|
+ sources = match[1]
+ @sources = Waddup::Source.usable.select do |source|
+ sources.include? source::ALIAS
+ end
+ end
+
+ parse_keyword :from do |match|
+ @from = Chronic.parse match[1]
+ end
+
+ parse_keyword :to do |match|
+ @to = Chronic.parse match[1]
+ end
+ end
+
+ def parse_keyword(keyword, &block)
+ @arguments.match /(?:#{KEYWORDS[keyword].join('|')})\s(.+?)#{KEYWORD_BOUNDARY}/i, &block
+ end
+
+ # Parses given arguments, aggregates events and renders timesheet
+ def run!(arguments)
+ @arguments = arguments.join ' '
+
+ parse!
+
+ # Sanity checking
+ @sources ||= Waddup::Source.usable
+ @from ||= Time.now
+ @to ||= Time.now
+
+ # Aggregate events from all sources
+ events = sources.map do |source|
+ source.new.events from, to
+ end
+
+ # Sort events
+ events.flatten!
+ events.sort_by! &:at
+
+ # Group daily
+ days = events.group_by { |event| event.at.to_date }
+
+ # Generate timesheet
+ days.each_pair do |day, events|
+ puts
+ puts day.strftime('%A, %-d %B %Y')
+ puts
+ events.each do |event|
+ puts " #{event.at.strftime('%H:%M')} #{event.source.class::ICON} #{event.label}"
+ end
+ end
+
+ puts
+ end
+
+ end
+
+end