Created
February 27, 2014 20:04
-
-
Save jordanluyke/9258354 to your computer and use it in GitHub Desktop.
Todo module in Ruby; MVC
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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