Class: TasksCLI::TaskManager

Inherits:
Object
  • Object
show all
Defined in:
lib/tasks_cli/task_manager.rb

Instance Method Summary collapse

Constructor Details

#initializeTaskManager

Returns a new instance of TaskManager.



9
10
11
12
# File 'lib/tasks_cli/task_manager.rb', line 9

def initialize
  @file_path = File.expand_path('~/tasks.csv')
  load_tasks
end

Instance Method Details

#all_tasksObject



75
76
77
# File 'lib/tasks_cli/task_manager.rb', line 75

def all_tasks
  @tasks[1..]
end

#filter_tasks(criteria) ⇒ Object



79
80
81
82
83
84
85
# File 'lib/tasks_cli/task_manager.rb', line 79

def filter_tasks(criteria)
  @tasks.select do |task|
    criteria.all? do |field, values|
      values.any? { |value| task.matches?(field, value) }
    end
  end
end

#find_task(number) ⇒ Object



87
88
89
# File 'lib/tasks_cli/task_manager.rb', line 87

def find_task(number)
  @tasks.find { |task| task.number == number }
end

#load_tasksObject



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/tasks_cli/task_manager.rb', line 14

def load_tasks
  @tasks = []
  CSV.foreach(@file_path, headers: false) do |row|
    next if row == ['Epic Name', 'Ticket Number', 'Ticket Name', 'Ticket Description', 'Priority', 'Status',
                    'Relates To', 'Blocked By']

    begin
      parsed_row = row.map { |field| parse_field(field) }
      @tasks << Task.new(parsed_row)
    rescue StandardError => e
      puts "Error processing row: #{row.inspect}"
      puts "Error message: #{e.message}"
    end
  end
rescue CSV::MalformedCSVError => e
  puts Rainbow("Error reading CSV: #{e.message}. Trying to parse with alternative method...").red
  parse_csv_manually
rescue StandardError => e
  puts Rainbow("Unexpected error while loading tasks: #{e.message}").red
  puts e.backtrace
end

#parse_csv_manuallyObject



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/tasks_cli/task_manager.rb', line 45

def parse_csv_manually
  @tasks = []
  lines = File.readlines(@file_path)
  lines[1..].each do |line|
    fields = line.strip.split(',')
    parsed_fields = fields.map { |field| parse_field(field) }
    @tasks << Task.new(parsed_fields)
  rescue StandardError => e
    puts "Error processing line: #{line}"
    puts "Error message: #{e.message}"
  end
end

#parse_field(field) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/tasks_cli/task_manager.rb', line 36

def parse_field(field)
  return field if field.nil? || !(field.start_with?('[') && field.end_with?(']'))

  parsed = JSON.parse(field.gsub('=>', ':'))
  [parsed[0], parsed[1]]
rescue JSON::ParserError
  [nil, field]
end

#save_tasks(task_number) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/tasks_cli/task_manager.rb', line 58

def save_tasks(task_number)
  lines = File.readlines(@file_path)
  File.open(@file_path, 'w') do |file|
    file.puts lines[0].chomp  # Write header as is
    lines[1..].each do |line|
      fields = line.strip.split(',').map { |f| parse_field(f) }
      if fields[1][1] == task_number
        task = find_task(task_number)
        updated_line = task.to_csv.map.with_index { |value, index| [fields[index][0], value].to_s }.join(',')
        file.puts updated_line
      else
        file.puts line.chomp  # Write unchanged lines as is
      end
    end
  end
end

#update_status(number, new_status) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/tasks_cli/task_manager.rb', line 91

def update_status(number, new_status)
  task = find_task(number)
  if task
    old_status = task.status
    task.instance_variable_set(:@status, new_status)
    task.update_timestamp
    save_tasks(number)
    TasksCLI.logger.info("Updated status of task #{number} from #{old_status} to #{new_status}")
    puts Rainbow("Updated status of task #{number} from #{old_status} to #{new_status}").green
    puts Rainbow("Last updated: #{TasksCLI.format_date(task.updated_at)}").cyan
  else
    TasksCLI.logger.warn("Task not found: #{number}")
    puts Rainbow('Task not found').red
  end
end