class Sculd::Manager

Constants

DEFAULT_WEEKDAYS

Attributes

weekdays[R]

Public Class Methods

new(dir, io = $stdout) click to toggle source
# File lib/sculd/manager.rb, line 20
def initialize(dir, io = $stdout)
  @source_dir = dir
  @weekdays = DEFAULT_WEEKDAYS
  @plans = []
  Dir.glob("#{@source_dir}/*").each do |file|
    load_file(file, io)
  end
end

Public Instance Methods

set_weekdays(ary) click to toggle source
# File lib/sculd/manager.rb, line 29
def set_weekdays(ary)
  unless ary.size == 7
    raise ArgumentError, ary.to_s
  end
  @weekdays = ary
end
show_events(dates, io = $stdout) click to toggle source
Show events in 'num' days from todary.

def show_events(num, today = Date.today, io = $stdout)

# File lib/sculd/manager.rb, line 43
def show_events(dates, io = $stdout)
  hl = HighLine.new($stdin, io)

  d_e = days_events
  io.puts "Events:"
  dates.each do |date|
    str = " #{date.to_s} #{@weekdays[date.wday]} "

    case date.wday
    when 0
      fgcolor = ":white"; bgcolor = ":on_red";
    when 6
      fgcolor = ":white"; bgcolor = ":on_blue";
    else
      fgcolor = ":black"; bgcolor = ":on_white";
    end
    hl.say("  <%= color('#{str}', #{fgcolor}, #{bgcolor}) %>\n")

    events = d_e[date]
    if events # if plan is not empty.
      events.sort_by{|j| j.datetime}.each do |event|

        io.print("    ") #indent
        event_date = Date.new(event.datetime.year,
                              event.datetime.month,
                              event.datetime.day)
        if event_date != date
          io.printf("<%02d/%02d>", event.datetime.month, event.datetime.day )
        elsif event.flag_time
          io.printf("[%02d:%02d]", event.datetime.hour, event.datetime.minute )
        else
          io.print("       ")
        end
        io.printf("%s", event.class::SYMBOL_CHAR )
        io.printf("%-2s ", event.option.to_s )
        io.puts "#{event.description}"
      end
    else
      io.puts "        (no event)"
    end
    io.puts
  end
end
show_tasks(num, today = Date.today, io = $stdout) click to toggle source

Show 'num' tasks of the highest priority.

# File lib/sculd/manager.rb, line 88
def show_tasks(num, today = Date.today, io = $stdout)
  return if num == 0

  io.puts "Tasks:"
  plans = @plans.sort_by {|plan| plan.priority(today)}.reverse

  num = plans.size if plans.size < num
  plans[0..(num-1)].each do |plan|
    io.printf("  [%4d-%02d-%02d]",
      plan.datetime.year,
      plan.datetime.month,
      plan.datetime.day,
            )
    io.printf("%s%-2s %s",
      plan.class::SYMBOL_CHAR,
      plan.option.to_s,
      plan.description
    #io.print "  #{plan.description.strip}"
    )
    io.puts
  end
end

Private Instance Methods

days_events() click to toggle source

Return a hash of dates and events. The eventes generated from @schedules sorted by date and time.

# File lib/sculd/manager.rb, line 155
def days_events
  results = {}
  @plans.each do |plan|
    plan.event_dates.each do |date|
      results[date] ||= []
      results[date] << plan
    end
  end
  return results
end
load_file(file, io = $stdin) click to toggle source

read, parse file and set data to @events and @tasks.

# File lib/sculd/manager.rb, line 113
def load_file(file, io = $stdin)

  File.open(file, "r").readlines.each_with_index do |line, index|
    begin
      elems = Sculd::Plan.parse(line, io)
      next unless elems[:type]
      case elems[:type]
      when Sculd::Plan::Schedule::SYMBOL_CHAR
        plan_class = Sculd::Plan::Schedule
      when Sculd::Plan::Deadline::SYMBOL_CHAR
        plan_class = Sculd::Plan::Deadline
      when Sculd::Plan::Reminder::SYMBOL_CHAR
        plan_class = Sculd::Plan::Reminder
      when Sculd::Plan::Todo::SYMBOL_CHAR
        plan_class = Sculd::Plan::Todo
      else
        next
      end
      @plans << plan_class.new(elems[:datetime     ],
                              elems[:flag_time    ],
                              elems[:option       ],
                              elems[:description],
                              )
    rescue Sculd::Plan::WeekdayMismatchError => error
      message = error.message
      message += "\nError occured in #{file} at #{index}: #{line.to_i + 1}\n"
      message +=  line
      raise LoadError, message
    rescue Sculd::Plan::NotWeekdayError => error
      message = error.message
      message += "\nError occured in #{file} at #{index}: #{line.to_i + 1}\n"
      message +=  line
      raise LoadError, message
    rescue Sculd::Plan::NotNumberError
      next
    rescue
    end
  end
end