Skip to content

Instantly share code, notes, and snippets.

@pzaich
Created June 22, 2012 08:39
Show Gist options
  • Select an option

  • Save pzaich/2971384 to your computer and use it in GitHub Desktop.

Select an option

Save pzaich/2971384 to your computer and use it in GitHub Desktop.
To Do Terminal App
require 'time'
require 'csv'
class TaskItem
attr_accessor :task, :created_at, :completed, :completed_at
###Intialize with optional hash values for existing todos
def initialize(task_string, optional_values = {})
values = {created_at: Time.now, completed: false, completed_at: ""}.merge(optional_values)
@task = task_string
@created_at = values[:created_at]
@completed = values[:completed]
@completed_at = values[:completed_at]
end
def complete!
@completed = true
@completed_at = Time.now
self
end
def return_task_item
"#{@task} | #{@created_at} | #{@completed} | #{@completed_at}"
end
def print_to_file
"#{@task},#{@created_at},#{@completed},#{@completed_at}"
end
end
class ToDoList
attr_accessor :incomplete_tasks, :complete_tasks
def initialize
@incomplete_tasks = []
@complete_tasks = []
@raw_list = CSV.open('todolist.csv', 'w+', {headers: true, header_converters: :symbol})
add_items_from_file
end
### Load existing tasks into task arrays as TaskItem Objects
def add_items_from_file
@raw_list.each do |line|
if line[:completed] != "true"
@incomplete_tasks << TaskItem.new(line[:task], created_at: Time.parse(line[:created_at]),
completed: line[:completed], completed_at: line[:completed_at] )
else
@complete_tasks << TaskItem.new(line[:task], created_at: Time.parse(line[:created_at]),
completed: line[:completed], completed_at: Time.parse(line[:completed_at]))
end
end
end
def save
@raw_list.rewind
@raw_list.each_by_index do |line|
task = @complete_tasks[line-1]
end
end
### Code to Write Back to File
#### Output the lists
def sort_by_creation_date
sorted_incomplete_tasks = @incomplete_tasks.sort_by { |task_item| task_item.created_at }
return_list(sorted_incomplete_tasks)
end
def sort_by_completion_date
sorted_complete_tasks = @complete_tasks.sort_by { |task_item| task_item.completed_at }.reverse
return_list(sorted_complete_tasks)
end
def return_list(list_of_items)
list_of_items.each_with_index do |task_item, index|
puts "#{index + 1}. #{task_item.return_task_item}"
end
end
def delete_task_at(item_number)
@incomplete_tasks.delete_at(item_number - 1)
end
##### Add new TaskItem Object to @incomplete_tasks
def add(task)
@incomplete_tasks << TaskItem.new(task)
end
def append(line_number, task)
@incomplete_tasks.insert(line_number, task)
end
def prepend(line_number, task)
@incomplete_tasks.insert(line_number-1, task)
end
### Complete task
def complete(index)
@complete_tasks << @incomplete_tasks[index - 1].complete!
delete_task_at(index - 1)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment