class Nin::Command

Constants

COMMANDS_WITH_ARGS

Public Class Methods

new(command, args, config = {}) click to toggle source
# File lib/nin/command.rb, line 5
def initialize(command, args, config = {})
  @command = command
  @args    = args
  @config  = config
  @todo    = Todo.new(collect_config, collect_options)

  validate_args
end

Public Instance Methods

call() click to toggle source
# File lib/nin/command.rb, line 14
def call
  case @command
  when 'l', 'list'
    @todo.list
  when 'a', 'add'
    desc, date, tags = parse_item_desc(@args.join(' '))
    @todo.add(desc, date, tags)
  when 'e', 'edit'
    desc, date, tags = parse_item_desc(@args[1..-1].join(' '))
    @todo.edit(@args[0].to_i, desc, date, tags)
  when 'p', 'prioritize'
    @todo.prioritize(@args[0].to_i, @args[1].to_i)
  when 'c', 'complete'
    @todo.complete(*@args)
  when 'ac', 'archive'
    @todo.archive(*@args)
  when 'd', 'delete'
    @todo.delete(*@args)
  when 'gc', 'garbage'
    @todo.delete_archived
  when 's', 'analyze'
    @todo.analyze
  when 'i', 'repl'
    run_interactive_mode
  when 'o', 'open'
    system("`echo $EDITOR` #{@todo.store.file}")
  when 'v', 'version'
    puts "nin #{Nin::VERSION}"
  else
    puts "NAME:\n\tnin - a simple, full-featured command line todo app"
    puts "\nUSAGE:\n\tnin COMMAND [arguments...]"
    puts "\nCOMMANDS:"
    puts "\tl  | list          [a|l]      List all unarchived todos. Pass optional argument `a` to list all todos or `l` to list local todos only"
    puts "\ta  | add           desc       Add a todo. Prepend due date by a @. Prepend each tag by a \\#"
    puts "\te  | edit          id desc    Edit a todo. Prepend due date by a @. Prepend each tag by a \\#"
    puts "\tp  | prioritize    id step    Prioritize a todo by either a positive or negative step within its date group"
    puts "\tc  | complete      id(s)      Un/complete todo(s)"
    puts "\tac | archive       id(s)|c    Un/archive todo(s) or pass `c` to archive all completed items"
    puts "\td  | delete        id(s)      Delete todo(s)"
    puts "\tgc | garbage                  Delete all archived todos. Resets item ids as a side effect"
    puts "\ts  | analyze                  Analyze tasks and print statistics"
    puts "\ti  | repl                     Open nin in REPL mode"
    puts "\to  | open                     Open todo file in $EDITOR"
    puts "\tv  | version                  Print current version of nin"
  end
end

Private Instance Methods

collect_config() click to toggle source
# File lib/nin/command.rb, line 63
def collect_config
  config = { store: YamlStore.new }

  _client_name        = @config.fetch(:integration_client, nil)
  _client_credentials = @config.fetch(:integration_client_token, nil)
  _timeout_interval   = @config.fetch(:integration_timeout_interval, 60)
  if _client_name && _client_credentials
    _client_klass       = Object.const_get("Nin::Integration::#{_client_name.capitalize}::Client")
    _synchronizer_klass = Object.const_get("Nin::Integration::Synchronizer::#{_client_name.capitalize}")

    config[:integration_syncrhonizer] = _synchronizer_klass.new(_client_klass.new(_client_credentials), _timeout_interval)
  end

  config
end
collect_options() click to toggle source
# File lib/nin/command.rb, line 79
def collect_options
  options = { archived: false, local: false, completed_only: false }

  if @command == 'l' && @args[0] == 'a'
    options[:archived] = true
  elsif @command == 'l' && @args[0] == 'l'
    options[:local] = true
  elsif @command == 'ac' && @args[0] == 'c'
    options[:completed_only] = true
  end

  options
end
parse_item_desc(desc) click to toggle source
# File lib/nin/command.rb, line 93
def parse_item_desc(desc)
  begin
    Parser.new(desc).call
  rescue InvalidDateFormatError
    puts "Invalid date format."
    exit
  end
end
run_interactive_mode() click to toggle source
# File lib/nin/command.rb, line 108
def run_interactive_mode
  while line = Readline.readline("nin> ", true)
    line = line.split(' ')

    Command.new(line[0], line[1..-1]).call
  end
end
validate_args() click to toggle source
# File lib/nin/command.rb, line 102
def validate_args
  COMMANDS_WITH_ARGS.each do |command|
    raise EmptyCommandArgumentError if @command == command && @args.empty?
  end
end