Class: TasksCLI::TaskManager
- Inherits:
-
Object
- Object
- TasksCLI::TaskManager
- Defined in:
- lib/tasks_cli/task_manager.rb
Instance Method Summary collapse
- #all_tasks ⇒ Object
- #filter_tasks(criteria) ⇒ Object
- #find_task(number) ⇒ Object
-
#initialize ⇒ TaskManager
constructor
A new instance of TaskManager.
- #load_tasks ⇒ Object
- #parse_csv_manually ⇒ Object
- #parse_field(field) ⇒ Object
- #save_tasks(task_number) ⇒ Object
- #update_status(number, new_status) ⇒ Object
Constructor Details
#initialize ⇒ TaskManager
Returns a new instance of TaskManager.
9 10 11 12 |
# File 'lib/tasks_cli/task_manager.rb', line 9 def initialize @file_path = File.('~/tasks.csv') load_tasks end |
Instance Method Details
#all_tasks ⇒ Object
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_tasks ⇒ Object
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.}" end end rescue CSV::MalformedCSVError => e puts Rainbow("Error reading CSV: #{e.}. Trying to parse with alternative method...").red parse_csv_manually rescue StandardError => e puts Rainbow("Unexpected error while loading tasks: #{e.}").red puts e.backtrace end |
#parse_csv_manually ⇒ Object
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.}" 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. 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 |