Skip to content

Instantly share code, notes, and snippets.

@jordanluyke
Created February 27, 2014 20:04
Show Gist options
  • Save jordanluyke/9258354 to your computer and use it in GitHub Desktop.
Save jordanluyke/9258354 to your computer and use it in GitHub Desktop.
Todo module in Ruby; MVC
module Todo
require 'json'
class Controller
def initialize
@list = List.new
end
def run(args)
@list.read_input(args)
end
end
class List
def read_input(args)
command_arg = args[0]
property_arg = args.drop(1).join(" ")
file_name = './todo.json'
task_array = read_file(file_name)
case command_arg
when "add"
tasks = add_task(task_array, property_arg)
when "display"
Viewer.render_display_tasks(task_array)
when "delete"
tasks = delete(task_array, property_arg)
when "complete"
tasks = complete(task_array, property_arg)
else
Viewer.render_input_error
end
write_file(task_array, file_name)
end
private
def read_file(file_name)
file_str = File.open(file_name, 'r').read
hashes = JSON.parse(file_str)
hashes_to_tasks(hashes)
end
def write_file(task_array, file_name)
my_hash = tasks_to_hashes(task_array)
hash_str = JSON.generate(my_hash)
File.open(file_name, 'w').write(hash_str)
end
def hashes_to_tasks(hashes) # read_file
task_obj_array = []
hashes.each_pair do |key, value|
message = ""
deleted = false
completed = false
value.each_pair do |sub_key, sub_value| #every task
message = sub_value if sub_key == "message"
deleted = sub_value if sub_key == "deleted"
completed = sub_value if sub_key == "completed"
end
task_obj_array << Task.new(key, deleted, message, completed)
end
task_obj_array
end
def tasks_to_hashes(task_array) # write_file
temp_hash = {}
task_array.each do |task|
temp_hash.merge!({ task.name => { "deleted" => task.deleted, "message" => task.message, "completed" => task.completed } })
end
temp_hash
end
def add_task(task_array, property_arg)
task_array << Task.new("task#{task_array.length+1}", false, property_arg, false)
task_array
end
def complete(task_array, task_index)
task_array[task_index.to_i - 1].set_completed(true)
task_array
end
def delete(task_array, task_index)
task_array[task_index.to_i - 1].set_deleted(true)
task_array
end
end
class Task
attr_reader :name, :deleted, :message, :completed
def initialize(name, deleted, message, completed)
@name = name
@deleted = deleted
@message = message
@completed = completed
end
def set_deleted(bool)
@deleted = bool
end
def set_completed(bool)
@completed = bool
end
end
class Viewer
class << self
def render_display_tasks(task_array)
puts "-" * 60
puts "Here are the tasks that are on your list: "
task_array.each do |task|
puts "[#{task.completed ? "X" : " "}] #{task.name}: #{task.message}" if task.deleted == false
end
puts "-" * 60
end
def render_input_error
puts "There was an error with the command."
end
end
end
end
todo_app = Todo::Controller.new
todo_app.run(ARGV)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment