lib/tasks.rb in tudu-0.0.1 vs lib/tasks.rb in tudu-0.0.2

- old
+ new

@@ -1,281 +1,289 @@ -# encoding: utf-8 - -module Tudu - #= Tudu::Tasks - class Tasks - #== Tudufile key - TUDU_FILE_KEY = :tudufile - #== todo key - TUDU_TODO_KEY = :todo - #== doing key - TUDU_DOING_KEY = :doing - #== done key - TUDU_DONE_KEY = :done - #== file's key - TUDU_KEYS = [TUDU_FILE_KEY, TUDU_TODO_KEY, TUDU_DOING_KEY, TUDU_DONE_KEY] - - #== Tudufile file name - TUDU_FILE = "Tudufile" - #== Tudufile file name - TUDU_DIR = "tudu" - #== todo file name - TUDU_TODOS_FILE = "todos" - #== todo file path - TUDU_TODOS_FILE_PATH = "./#{TUDU_DIR}/#{TUDU_TODOS_FILE}" - #== doing file name - TUDU_DOINGS_FILE = "doings" - #== doing file path - TUDU_DOINGS_FILE_PATH = "./#{TUDU_DIR}/#{TUDU_DOINGS_FILE}" - #== done file name - TUDU_DONES_FILE = "dones" - #== done file path - TUDU_DONES_FILE_PATH = "./#{TUDU_DIR}/#{TUDU_DONES_FILE}" - #== file names - INIT_FILES = { - TUDU_FILE_KEY => TUDU_FILE, - TUDU_TODO_KEY => TUDU_TODOS_FILE, - TUDU_DOING_KEY => TUDU_DOINGS_FILE, - TUDU_DONE_KEY => TUDU_DONES_FILE - } - #== task file names - TASK_FILES = { - TUDU_TODO_KEY => TUDU_TODOS_FILE, - TUDU_DOING_KEY => TUDU_DOINGS_FILE, - TUDU_DONE_KEY => TUDU_DONES_FILE - } - - #== Tudufile file template - TUDU_FILE_TEMPLATE =<<-EOS -# encoding: utf-8 - -# !!!!!!! in tudu ver 0.0.1 this file not using !!!!!!! - -# if you want to use notification, set target type. default => :none -# you can set :none, :mail -# target_type :mail - -# if you want to use notification, set targets. default => [] -# if you choose target_type none, you must not set targets. -# if you choose mail, you must set target email addresses. -# targets ["target1@abcdefg", "target2@abcdefg"] - EOS - - #== todo file template - TUDU_TODOS_FILE_TEMPLATE = "" - #== doing file template - TUDU_DOINGS_FILE_TEMPLATE = "" - #== done file template - TUDU_DONES_FILE_TEMPLATE = "" - - #== template files - INIT_FILES_TEMPLATE = { - TUDU_FILE_KEY => TUDU_FILE_TEMPLATE, - TUDU_TODO_KEY => TUDU_TODOS_FILE_TEMPLATE, - TUDU_DOING_KEY => TUDU_DOINGS_FILE_TEMPLATE, - TUDU_DONE_KEY => TUDU_DONES_FILE_TEMPLATE - } - - #== task type [todo, doing, done] - attr_accessor :type - #== task name [uniq] - attr_accessor :name - - class << self - #== add task to todos - #=== Params - #- task_names : add task name list - def add(*task_names) - task_names.each do |task_name| - if find_tasks(task_name) - puts "#{task_name} is already exists." - next - end - File.open(TUDU_TODOS_FILE_PATH, "a:UTF-8") {|f|f.puts task_name} - puts "complete add todo '#{task_name}' to tudu/todos" - end - end - - #== remove task to todo - #=== Params - #- task_names : remove task name list - def remove(*task_names) - task_names.each do |task_name| - can_find = false - TASK_FILES.each_value do |rf| - tasks = get_tasks_from_file(rf) - next unless has_task?(tasks, task_name) - remove_task(tasks, task_name, "./#{TUDU_DIR}/#{rf}") - can_find = true - break - end - puts "no such todo '#{task_name}'" unless can_find - end - end - - #== choose todo => doing task - #=== Params - #- task_name : target task name - def choose(task_name) - if get_doings.size > 0 - puts "before choose, you must done current doings." - return - end - - task = find_tasks(task_name) - - if task.nil? - puts "#{task_name} not exists" - return - end - - unless task.todo? - puts "#{task_name} is not exists in todos. #{task_name} in #{task.type}" - return - end - - remove task_name - File.open(TUDU_DOINGS_FILE_PATH, "w:UTF-8") {|f|f.puts task_name} - puts "complete add doings '#{task_name}'" - end - - #== doing to done - #- if doings size == 0, nothing todo. - #- after move doing to done, next todo move to doing. - def done - return unless doings_to_dones - todos_to_doings - end - - #== get todos type tasks. - #=== Returns - # return Array[Tasks] - def get_todos - get_tasks(TUDU_TODOS_FILE) - end - - #== get doings type tasks. - #=== Returns - # return Array[Tasks] - def get_doings - get_tasks(TUDU_DOINGS_FILE) - end - - #== get dones type tasks. - #=== Returns - # return Array[Tasks] - def get_dones - get_tasks(TUDU_DONES_FILE) - end - - #== get each type tasks. - #=== Params - #- type : task type.if use nil, you can get all types task. - #=== Returns - # return Array[Tasks] - def get_tasks(type = nil) - type.nil? ? get_all_tasks : get_each_tasks(type) - end - - #== get each type tasks from file. - #=== Params - #- type : task type. - #=== Returns - # return Array[String] - def get_tasks_from_file(file_name) - File.read("./#{TUDU_DIR}/#{file_name}").split("\n") - end - - #== filter tasklist by search_word. - #=== Params - #- tasks : task list. - #- search_word : filtering word. - #=== Returns - # return filterd task list - def filter_tasks(tasks, search_word) - return tasks if search_word.nil? - tasks.select {|task|task.name.match /.*#{search_word}.*/} - end - - #== find task from all tasks. - #=== Params - #- task_name : task name. - #=== Returns - # return task - def find_tasks(task_name) - tasks = get_tasks - tasks.select {|task|task.name == task_name}.first - end - - private - def get_each_tasks(type) - tasks = [] - get_tasks_from_file(type).each {|task|tasks << Tasks.new(type, task)} - tasks - end - - def get_all_tasks - tasks = [] - TASK_FILES.each_value {|each_type|tasks += get_each_tasks(each_type)} - tasks - end - - def has_task?(tasks, task_name) - tasks.include? task_name - end - - def remove_task(tasks, task_name, file_path) - tasks.delete(task_name) - File.open(file_path, "w:UTF-8") {|wf|wf.puts tasks.join("\n")} - puts "complete remove todo '#{task_name}' from #{file_path}" - end - - def doings_to_dones - _doings = get_doings - if _doings.size == 0 - puts "there is no doing task.before done, you must choose task." - return false - end - File.open(TUDU_DOINGS_FILE_PATH, "w:UTF-8") {|f|f.print ""} - File.open(TUDU_DONES_FILE_PATH, "a:UTF-8") {|f|f.puts _doings.first.name} - true - end - - def todos_to_doings - _todos = get_todos - return if _todos.size == 0 - deleted_todos = _todos.dup - deleted_todos.delete_at 0 - File.open(TUDU_TODOS_FILE_PATH, "w:UTF-8") do |f| - deleted_todos.each {|task|f.puts task.name} - end - File.open(TUDU_DOINGS_FILE_PATH, "w:UTF-8") {|f|f.puts _todos.first.name} - end - end - - #== init task with setting task type and task name. - def initialize(type, name) - @type, @name = type, name - end - - def todo? - @type == "todos" - end - - def doing? - @type == "doings" - end - - def done? - @type == "dones" - end - - def ==(other) - if self.name == other.name - if self.type == other.type - return true - end - end - false - end - end -end +# encoding: utf-8 + +module Tudu + #= Tudu::Tasks + class Tasks + #== Tudufile key + TUDU_FILE_KEY = :tudufile + #== todo key + TUDU_TODO_KEY = :todo + #== doing key + TUDU_DOING_KEY = :doing + #== done key + TUDU_DONE_KEY = :done + #== file's key + TUDU_KEYS = [TUDU_FILE_KEY, TUDU_TODO_KEY, TUDU_DOING_KEY, TUDU_DONE_KEY] + + #== Tudufile file name + TUDU_FILE = "Tudufile" + #== Tudufile file name + TUDU_DIR = "tudu" + #== todo file name + TUDU_TODOS_FILE = "todos" + #== todo file path + TUDU_TODOS_FILE_PATH = "./#{TUDU_DIR}/#{TUDU_TODOS_FILE}" + #== doing file name + TUDU_DOINGS_FILE = "doings" + #== doing file path + TUDU_DOINGS_FILE_PATH = "./#{TUDU_DIR}/#{TUDU_DOINGS_FILE}" + #== done file name + TUDU_DONES_FILE = "dones" + #== done file path + TUDU_DONES_FILE_PATH = "./#{TUDU_DIR}/#{TUDU_DONES_FILE}" + #== file names + INIT_FILES = { + TUDU_FILE_KEY => TUDU_FILE, + TUDU_TODO_KEY => TUDU_TODOS_FILE, + TUDU_DOING_KEY => TUDU_DOINGS_FILE, + TUDU_DONE_KEY => TUDU_DONES_FILE + } + #== task file names + TASK_FILES = { + TUDU_TODO_KEY => TUDU_TODOS_FILE, + TUDU_DOING_KEY => TUDU_DOINGS_FILE, + TUDU_DONE_KEY => TUDU_DONES_FILE + } + + #== Tudufile file template + TUDU_FILE_TEMPLATE =<<-EOS +# encoding: utf-8 + +# !!!!!!! in tudu ver 0.0.1 this file not using !!!!!!! + +# if you want to use notification, set target type. default => :none +# you can set :none, :mail +# target_type :mail + +# if you want to use notification, set targets. default => [] +# if you choose target_type none, you must not set targets. +# if you choose mail, you must set target email addresses. +# targets ["target1@abcdefg", "target2@abcdefg"] + EOS + + #== todo file template + TUDU_TODOS_FILE_TEMPLATE = "" + #== doing file template + TUDU_DOINGS_FILE_TEMPLATE = "" + #== done file template + TUDU_DONES_FILE_TEMPLATE = "" + + #== template files + INIT_FILES_TEMPLATE = { + TUDU_FILE_KEY => TUDU_FILE_TEMPLATE, + TUDU_TODO_KEY => TUDU_TODOS_FILE_TEMPLATE, + TUDU_DOING_KEY => TUDU_DOINGS_FILE_TEMPLATE, + TUDU_DONE_KEY => TUDU_DONES_FILE_TEMPLATE + } + + #== task type [todo, doing, done] + attr_accessor :type + #== task name [uniq] + attr_accessor :name + + class << self + #== add task to todos + #=== Params + #- task_names : add task name list + def add(*task_names) + task_names.each do |task_name| + if find_tasks(task_name) + puts "#{task_name} is already exists."; + next + end + File.open(TUDU_TODOS_FILE_PATH, "a:UTF-8") {|f|f.puts task_name} + puts "complete add todo '#{task_name}' to tudu/todos" + end + end + + #== remove task to todo + #=== Params + #- task_names : remove task name list + def remove(*task_names) + task_names.each do |task_name| + can_find = false + TASK_FILES.each_value do |rf| + tasks = get_tasks_from_file(rf) + next unless has_task?(tasks, task_name) + remove_task(tasks, task_name, "./#{TUDU_DIR}/#{rf}") + can_find = true + break + end + puts "no such todo '#{task_name}'" unless can_find + end + end + + #== choose todo => doing task + #=== Params + #- task_name : target task name + def choose(task_name) + if get_todos.size == 0 + puts "todos is empty." + return + end + if get_doings.size > 0 + puts "before choose, you must done current doings." + return + end + task_name = get_first_todo_name_if_nil_or_empty task_name + task = find_tasks(task_name) + if task.nil? + puts "#{task_name} not exists" + return + end + unless task.todo? + puts "#{task_name} is not exists in todos. #{task_name} in #{task.type}" + return + end + remove task_name + File.open(TUDU_DOINGS_FILE_PATH, "w:UTF-8") {|f|f.puts task_name} + puts "complete add doings '#{task_name}'" + end + + #== doing to done + #- if doings size == 0, nothing todo. + #- after move doing to done, next todo move to doing. + def done + return unless doings_to_dones + todos_to_doings + end + + #== get todos type tasks. + #=== Returns + # return Array[Tasks] + def get_todos + get_tasks(TUDU_TODOS_FILE) + end + + #== get doings type tasks. + #=== Returns + # return Array[Tasks] + def get_doings + get_tasks(TUDU_DOINGS_FILE) + end + + #== get dones type tasks. + #=== Returns + # return Array[Tasks] + def get_dones + get_tasks(TUDU_DONES_FILE) + end + + #== get each type tasks. + #=== Params + #- type : task type.if use nil, you can get all types task. + #=== Returns + # return Array[Tasks] + def get_tasks(type = nil) + type.nil? ? get_all_tasks : get_each_tasks(type) + end + + #== get each type tasks from file. + #=== Params + #- type : task type. + #=== Returns + # return Array[String] + def get_tasks_from_file(file_name) + File.read("./#{TUDU_DIR}/#{file_name}").split("\n") + end + + #== filter tasklist by search_word. + #=== Params + #- tasks : task list. + #- search_word : filtering word. + #=== Returns + # return filterd task list + def filter_tasks(tasks, search_word) + return tasks if search_word.nil? + tasks.select {|task|task.name.match /.*#{search_word}.*/} + end + + #== find task from all tasks. + #=== Params + #- task_name : task name. + #=== Returns + # return task + def find_tasks(task_name) + tasks = get_tasks + tasks.select {|task|task.name == task_name}.first + end + + private + def get_first_todo_name_if_nil_or_empty(task_name) + (task_name.nil? || task_name.empty?) ? get_todos.first.name : task_name + end + + def get_each_tasks(type) + tasks = [] + get_tasks_from_file(type).each {|task|tasks << Tasks.new(type, task)} + tasks + end + + def get_all_tasks + tasks = [] + TASK_FILES.each_value {|each_type|tasks += get_each_tasks(each_type)} + tasks + end + + def has_task?(tasks, task_name) + tasks.include? task_name + end + + def remove_task(tasks, task_name, file_path) + tasks.delete(task_name) + contents = tasks.size == 0 ? "" : tasks.join("\n") + "\n" + File.open(file_path, "w:UTF-8") {|wf|wf.print contents} + puts "complete remove todo '#{task_name}' from #{file_path}" + end + + def doings_to_dones + _doings = get_doings + if _doings.size == 0 + puts "there is no doing task.before done, you must choose task." + return false + end + File.open(TUDU_DOINGS_FILE_PATH, "w:UTF-8") {|f|f.print ""} + File.open(TUDU_DONES_FILE_PATH, "a:UTF-8") {|f|f.puts _doings.first.name} + true + end + + def todos_to_doings + _todos = get_todos + if _todos.size == 0 + puts "All Tasks Finish!!" if get_doings.size == 0 + return + end + + deleted_todos = _todos.dup + deleted_todos.delete_at 0 + File.open(TUDU_TODOS_FILE_PATH, "w:UTF-8") do |f| + deleted_todos.each {|task|f.puts task.name} + end + File.open(TUDU_DOINGS_FILE_PATH, "w:UTF-8") {|f|f.puts _todos.first.name} + end + end + + #== init task with setting task type and task name. + def initialize(type, name) + @type, @name = type, name + end + + def todo? + @type == "todos" + end + + def doing? + @type == "doings" + end + + def done? + @type == "dones" + end + + def ==(other) + if self.name == other.name + return true if self.type == other.type + end + false + end + end +end