module Ptf::Commands::Task::Edit

Public Class Methods

edit(id) click to toggle source
# File lib/ptf/commands/task/edit.rb, line 95
def edit(id)
  unless Ptf::FileSystem.id_exist? (id)
    return "The task #{id} does not exist"
  end

  metadata_file = Ptf::FileSystem.find_file id

  if metadata_file.nil?
    return "The task #{id} has been closed. Reopen it with ptf task reopen ###."
  end

  # Get hash from file
  metadata = Ptf::MetadataFile.create_from_file(metadata_file)
  data_file_name = metadata.hash
  data_file = File.join(Ptf::FileSystem.data_dir, data_file_name)

  # Create a copy in tmp foldere
  tmp_file_path = File.join(Ptf::FileSystem.tmp_dir, data_file_name)
  FileUtils.copy data_file, tmp_file_path
  edit_succeeded = system("vim #{data_file}")

  if !edit_succeeded
    # Move tmp file back, then remove it

    FileUtils.copy tmp_file_path, data_file
    FileUtils.remove_file tmp_file_path
    return "Vim edit failed. Aborting changes."
  end

  if verify_file(data_file, metadata)
    FileUtils.remove_file tmp_file_path
    return "Edit successful!"
  else
    FileUtils.copy tmp_file_path, data_file
    FileUtils.remove_file tmp_file_path
    return "File verification failed. Aborting changes."
  end
end
verify_due(line, metadata) click to toggle source
# File lib/ptf/commands/task/edit.rb, line 54
def verify_due(line, metadata)
  due_line_regex = /^#Due: ?(\d\d\d\d[01]\d[0-3]\d[0-2]\d[0-5]\d[0-5]\d)?$/

  base, date = due_line_regex.match(line).to_a

  if !base.nil? && date.nil?
    metadata.set_due_date nil
    return [true, metadata]
  end

  begin
    datetime = Ptf::Date.str_to_datetime date
  rescue
    return [false, metadata]
  end

  metadata.set_due_date datetime
  [!datetime.nil?, metadata]
end
verify_estimate(line, metadata) click to toggle source
# File lib/ptf/commands/task/edit.rb, line 74
def verify_estimate(line, metadata)
  estimate_line_regex = /^#Estimate: ?(\d+)?$/

  base, estimate = estimate_line_regex.match(line).to_a

  if !base.nil? && estimate.nil?
    metadata.set_estimate nil
    return [true, metadata]
  elsif base.nil?
    return [false, metadata]
  end

  estimate = estimate.to_i
  if estimate != 0
    metadata.set_estimate estimate
    return [true, metadata]
  else
    return [false, metadata]
  end
end
verify_file(file, metadata) click to toggle source
# File lib/ptf/commands/task/edit.rb, line 7
def verify_file(file, metadata)
  title_line, due_date_line, estimate_line = File.foreach(file).first(3)

  did_succeed, updated_metadata = verify_title_line title_line, metadata
  return false unless did_succeed

  did_succeed, updated_metadata = verify_due due_date_line, updated_metadata
  return false unless did_succeed

  did_succeed, updated_metadata = verify_estimate estimate_line, updated_metadata
  return false unless did_succeed

  updated_metadata.write_to_file
  did_succeed
end
verify_group(str, metadata) click to toggle source
# File lib/ptf/commands/task/edit.rb, line 32
def verify_group(str, metadata)
  return false unless !str.nil? && str.is_a?(String)

  Ptf::Group.group_exist?(str) && metadata.group.abbreviation == str
end
verify_id(str, metadata) click to toggle source
# File lib/ptf/commands/task/edit.rb, line 38
def verify_id(str, metadata)
  return false unless !str.nil? && str.is_a?(String)

  str.to_i == metadata.id
end
verify_title(str, metadata) click to toggle source
# File lib/ptf/commands/task/edit.rb, line 44
def verify_title(str, metadata)
  return false unless !str.nil? && str.is_a?(String)

  if str != metadata.title
    metadata.set_title str
  end

  [true, metadata]
end
verify_title_line(line, metadata) click to toggle source
# File lib/ptf/commands/task/edit.rb, line 23
def verify_title_line(line, metadata)
  title_line_regex = /^#([A-Z]+)--(\d+)\s([ a-zA-Z0-9]+)$/

  _, group, id, title = title_line_regex.match(line).to_a

  is_title_valid, updated_metadata = verify_title title, metadata
  [(verify_group group, metadata) && (verify_id id, metadata) && is_title_valid, updated_metadata]
end