class TaskwarriorWeb::Task

MAIN TASK CLASS

Attributes

_errors[RW]
annotations[RW]
depends[RW]
description[RW]
due[RW]
end[RW]
entry[RW]
priority[RW]
project[RW]
remove_tags[RW]
start[RW]
status[RW]
tags[RW]
urgency[RW]
uuid[RW]
wait[RW]

Public Class Methods

count(*args) click to toggle source

Get the number of tasks for some paramters.

# File lib/taskwarrior-web/model/task.rb, line 116
def self.count(*args)
  self.query(*args).count
end
exists?(uuid) click to toggle source

Whether or not a given task exists. Basically sugar for Task.find, but returns a boolean instead of the actual task.

# File lib/taskwarrior-web/model/task.rb, line 89
def self.exists?(uuid)
  !!self.find(uuid)
end
find(uuid) click to toggle source

Get a single task by UUID or ID. Returns nil if no such task was found.

# File lib/taskwarrior-web/model/task.rb, line 80
def self.find(uuid)
  tasks = Parser.parse(Command.new(:query, nil, :uuid => uuid).run)
  tasks.empty? ? nil : Task.new(tasks.first)
end
method_missing(method_sym, *arguments, &block) click to toggle source

Define method_missing to implement dynamic finder methods

Calls superclass method
# File lib/taskwarrior-web/model/task.rb, line 121
def self.method_missing(method_sym, *arguments, &block)
  match = TaskDynamicFinderMatch.new(method_sym)
  if match.match? 
    self.query(match.attribute.to_s => arguments.first.to_s)
  else
    super
  end
end
new(attributes = {}) click to toggle source

MODEL METHODS FOR INDIVIDUAL TASKS

# File lib/taskwarrior-web/model/task.rb, line 16
def initialize(attributes = {})
  attributes.each do |attr, value|
    send("#{attr}=", value) if respond_to?(attr.to_sym)
  end

  @_errors = []
  @tags = [] if @tags.nil?
  @annotations = [] if @annotations.nil?
end
query(*args) click to toggle source

Run queries, returns an array of tasks that meet the criteria.

Filters can either be a hash of conditions, or an already-constructed taskwarrior filter string.

For example: { :description => 'test', 'project.not' => '' } 'description:test project.not:'

# File lib/taskwarrior-web/model/task.rb, line 103
def self.query(*args)
  tasks = []
  if !args.empty? && args.first.is_a?(String)
    command = Command.new(:query, nil, :description => args.first)
  else
    command = Command.new(:query, nil, *args)
  end
  Parser.parse(command.run).each { |result| tasks << Task.new(result) }
  tasks
end
respond_to?(method_sym, include_private = false) click to toggle source

Implement respond_to? so that our dynamic finders are declared

Calls superclass method
# File lib/taskwarrior-web/model/task.rb, line 131
def self.respond_to?(method_sym, include_private = false)
  if TaskDynamicFinderMatch.new(method_sym).match?
    true
  else
    super
  end
end

Public Instance Methods

active?() click to toggle source
# File lib/taskwarrior-web/model/task.rb, line 61
def active?
  status.in? ['pending', 'waiting']
end
annotations=(annotations) click to toggle source

Create annotation instances.

# File lib/taskwarrior-web/model/task.rb, line 48
def annotations=(annotations)
  @annotations = []
  annotations.each do |annotation|
    annotation.merge({ :task_id => self.uuid })
    @annotations << Annotation.new(annotation)
  end
end
complete!() click to toggle source
# File lib/taskwarrior-web/model/task.rb, line 30
def complete!
  Command.new(:complete, self.uuid).run
end
delete!() click to toggle source
# File lib/taskwarrior-web/model/task.rb, line 34
def delete!
  Command.new(:delete, self.uuid).run
end
is_valid?() click to toggle source
# File lib/taskwarrior-web/model/task.rb, line 56
def is_valid?
  @_errors << 'You must provide a description' if self.description.blank?
  @_errors.empty?
end
save!() click to toggle source
# File lib/taskwarrior-web/model/task.rb, line 26
def save!
  @uuid ? Command.new(:update, uuid, self.to_hash).run : Command.new(:add, nil, self.to_hash).run
end
tags=(value) click to toggle source

Make sure that the tags are an array.

# File lib/taskwarrior-web/model/task.rb, line 39
def tags=(value)
  @tags = value.is_a?(String) ? value.split(/[, ]+/).reject(&:empty?) : value

  if @uuid
    @remove_tags = Task.find_by_uuid(uuid).first.tags - @tags
  end
end
to_hash() click to toggle source
# File lib/taskwarrior-web/model/task.rb, line 65
def to_hash
  Hash[instance_variables.select { |var| !var.to_s.start_with?('@_') }.map { |var| [var[1..-1].to_sym, instance_variable_get(var)] }]
end
to_s() click to toggle source
# File lib/taskwarrior-web/model/task.rb, line 69
def to_s
  description.truncate(20)
end