to-do 1.2.1 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +2 -3
- data/README.md +11 -10
- data/VERSION +1 -1
- data/lib/to-do.rb +36 -4
- data/lib/to-do/cli.rb +91 -42
- data/lib/to-do/config.rb +5 -1
- data/lib/to-do/tasks.rb +109 -0
- data/to-do.gemspec +9 -9
- metadata +22 -22
- data/lib/to-do/list.rb +0 -161
data/Gemfile
CHANGED
@@ -6,9 +6,8 @@ source "http://rubygems.org"
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
gem "shoulda", ">= 0"
|
9
|
-
gem "
|
10
|
-
|
11
|
-
gem "bundler", "~> 1.0.0"
|
9
|
+
gem "sqlite3", ">=0"
|
10
|
+
gem "bundler", ">= 1.0.0"
|
12
11
|
gem "jeweler", "~> 1.8.4"
|
13
12
|
gem "simplecov", ">= 0"
|
14
13
|
gem "colorize", ">= 0"
|
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
#to-do 1.2.
|
1
|
+
#to-do 1.2.2
|
2
2
|
|
3
|
-
A simple command line todo application.
|
3
|
+
A simple command line todo application written in Ruby.
|
4
4
|
|
5
|
-
##What's new 1.2.
|
5
|
+
##What's new 1.2.2
|
6
|
+
* Switch from yaml to sqlite for data persistence
|
6
7
|
* Bug Fixes
|
7
8
|
|
8
9
|
##What's new in 1.2
|
@@ -16,13 +17,13 @@ A simple command line todo application.
|
|
16
17
|
##Features
|
17
18
|
* Basic todo list functionality
|
18
19
|
* Add items
|
19
|
-
*
|
20
|
+
* Complete items
|
21
|
+
* Clear list
|
22
|
+
* Display list
|
20
23
|
* Multiple lists
|
21
|
-
* Clear list
|
22
|
-
* Display list
|
23
24
|
* Colored display
|
24
|
-
* Undo
|
25
|
-
*
|
25
|
+
* Undo Completing
|
26
|
+
* Remove lists
|
26
27
|
|
27
28
|
##How to Use
|
28
29
|
|
@@ -73,7 +74,7 @@ A simple command line todo application.
|
|
73
74
|
todo undo write paper
|
74
75
|
todo u -n 2
|
75
76
|
|
76
|
-
###Clear completed tasks
|
77
|
+
###Clear completed tasks and reset completed count
|
77
78
|
|
78
79
|
todo clear
|
79
80
|
|
@@ -99,7 +100,7 @@ A simple command line todo application.
|
|
99
100
|
* Tags
|
100
101
|
* Due Dates
|
101
102
|
* Tab Completion
|
102
|
-
*
|
103
|
+
* SQLite Backend
|
103
104
|
* Sorting
|
104
105
|
* Priorites
|
105
106
|
* Reorganizing
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.2
|
data/lib/to-do.rb
CHANGED
@@ -1,14 +1,46 @@
|
|
1
|
-
require '
|
1
|
+
require 'sqlite3'
|
2
2
|
require File.join(File.dirname(__FILE__), 'to-do', 'config')
|
3
|
-
require File.join(File.dirname(__FILE__), 'to-do', 'list')
|
4
3
|
if !File.exists?(File.join(ENV['HOME'], '.to-do'))
|
5
4
|
Dir.mkdir(File.join(ENV['HOME'], '.to-do'))
|
6
5
|
Todo::Config.write
|
7
|
-
Dir.mkdir(Todo::Config[:lists_directory])
|
8
|
-
#Todo::List.new "Default List"
|
9
6
|
end
|
7
|
+
|
8
|
+
# If the Database doesn't exist, create it
|
9
|
+
if !File.exists?(Todo::Config[:task_database])
|
10
|
+
Todo::Config.write
|
11
|
+
database = SQLite3::Database.new(Todo::Config[:task_database])
|
12
|
+
database.execute "CREATE TABLE Tasks(Id INTEGER PRIMARY KEY, Task_number INTEGER, Name TEXT, Completed INTEGER)"
|
13
|
+
database.execute "CREATE TABLE Lists(Id INTEGER PRIMARY KEY, Name TEXT, Total INTEGER)"
|
14
|
+
database.execute "CREATE TABLE Task_list(Task_id INTEGER, List_id INTEGER)"
|
15
|
+
|
16
|
+
# If you have existing lists from earlier versions stored in YAML, stick them
|
17
|
+
# in the sqlite database
|
18
|
+
if File.exists?(File.join(ENV['HOME'], '.to-do', 'lists'))
|
19
|
+
Dir.chdir(File.join(ENV['HOME'], '.to-do', 'lists')) do
|
20
|
+
lists = Dir.entries "."
|
21
|
+
lists.each do |file|
|
22
|
+
next if file == "." or file == ".."
|
23
|
+
list_object = YAML.load_file(file)
|
24
|
+
database.execute "INSERT INTO Lists (Name, Total) VALUES('" + list_object.name + "', " + list_object.count.to_s + ")"
|
25
|
+
list_id = database.last_insert_row_id
|
26
|
+
list_object.tasks.each do |num, task|
|
27
|
+
database.execute "INSERT INTO Tasks (Task_number, Name, Completed) VALUES('" + num.to_s + "', '" + task + "', 0)"
|
28
|
+
task_id = database.last_insert_row_id
|
29
|
+
database.execute "INSERT INTO Task_list VALUES(" + task_id.to_s + ", " + list_id.to_s + ")"
|
30
|
+
end
|
31
|
+
list_object.completed_tasks.each do |num, task|
|
32
|
+
database.execute "INSERT INTO Tasks (Task_number, Name, Completed) VALUES('" + num.to_s + "', '" + task + "', 1)"
|
33
|
+
task_id = database.last_insert_row_id
|
34
|
+
database.execute "INSERT INTO Task_list VALUES(" + task_id.to_s + ", " + list_id.to_s + ")"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
require File.join(File.dirname(__FILE__), 'to-do', 'tasks')
|
10
41
|
require File.join(File.dirname(__FILE__), 'to-do', 'cli')
|
11
42
|
|
43
|
+
|
12
44
|
# Todo is the main namespace that all of the other modules and classes are a
|
13
45
|
# part of
|
14
46
|
module Todo
|
data/lib/to-do/cli.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
require 'optparse'
|
2
2
|
require 'yaml'
|
3
3
|
require 'colorize'
|
4
|
+
require 'sqlite3'
|
4
5
|
|
5
6
|
module Todo
|
6
7
|
# CLI is the module that contains the methods to display the list as well as
|
7
8
|
# the methods to parse command line arguments.
|
8
9
|
module CLI
|
9
10
|
extend self
|
10
|
-
|
11
|
-
|
11
|
+
|
12
|
+
# The database
|
13
|
+
DATABASE = SQLite3::Database.new(Todo::Config[:task_database])
|
12
14
|
|
13
15
|
# The option flags
|
14
16
|
OPTIONS = {
|
@@ -32,21 +34,33 @@ module Todo
|
|
32
34
|
# 4. Task 4
|
33
35
|
#
|
34
36
|
# @param [List] list the list you want to display.
|
35
|
-
def display list =
|
37
|
+
def display list = []
|
38
|
+
tasks = DATABASE.execute "SELECT Task_number, Name, Completed FROM Tasks WHERE Id IN
|
39
|
+
(SELECT Task_id FROM Task_list WHERE List_id IN
|
40
|
+
(SELECT Id FROM Lists Where Lists.Name='" + Config[:working_list_name]+"'))"
|
41
|
+
tasks.sort!{|x, y| x[0] <=> y[0]}
|
42
|
+
list = DATABASE.execute("SELECT Total FROM Lists WHERE Name = '" + Config[:working_list_name] + "'")
|
43
|
+
count = list ? list[0][0] : 0
|
44
|
+
completed_count = 0
|
36
45
|
puts "********************************".colorize(:light_red)
|
37
|
-
puts
|
46
|
+
puts Config[:working_list_name].center(32).colorize(:light_cyan)
|
38
47
|
puts "********************************".colorize(:light_red)
|
39
48
|
puts
|
40
49
|
puts "Todo:".colorize(:light_green)
|
41
|
-
|
42
|
-
|
43
|
-
|
50
|
+
tasks.each do |task|
|
51
|
+
if task[2] == 1
|
52
|
+
completed_count +=1
|
53
|
+
next
|
54
|
+
end
|
55
|
+
printf "%4d. ".to_s.colorize(:light_yellow), task[0]
|
56
|
+
puts task[1]
|
44
57
|
end
|
45
58
|
print "\nCompleted:".colorize(:light_green)
|
46
|
-
printf "%36s\n", "#{
|
47
|
-
|
48
|
-
|
49
|
-
|
59
|
+
printf "%36s\n", "#{completed_count}/#{count}".colorize(:light_cyan)
|
60
|
+
tasks.each do |task|
|
61
|
+
next if task[2] == 0
|
62
|
+
printf "%4d. ".to_s.colorize(:light_yellow), task[0]
|
63
|
+
puts task[1]
|
50
64
|
end
|
51
65
|
puts
|
52
66
|
end
|
@@ -58,12 +72,12 @@ module Todo
|
|
58
72
|
opts.version = File.exist?(version_path) ? File.read(version_path) : ""
|
59
73
|
opts.banner = "Usage: todo [COMMAND] [option] [arguments]"
|
60
74
|
opts.separator "Commands:"
|
75
|
+
opts.separator " create, switch <list name> creates a new list or switches to an existing one"
|
61
76
|
opts.separator " <blank>, display, d displays the current list"
|
62
77
|
opts.separator " add, a <task> adds the task to the current list"
|
63
78
|
opts.separator " finish, f [option] <task> marks the task as completed"
|
64
|
-
opts.separator " clear [option] clears completed tasks"
|
65
79
|
opts.separator " undo, u [option] <task> undos a completed task"
|
66
|
-
opts.separator "
|
80
|
+
opts.separator " clear [option] clears completed tasks"
|
67
81
|
opts.separator " remove, rm <list name> removes the list completely (cannot undo)"
|
68
82
|
opts.separator "Options: "
|
69
83
|
opts.on('-n', 'with finish or undo, references a task by its number') do
|
@@ -78,7 +92,7 @@ module Todo
|
|
78
92
|
end
|
79
93
|
opts.on('-w', "displays the name of the current list") do
|
80
94
|
if Config[:working_list_exists]
|
81
|
-
puts "Working list is #{
|
95
|
+
puts "Working list is #{Config[:working_list_name]}"
|
82
96
|
else
|
83
97
|
puts "Working List does not exist yet. Please create one"
|
84
98
|
puts "todo create <list name>"
|
@@ -92,63 +106,63 @@ module Todo
|
|
92
106
|
def commands_parser
|
93
107
|
if ARGV.count > 0
|
94
108
|
case ARGV[0]
|
95
|
-
when "
|
109
|
+
when "display", "d"
|
96
110
|
if Config[:working_list_exists]
|
97
|
-
ARGV.count > 1 ? WORKING_LIST.add(ARGV[1..-1].join(' ')) : puts("Usage: todo add <task name>")
|
98
111
|
display
|
99
112
|
else
|
100
113
|
puts "Working List does not exist yet. Please create one"
|
101
114
|
puts "todo create <list name>"
|
102
115
|
end
|
103
|
-
when "
|
116
|
+
when "create", "switch"
|
117
|
+
if ARGV.count > 0
|
118
|
+
name = ARGV[1..-1].map{|word| word.capitalize}.join(' ')
|
119
|
+
Config[:working_list_name] = name
|
120
|
+
Config[:working_list_exists] = true
|
121
|
+
puts "Switch to #{name}"
|
122
|
+
puts
|
123
|
+
display
|
124
|
+
else
|
125
|
+
puts "Usage: todo #{ARGV[0]} <listname>"
|
126
|
+
end
|
127
|
+
when "add", "a"
|
104
128
|
if Config[:working_list_exists]
|
105
|
-
|
129
|
+
ARGV.count > 1 ? Tasks.add(ARGV[1..-1].join(' ')) : puts("Usage: todo add <task name>")
|
130
|
+
puts
|
106
131
|
display
|
107
132
|
else
|
108
133
|
puts "Working List does not exist yet. Please create one"
|
109
134
|
puts "todo create <list name>"
|
110
135
|
end
|
111
|
-
when "
|
136
|
+
when "finish", "f"
|
112
137
|
if Config[:working_list_exists]
|
113
|
-
|
138
|
+
ARGV.count > 1 ? Tasks.finish(ARGV[1..-1].join(' '), OPTIONS[:is_num]) : puts("Usage: todo finish <task name>")
|
139
|
+
puts
|
140
|
+
display
|
114
141
|
else
|
115
142
|
puts "Working List does not exist yet. Please create one"
|
116
143
|
puts "todo create <list name>"
|
117
144
|
end
|
118
|
-
when "
|
145
|
+
when "undo", "u"
|
119
146
|
if Config[:working_list_exists]
|
147
|
+
ARGV.count > 1 ? Tasks.undo(ARGV[1..-1].join(' '), OPTIONS[:is_num]) : puts("Usage: todo undo <task name>")
|
148
|
+
puts
|
120
149
|
display
|
121
150
|
else
|
122
151
|
puts "Working List does not exist yet. Please create one"
|
123
152
|
puts "todo create <list name>"
|
124
153
|
end
|
125
|
-
when "
|
126
|
-
if File.exists?(File.join(Config[:lists_directory], ARGV[1..-1].join('_').downcase + '.yml'))
|
127
|
-
Config[:working_list_name] = ARGV[1..-1].join('_').downcase
|
128
|
-
Config[:working_list_exists] = true
|
129
|
-
puts "Switch to #{ARGV[1..-1].join(' ')}"
|
130
|
-
new_list = YAML.load_file(File.join(Config[:lists_directory],
|
131
|
-
Config[:working_list_name]+'.yml')) if File.exists?(File.join(Config[:lists_directory],
|
132
|
-
Config[:working_list_name]+'.yml'))
|
133
|
-
display new_list
|
134
|
-
else
|
135
|
-
ARGV.count > 1 ? List.new(ARGV[1..-1].join(' ')) : puts("Usage: todo create <list_name> ")
|
136
|
-
new_list = YAML.load_file(File.join(Config[:lists_directory],
|
137
|
-
Config[:working_list_name]+'.yml')) if File.exists?(File.join(Config[:lists_directory],
|
138
|
-
Config[:working_list_name]+'.yml'))
|
139
|
-
display new_list
|
140
|
-
end
|
141
|
-
when "undo", "u"
|
154
|
+
when "clear"
|
142
155
|
if Config[:working_list_exists]
|
143
|
-
|
144
|
-
|
156
|
+
Tasks.clear OPTIONS[:clear_all]
|
157
|
+
puts
|
158
|
+
display
|
145
159
|
else
|
146
160
|
puts "Working List does not exist yet. Please create one"
|
147
161
|
puts "todo create <list name>"
|
148
|
-
end
|
162
|
+
end
|
149
163
|
when "remove", "r"
|
150
164
|
if ARGV.count > 1
|
151
|
-
|
165
|
+
Tasks.clear true, ARGV[1..-1].map{|word| word.capitalize}.join(' ')
|
152
166
|
end
|
153
167
|
else
|
154
168
|
puts "Invalid command. See todo -h for help."
|
@@ -174,5 +188,40 @@ module Todo
|
|
174
188
|
end
|
175
189
|
end
|
176
190
|
|
191
|
+
# splits string for wrapping
|
192
|
+
def split string, width
|
193
|
+
split = Array.new
|
194
|
+
if string.length > width #if the string needs to be split
|
195
|
+
string_words = string.split(" ")
|
196
|
+
line = ""
|
197
|
+
string_words.each do |x|
|
198
|
+
if x.length > width #if the word needs to be split
|
199
|
+
#add the start of the word onto the first line (even if it has already started)
|
200
|
+
while line.length < width
|
201
|
+
line += x[0]
|
202
|
+
x = x[1..-1]
|
203
|
+
end
|
204
|
+
split << line
|
205
|
+
#split the rest of the word up onto new lines
|
206
|
+
split_word = x.scan(%r[.{1,#{width}}])
|
207
|
+
split_word[0..-2].each do |word|
|
208
|
+
split << word
|
209
|
+
end
|
210
|
+
line = split_word.last+" "
|
211
|
+
elsif (line + x).length > width-1 #if the word would fit alone on its own line
|
212
|
+
split << line.chomp
|
213
|
+
line = x
|
214
|
+
else #if the word can be added to this line
|
215
|
+
line += x + " "
|
216
|
+
end
|
217
|
+
end
|
218
|
+
split << line
|
219
|
+
else #if the string doesn't need to be split
|
220
|
+
split = [string]
|
221
|
+
end
|
222
|
+
#give back the split line
|
223
|
+
return split
|
224
|
+
end
|
225
|
+
|
177
226
|
end
|
178
227
|
end
|
data/lib/to-do/config.rb
CHANGED
@@ -18,10 +18,14 @@ module Todo
|
|
18
18
|
{
|
19
19
|
# the location of all all your list yaml files
|
20
20
|
:lists_directory => File.join(ENV["HOME"],".to-do","lists"),
|
21
|
+
# a sqlite3 databse that contains all of the tasks
|
22
|
+
:task_database => File.join(ENV["HOME"], ".to-do", "to-do.sqlite"),
|
21
23
|
# the current working list
|
22
24
|
:working_list_name => "default_list",
|
23
25
|
# does the working list actually exist
|
24
|
-
:working_list_exists => false
|
26
|
+
:working_list_exists => false,
|
27
|
+
# default width for formatting
|
28
|
+
:width => 50
|
25
29
|
}
|
26
30
|
end
|
27
31
|
|
data/lib/to-do/tasks.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'config')
|
2
|
+
require 'fileutils'
|
3
|
+
require 'sqlite3'
|
4
|
+
module Todo
|
5
|
+
|
6
|
+
# The module that contains methods for manipulating the database
|
7
|
+
module Tasks
|
8
|
+
extend self
|
9
|
+
DATABASE = SQLite3::Database.new(Todo::Config[:task_database])
|
10
|
+
|
11
|
+
# Adds the tast to the list
|
12
|
+
#
|
13
|
+
# @param [String] task the task to add to the list
|
14
|
+
def add task
|
15
|
+
list = DATABASE.execute("SELECT Total, Id FROM Lists WHERE Name = '" + Config[:working_list_name] + "'")
|
16
|
+
if !list
|
17
|
+
Database.execute("INSERT INTO Lists (Name, Total) VALUES('" + Config[:working_list_name] + "', 0)")
|
18
|
+
end
|
19
|
+
count = list ? list[0][0]+1 : 1
|
20
|
+
DATABASE.execute "INSERT INTO Tasks (Task_number, Name, Completed) VALUES('" + count.to_s + "', '" + task + "', 0)"
|
21
|
+
list_id = list[0][1]
|
22
|
+
task_id = DATABASE.last_insert_row_id
|
23
|
+
DATABASE.execute "INSERT INTO Task_list VALUES(" + task_id.to_s + ", " + list_id.to_s + ")"
|
24
|
+
DATABASE.execute "UPDATE Lists SET Total="+ count.to_s + " WHERE Id = " + list_id.to_s
|
25
|
+
end
|
26
|
+
|
27
|
+
# finish the task. task is either a case insensitive task on the list or
|
28
|
+
# the task number. Prints out either the task is not in the list or that i
|
29
|
+
# succesfully finished the task
|
30
|
+
#
|
31
|
+
# @param task either a task number or task name to finish
|
32
|
+
# @param [Bool] is_num if the task param represents the task number, true.
|
33
|
+
# false if it is the task name
|
34
|
+
def finish task, is_num
|
35
|
+
finish_undo task, is_num, 0, 1
|
36
|
+
end
|
37
|
+
|
38
|
+
# undos finishing a task. task is either a case insensitive task on the list or
|
39
|
+
# the task number. Prints out either the task is not in the list or that i
|
40
|
+
# succesfully undoed finished the task
|
41
|
+
#
|
42
|
+
# @param task either a task number or task name to finish
|
43
|
+
# @param [Bool] is_num if the task param represents the task number, true.
|
44
|
+
# false if it is the task name
|
45
|
+
def undo task, is_num
|
46
|
+
finish_undo task, is_num, 1, 0
|
47
|
+
end
|
48
|
+
|
49
|
+
# clears either just the completed or the uncompleted tasks
|
50
|
+
#
|
51
|
+
# @param completed [Integer] 1 if clearing completed tasks, 0 if clearing
|
52
|
+
# Uncompleted tasks
|
53
|
+
def clear_each completed ,list_name
|
54
|
+
tasks = DATABASE.execute("SELECT Id from Tasks WHERE Id IN
|
55
|
+
(SELECT Task_ID FROM Task_list WHERE List_Id IN
|
56
|
+
(SELECT Id FROM Lists WHERE Name='"+list_name+"' AND Tasks.Completed ="+ completed.to_s+ "))")
|
57
|
+
tasks.each do |task|
|
58
|
+
DATABASE.execute("DELETE FROM Task_list WHERE Task_id=" + task[0].to_s)
|
59
|
+
DATABASE.execute("DELETE FROM Tasks WHERE Id=" + task[0].to_s)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# clears all the tasks in the list
|
64
|
+
#
|
65
|
+
# @param [Bool] clear_all if true, clears all completed and uncompleted tasks
|
66
|
+
# and resets the count. if false, just clears the completed tasks
|
67
|
+
def clear clear_all, list_name = Config[:working_list_name]
|
68
|
+
clear_each 1, list_name
|
69
|
+
if clear_all
|
70
|
+
clear_each 0, list_name
|
71
|
+
DATABASE.execute("UPDATE Lists SET Total = 0 WHERE Name = '" + list_name +"'")
|
72
|
+
DATABASE.execute("DELETE FROM Lists WHERE Name = '" + list_name + "'")
|
73
|
+
puts "Cleared all tasks in #{list_name}"
|
74
|
+
else
|
75
|
+
puts "Cleared completed tasks in #{Config[:working_list_name]}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Helper method for finishing and undoing a task
|
80
|
+
#
|
81
|
+
# @param task either a task number or task name to finish
|
82
|
+
# @param [Bool] is_num if the task param represents the task number, true.
|
83
|
+
# false if it is the task name
|
84
|
+
# @param initial [Integer] 0 if you are finishing a task, 1 if you are undoing a task
|
85
|
+
# @param final [Integer] 1 if you are finishing a task, 0 if you ara undoing a task
|
86
|
+
def finish_undo task , is_num, initial, final
|
87
|
+
list = DATABASE.execute("SELECT Id FROM Lists WHERE Name = '" + Config[:working_list_name] + "'")
|
88
|
+
list_id = list[0][0]
|
89
|
+
names = DATABASE.execute("SELECT * from Tasks WHERE Id IN
|
90
|
+
(SELECT Task_ID FROM Task_list WHERE List_Id IN
|
91
|
+
(SELECT Id FROM Lists WHERE Name='"+Config[:working_list_name]+"' AND Tasks.Completed ="+ initial.to_s+"))")
|
92
|
+
if is_num
|
93
|
+
if names.map{|t| t[1]}.include? task.to_i
|
94
|
+
task_array = names.find{|t| t[1] == task.to_i}
|
95
|
+
DATABASE.execute "Update Tasks SET Completed="+final.to_s+ " WHERE Id=" + task_array[0].to_s
|
96
|
+
else
|
97
|
+
puts "Task ##{task} is not in the list."
|
98
|
+
end
|
99
|
+
else
|
100
|
+
if names.map{|t| t[2].downcase}.include? task.downcase
|
101
|
+
task_array = names.find{|t| t[2].downcase == task.downcase}
|
102
|
+
DATABASE.execute "Update Tasks SET Completed="+final.to_s+ " WHERE Id=" + task_array[0].to_s
|
103
|
+
else
|
104
|
+
puts "Task #{task} is not in the list."
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
data/to-do.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "to-do"
|
8
|
-
s.version = "1.2.
|
8
|
+
s.version = "1.2.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Kristen Mills"]
|
12
|
-
s.date = "2012-07-
|
12
|
+
s.date = "2012-07-18"
|
13
13
|
s.description = "A simple command line todo application"
|
14
14
|
s.email = "kristen@kristen-mills.com"
|
15
15
|
s.executables = ["todo"]
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
"lib/to-do.rb",
|
29
29
|
"lib/to-do/cli.rb",
|
30
30
|
"lib/to-do/config.rb",
|
31
|
-
"lib/to-do/
|
31
|
+
"lib/to-do/tasks.rb",
|
32
32
|
"test/helper.rb",
|
33
33
|
"test/test_to-do.rb",
|
34
34
|
"to-do.gemspec"
|
@@ -44,16 +44,16 @@ Gem::Specification.new do |s|
|
|
44
44
|
|
45
45
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
46
|
s.add_runtime_dependency(%q<shoulda>, [">= 0"])
|
47
|
-
s.add_runtime_dependency(%q<
|
48
|
-
s.add_runtime_dependency(%q<bundler>, ["
|
47
|
+
s.add_runtime_dependency(%q<sqlite3>, [">= 0"])
|
48
|
+
s.add_runtime_dependency(%q<bundler>, [">= 1.0.0"])
|
49
49
|
s.add_runtime_dependency(%q<jeweler>, ["~> 1.8.4"])
|
50
50
|
s.add_runtime_dependency(%q<simplecov>, [">= 0"])
|
51
51
|
s.add_runtime_dependency(%q<colorize>, [">= 0"])
|
52
52
|
s.add_development_dependency(%q<yard>, [">= 0"])
|
53
53
|
else
|
54
54
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
55
|
-
s.add_dependency(%q<
|
56
|
-
s.add_dependency(%q<bundler>, ["
|
55
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
56
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
57
57
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
58
58
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
59
59
|
s.add_dependency(%q<colorize>, [">= 0"])
|
@@ -61,8 +61,8 @@ Gem::Specification.new do |s|
|
|
61
61
|
end
|
62
62
|
else
|
63
63
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
64
|
-
s.add_dependency(%q<
|
65
|
-
s.add_dependency(%q<bundler>, ["
|
64
|
+
s.add_dependency(%q<sqlite3>, [">= 0"])
|
65
|
+
s.add_dependency(%q<bundler>, [">= 1.0.0"])
|
66
66
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
67
67
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
68
68
|
s.add_dependency(%q<colorize>, [">= 0"])
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: to-do
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: shoulda
|
16
|
-
requirement: &
|
16
|
+
requirement: &70322464748740 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,32 +21,32 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70322464748740
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
|
-
name:
|
27
|
-
requirement: &
|
26
|
+
name: sqlite3
|
27
|
+
requirement: &70322464747940 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
|
-
- -
|
30
|
+
- - ! '>='
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70322464747940
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bundler
|
38
|
-
requirement: &
|
38
|
+
requirement: &70322464747040 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
|
-
- -
|
41
|
+
- - ! '>='
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 1.0.0
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70322464747040
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: jeweler
|
49
|
-
requirement: &
|
49
|
+
requirement: &70322464744360 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.8.4
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70322464744360
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: simplecov
|
60
|
-
requirement: &
|
60
|
+
requirement: &70322464758220 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :runtime
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70322464758220
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: colorize
|
71
|
-
requirement: &
|
71
|
+
requirement: &70322464755580 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70322464755580
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: yard
|
82
|
-
requirement: &
|
82
|
+
requirement: &70322464753260 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70322464753260
|
91
91
|
description: A simple command line todo application
|
92
92
|
email: kristen@kristen-mills.com
|
93
93
|
executables:
|
@@ -107,7 +107,7 @@ files:
|
|
107
107
|
- lib/to-do.rb
|
108
108
|
- lib/to-do/cli.rb
|
109
109
|
- lib/to-do/config.rb
|
110
|
-
- lib/to-do/
|
110
|
+
- lib/to-do/tasks.rb
|
111
111
|
- test/helper.rb
|
112
112
|
- test/test_to-do.rb
|
113
113
|
- to-do.gemspec
|
@@ -126,7 +126,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
126
|
version: '0'
|
127
127
|
segments:
|
128
128
|
- 0
|
129
|
-
hash:
|
129
|
+
hash: -1294389487870074632
|
130
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
131
|
none: false
|
132
132
|
requirements:
|
data/lib/to-do/list.rb
DELETED
@@ -1,161 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require File.join(File.dirname(__FILE__), 'config')
|
3
|
-
require 'fileutils'
|
4
|
-
module Todo
|
5
|
-
|
6
|
-
# The Class that represents a list of tasks
|
7
|
-
class List
|
8
|
-
attr_accessor :tasks, :completed_tasks, :count, :completed_count, :name
|
9
|
-
|
10
|
-
# Creates a new list and sets it to be the working list
|
11
|
-
#
|
12
|
-
# @param [String] name the name of the list
|
13
|
-
def initialize name
|
14
|
-
@tasks = Hash.new
|
15
|
-
@completed_tasks = Hash.new
|
16
|
-
@count = 0
|
17
|
-
@completed_count = 0
|
18
|
-
@name = name
|
19
|
-
if !File.exists? Config[:lists_directory]
|
20
|
-
Dir.mkdir(Config[:lists_directory])
|
21
|
-
end
|
22
|
-
update
|
23
|
-
Config[:working_list_name] = name.downcase.gsub(/ /, '_')
|
24
|
-
Config[:working_list_exists] = true
|
25
|
-
Config.write
|
26
|
-
puts "Created List #{name}."
|
27
|
-
end
|
28
|
-
|
29
|
-
# Updates the yaml file
|
30
|
-
def update
|
31
|
-
path = File.join(Config[:lists_directory], @name.downcase.gsub(/ /, '_') +'.yml')
|
32
|
-
File.open(path, 'w') do |fh|
|
33
|
-
fh.puts(self.to_yaml)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# Adds the tast to the list
|
38
|
-
#
|
39
|
-
# @param [String] task the task to add to the list
|
40
|
-
def add task
|
41
|
-
@count+=1
|
42
|
-
@tasks[@count] = task
|
43
|
-
puts "Added task #{task}."
|
44
|
-
update
|
45
|
-
end
|
46
|
-
|
47
|
-
# finish the task. task is either a case insensitive task on the list or
|
48
|
-
# the task number. Prints out either the task is not in the list or that i
|
49
|
-
# succesfully finished the task
|
50
|
-
#
|
51
|
-
# @param task either a task number or task name to finish
|
52
|
-
# @param [Bool] is_num if the task param represents the task number, true.
|
53
|
-
# false if it is the task name
|
54
|
-
def finish task, is_num
|
55
|
-
if is_num
|
56
|
-
if !@tasks[task.to_i].nil?
|
57
|
-
@completed_tasks[task.to_i] = @tasks[task.to_i]
|
58
|
-
@tasks.delete(task.to_i)
|
59
|
-
@completed_count+=1
|
60
|
-
@completed_tasks = Hash[@completed_tasks.sort]
|
61
|
-
puts "Finished #{@completed_tasks[task.to_i]}."
|
62
|
-
else
|
63
|
-
puts "Task \##{task} not in list."
|
64
|
-
end
|
65
|
-
else
|
66
|
-
hash = Hash.new
|
67
|
-
@tasks.each do |k,v|
|
68
|
-
hash[k] = v.downcase
|
69
|
-
end
|
70
|
-
if hash.value?(task.downcase)
|
71
|
-
num = hash.key(task.downcase)
|
72
|
-
@completed_tasks[num] = @tasks[num]
|
73
|
-
@tasks.delete(num)
|
74
|
-
@completed_count+=1
|
75
|
-
@completed_tasks = Hash[@completed_tasks.sort]
|
76
|
-
puts "Finished #{@completed_tasks[num]}."
|
77
|
-
else
|
78
|
-
puts "Task #{task} is not in list."
|
79
|
-
end
|
80
|
-
end
|
81
|
-
update
|
82
|
-
end
|
83
|
-
|
84
|
-
# undos finishing a task. task is either a case insensitive task on the list or
|
85
|
-
# the task number. Prints out either the task is not in the list or that i
|
86
|
-
# succesfully undoed finished the task
|
87
|
-
#
|
88
|
-
# @param task either a task number or task name to finish
|
89
|
-
# @param [Bool] is_num if the task param represents the task number, true.
|
90
|
-
# false if it is the task name
|
91
|
-
def undo task, is_num
|
92
|
-
if is_num
|
93
|
-
if !@completed_tasks[task.to_i].nil?
|
94
|
-
@tasks[task.to_i] = @completed_tasks[task.to_i]
|
95
|
-
@completed_tasks.delete(task.to_i)
|
96
|
-
@completed_count-=1
|
97
|
-
@tasks = Hash[@tasks.sort]
|
98
|
-
puts "Undo completeing #{@tasks[task.to_i]}."
|
99
|
-
else
|
100
|
-
puts "Task \##{task} not in list."
|
101
|
-
end
|
102
|
-
else
|
103
|
-
hash = Hash.new
|
104
|
-
@completed_tasks.each do |k,v|
|
105
|
-
hash[k] = v.downcase
|
106
|
-
end
|
107
|
-
if hash.value?(task.downcase)
|
108
|
-
num = hash.key(task.downcase)
|
109
|
-
@tasks[num] = @completed_tasks[num]
|
110
|
-
@completed_tasks.delete(num)
|
111
|
-
@completed_count-=1
|
112
|
-
@tasks = Hash[@tasks.sort]
|
113
|
-
puts "Undo completeing #{@tasks[num]}."
|
114
|
-
else
|
115
|
-
puts "Task #{task} is not in list."
|
116
|
-
end
|
117
|
-
end
|
118
|
-
update
|
119
|
-
end
|
120
|
-
|
121
|
-
# clears just the completed tasks
|
122
|
-
def clear_completed
|
123
|
-
@completed_tasks = Hash.new
|
124
|
-
update
|
125
|
-
end
|
126
|
-
|
127
|
-
# clears the task in the list
|
128
|
-
#
|
129
|
-
# @param [Bool] clear_all if true, clears all completed and uncompleted tasks
|
130
|
-
# and resets the count. if false, just clears the completed tasks
|
131
|
-
def clear clear_all
|
132
|
-
clear_completed
|
133
|
-
if clear_all
|
134
|
-
@tasks = Hash.new
|
135
|
-
@completed_count = 0
|
136
|
-
@count = 0
|
137
|
-
puts "Cleared list."
|
138
|
-
else
|
139
|
-
puts "Cleared completed tasks."
|
140
|
-
end
|
141
|
-
update
|
142
|
-
end
|
143
|
-
|
144
|
-
# Class method that removes a list from the your lists.
|
145
|
-
#
|
146
|
-
# @param [string] name name of the list that you are trying to remove
|
147
|
-
def self.remove name
|
148
|
-
underscore_name = name.downcase.gsub(/ /, '_')
|
149
|
-
begin
|
150
|
-
FileUtils.rm File.join(Config[:lists_directory], underscore_name +'.yml')
|
151
|
-
puts "Removed list #{name}"
|
152
|
-
rescue
|
153
|
-
puts "List doesn't exist"
|
154
|
-
end
|
155
|
-
if underscore_name == Config[:working_list_name]
|
156
|
-
Config[:working_list_exists] = false
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|