todo 0.1.0 → 0.2.0
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.
- checksums.yaml +7 -7
- data/README.rdoc +13 -26
- data/lib/todo.rb +1 -2
- data/lib/todo/cli.rb +33 -102
- data/lib/todo/controller.rb +70 -0
- data/lib/todo/version.rb +1 -1
- data/spec/todo_controller_spec.rb +70 -0
- data/todo.gemspec +4 -4
- metadata +86 -72
- data/lib/todo/list.rb +0 -25
- data/lib/todo/store.rb +0 -26
- data/spec/todo_list_spec.rb +0 -63
- data/spec/todo_store_spec.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
|
4
|
-
|
5
|
-
SHA512:
|
6
|
-
|
7
|
-
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 24203ee1ee57fddc956f45411f545fc2424435c9
|
4
|
+
data.tar.gz: 0852e391ab564895c1dc0b36bd9c7f085cacd442
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a4313713da987294539c5da5e65efbaede7e2643832048a95b705af8469a2030508addbfb83d8176e0004accb1485ad52a062279b6f2d328ae0050bd31fbb14b
|
7
|
+
data.tar.gz: 288e3c1f27a9263de0a21bf4246ab956e3342a70df6204a99547eac422bb7742ba007f28ff7d986940a43241c95bb42e27ba4e1f74090102d049e07cce190b3d
|
data/README.rdoc
CHANGED
@@ -4,51 +4,38 @@ Really want to get things done? Don't want to juggle with web based todo lists?
|
|
4
4
|
Get your things done with command-line. No hassle, no distraction - Try out todo ruby gem.
|
5
5
|
|
6
6
|
|
7
|
-
==
|
7
|
+
== Features
|
8
8
|
|
9
9
|
* Uses human readable YAML to store the todo lists (You could edit the todo list manually)
|
10
|
-
*
|
11
|
-
|
10
|
+
* Supports project specific todo lists.
|
11
|
+
(Creates automatically a file '.todo.yml' in the project-directory you are using it)
|
12
|
+
* Supports tagging
|
12
13
|
|
13
14
|
== Install
|
14
15
|
|
15
|
-
|
16
|
-
sudo gem install main
|
17
|
-
sudo gem install highline
|
16
|
+
gem install todo
|
18
17
|
|
19
|
-
|
20
|
-
sudo gem install todo
|
21
|
-
|
22
|
-
You can also install from github:
|
23
|
-
gem sources -a http://gems.github.com
|
24
|
-
sudo gem install laktek-todo
|
25
|
-
|
26
|
-
== Example:
|
18
|
+
== Example
|
27
19
|
|
28
20
|
Here is a small sample on how to use todo gem
|
29
21
|
|
30
22
|
#visit your project folder
|
31
23
|
cd projects/newapp
|
32
24
|
|
33
|
-
#
|
34
|
-
todo create
|
35
|
-
|
36
|
-
#add a new task
|
25
|
+
#add a task
|
37
26
|
todo add "write the specs"
|
38
|
-
- add tags : important, due:24/08/
|
27
|
+
- add tags : important, due:24/08/2014
|
39
28
|
|
40
29
|
#listing all tasks
|
41
|
-
todo list
|
30
|
+
todo list
|
42
31
|
|
43
32
|
#listing tasks tagged 'important'
|
44
33
|
todo list --tag important
|
45
34
|
|
46
|
-
#removing a task by
|
47
|
-
todo remove
|
48
|
-
|
49
|
-
#removing a task by index
|
50
|
-
todo remove -i 1
|
35
|
+
#removing a task by his number (index)
|
36
|
+
todo remove 1
|
51
37
|
|
52
38
|
== Issues/Improvements
|
53
39
|
|
54
|
-
Todo is
|
40
|
+
Todo is very minimalistic by its nature.
|
41
|
+
Feel free to try, fork and send PRs.
|
data/lib/todo.rb
CHANGED
data/lib/todo/cli.rb
CHANGED
@@ -1,134 +1,65 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'main'
|
3
|
-
require 'highline/import'
|
4
3
|
require 'fileutils'
|
4
|
+
require 'highline/import'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def write_list(list, environment)
|
16
|
-
file = environment.nil? ? Todo::Store.write(list, '.todo/list.yml') : Todo::Store.write(list, environment)
|
17
|
-
end
|
6
|
+
#
|
7
|
+
TODO_FILE = '.todo.yml'
|
8
|
+
ADD_DESC = "Adds a new task"
|
9
|
+
REMOVE_DESC = "Removes a task from this todo list"
|
10
|
+
LIST_DESC = "Lists the tasks"
|
11
|
+
#
|
18
12
|
|
19
13
|
Main {
|
14
|
+
|
20
15
|
def run
|
21
16
|
puts "todo [command] --help for usage instructions."
|
22
|
-
puts
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
def run
|
29
|
-
unless File.exist?(".todo/list.yml")
|
30
|
-
FileUtils.makedirs(".todo")
|
31
|
-
newfile = File.new(".todo/list.yml", "w+")
|
32
|
-
say "Created a new todo list inside this directory" if newfile
|
33
|
-
newfile.close
|
34
|
-
else
|
35
|
-
say "Todo list already exists inside this directory"
|
36
|
-
end
|
37
|
-
end
|
17
|
+
puts
|
18
|
+
puts "The available commands are:"
|
19
|
+
puts " - add => #{ADD_DESC}"
|
20
|
+
puts " - remove => #{REMOVE_DESC}"
|
21
|
+
puts " - list => #{LIST_DESC}"
|
22
|
+
puts
|
38
23
|
end
|
39
24
|
|
40
25
|
mode 'add' do
|
41
|
-
description
|
42
|
-
|
43
|
-
description 'todo item to add'
|
44
|
-
}
|
26
|
+
description ADD_DESC
|
27
|
+
argument('task'){ description 'Task to add' }
|
45
28
|
|
46
|
-
|
47
|
-
synopsis 'export FILE=path'
|
48
|
-
}
|
49
|
-
|
50
|
-
option('notags', 'n'){
|
29
|
+
option('notags', 'n'){
|
51
30
|
cast :bool
|
52
31
|
default false
|
53
|
-
|
54
|
-
|
55
|
-
def run
|
56
|
-
unless params['notags'].value
|
57
|
-
tags = ask("Enter tags for this item (separate with commas) ", lambda {|str|
|
58
|
-
str.split(/,\s*/) })
|
59
|
-
end
|
32
|
+
}
|
60
33
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
65
|
-
end
|
34
|
+
define_method(:run) { say(Todo::add_task(TODO_FILE,
|
35
|
+
params['notags'].value,
|
36
|
+
params['task'].value)) }
|
66
37
|
end
|
67
38
|
|
68
39
|
mode 'remove' do
|
69
|
-
description
|
70
|
-
|
71
|
-
environment('FILE'){
|
72
|
-
synopsis 'export FILE=path'
|
73
|
-
}
|
40
|
+
description REMOVE_DESC
|
74
41
|
|
75
|
-
argument('
|
76
|
-
|
77
|
-
description 'Name of the todo item to remove'
|
78
|
-
}
|
79
|
-
|
80
|
-
option('index', 'i'){
|
42
|
+
argument('index'){
|
43
|
+
required
|
81
44
|
cast :int
|
82
|
-
|
83
|
-
description '
|
45
|
+
validate { |index| index>0 }
|
46
|
+
description 'Task number to remove'
|
84
47
|
}
|
85
48
|
|
86
|
-
|
87
|
-
read_list(params['FILE'].value) do |list|
|
88
|
-
if list.remove(params['item'].value || params['index'].value)
|
89
|
-
say "Removed item from the list." if write_list(list, params['FILE'].value)
|
90
|
-
else
|
91
|
-
say "Could not find item to remove."
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
49
|
+
define_method(:run) { say(Todo::del_task(TODO_FILE,params['index'].value)) }
|
95
50
|
end
|
96
51
|
|
97
52
|
mode 'list' do
|
98
|
-
description
|
99
|
-
|
100
|
-
environment('FILE'){
|
101
|
-
synopsis 'export barfoo=value'
|
102
|
-
}
|
53
|
+
description LIST_DESC
|
103
54
|
|
104
|
-
option('tag', 't'){
|
105
|
-
argument_required
|
106
|
-
}
|
55
|
+
option('tag', 't') { argument_required }
|
107
56
|
|
108
|
-
option('all=[all]', 'a'){
|
109
|
-
|
110
|
-
|
111
|
-
default false
|
57
|
+
option('all=[all]', 'a'){
|
58
|
+
cast :bool
|
59
|
+
default false
|
112
60
|
}
|
113
61
|
|
114
|
-
|
115
|
-
read_list(params['FILE'].value) do |list|
|
116
|
-
|
117
|
-
if params['tag'].given?
|
118
|
-
title = "Listing todos tagged '#{params['tag'].value}'"
|
119
|
-
tasks = list.tagged(params['tag'].value)
|
120
|
-
else
|
121
|
-
title = "Listing all todos"
|
122
|
-
tasks = list
|
123
|
-
end
|
124
|
-
|
125
|
-
say title
|
126
|
-
tasks.each do |task, tags|
|
127
|
-
tag_string = ("(#{tags.join(", ")})") unless tags.include?(nil)
|
128
|
-
say " - #{task} #{tag_string} \n"
|
129
|
-
end
|
62
|
+
define_method(:run) { say(Todo::show_tasks(TODO_FILE,params['tag'].value)) }
|
130
63
|
|
131
|
-
end
|
132
|
-
end
|
133
64
|
end
|
134
65
|
}
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'highline/import'
|
3
|
+
require 'SecureRandom'
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
module Todo
|
7
|
+
|
8
|
+
def self.add_task(filename,notags,description,taskid=SecureRandom.hex(4),created_at=Time.now.to_s)
|
9
|
+
tags = []
|
10
|
+
_tasks = load_tasks(filename)
|
11
|
+
tags = ask("(optional) Enter comma-separated tags: ", lambda {|s| s.split(/,\s*/) }) unless notags
|
12
|
+
|
13
|
+
_tasks << {
|
14
|
+
"taskid" => taskid,
|
15
|
+
"created_at" => created_at,
|
16
|
+
"description" => description,
|
17
|
+
"tags" => tags
|
18
|
+
}
|
19
|
+
|
20
|
+
"<%= color('Task added', :green) %>" if(save_tasks(filename,_tasks))
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.del_task(filename,index)
|
24
|
+
_tasks=load_tasks(filename)
|
25
|
+
if(_tasks.delete_at(index-1) && save_tasks(filename,_tasks))
|
26
|
+
"<%= color('Task deleted', :yellow) %>"
|
27
|
+
else
|
28
|
+
"<%= color('No task deleted', :red) %>"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.show_tasks(filename,tag)
|
33
|
+
_tasks=load_tasks(filename)
|
34
|
+
|
35
|
+
_rtn = "Listing tasks (#{tag ? tag.to_s : 'all'})\n"
|
36
|
+
_tasks.each_with_index do |task, i|
|
37
|
+
next if(tag && !(task["tags"].include?(tag)))
|
38
|
+
_rtn += "(#{i+1})\n"
|
39
|
+
_rtn += "\t taskid : #{task['taskid']}\n"
|
40
|
+
_rtn += "\t created_at : #{task['created_at']}\n"
|
41
|
+
_rtn += "\t description : <%= color('"+task['description']+"', :yellow) %>\n"
|
42
|
+
unless(task['tags'].empty?)
|
43
|
+
_rtn += "\t tags : #{task['tags']}\n\n"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
_rtn
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
|
51
|
+
def self.save_tasks(filename,tasks,file=File)
|
52
|
+
begin
|
53
|
+
File.open(filename,"w+") { |f| f << tasks.to_yaml }
|
54
|
+
rescue
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.load_tasks(filename)
|
60
|
+
begin
|
61
|
+
_tasks = YAML::load(File.open(filename))
|
62
|
+
rescue
|
63
|
+
nil
|
64
|
+
end
|
65
|
+
_tasks ? _tasks : []
|
66
|
+
end
|
67
|
+
|
68
|
+
private_class_method :save_tasks, :load_tasks
|
69
|
+
|
70
|
+
end
|
data/lib/todo/version.rb
CHANGED
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'todo/controller'
|
2
|
+
|
3
|
+
RSpec.describe 'Todo::Controller' do
|
4
|
+
|
5
|
+
let(:filename) { ".todo.yml" }
|
6
|
+
|
7
|
+
let(:empty_task_list) { [] }
|
8
|
+
let(:created_at) { Time.now.to_s }
|
9
|
+
let(:one_todo_item) { [{ "taskid"=>"123abc",
|
10
|
+
"created_at"=>created_at,
|
11
|
+
"description"=>":-)",
|
12
|
+
"tags"=>[]}] }
|
13
|
+
let(:new_task_list) { [
|
14
|
+
{ "taskid"=>"123abc",
|
15
|
+
"created_at"=>created_at,
|
16
|
+
"description"=>":-)",
|
17
|
+
"tags"=>[] },
|
18
|
+
{ "taskid"=>"456def",
|
19
|
+
"created_at"=>created_at,
|
20
|
+
"description"=>":-D",
|
21
|
+
"tags"=>[] },
|
22
|
+
] }
|
23
|
+
|
24
|
+
context "add task" do
|
25
|
+
it "should create the file if it does not exist" do
|
26
|
+
expect(Todo).to receive(:load_tasks).with(filename).and_return(empty_task_list)
|
27
|
+
expect(Todo).to receive(:save_tasks).with(filename,one_todo_item).and_return(true)
|
28
|
+
expect(Todo::add_task(filename,true,":-)","123abc",created_at)).to eq("<%= color('Task added', :green) %>")
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should add another task to the existing ones" do
|
32
|
+
expect(Todo).to receive(:load_tasks).with(filename).and_return(one_todo_item)
|
33
|
+
expect(Todo).to receive(:save_tasks).with(filename,new_task_list).and_return(true)
|
34
|
+
expect(Todo::add_task(filename,true,":-D","456def")).to eq("<%= color('Task added', :green) %>")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "del task" do
|
39
|
+
it "should delete a task" do
|
40
|
+
expect(Todo).to receive(:load_tasks).with(filename).and_return(new_task_list)
|
41
|
+
expect(Todo).to receive(:save_tasks).with(filename,one_todo_item).and_return(true)
|
42
|
+
expect(Todo::del_task(filename,2)).to eq("<%= color('Task deleted', :yellow) %>")
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should delete nothing if wrong index" do
|
46
|
+
expect(Todo).to receive(:load_tasks).with(filename).and_return(new_task_list)
|
47
|
+
expect(Todo).not_to receive(:save_tasks).with(any_args)
|
48
|
+
expect(Todo::del_task(filename,99)).to eq("<%= color('No task deleted', :red) %>")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "show tasks" do
|
53
|
+
it "should show nothing when no tasks in the list" do
|
54
|
+
expect(Todo).to receive(:load_tasks).with(filename).and_return(empty_task_list)
|
55
|
+
expect(Todo::show_tasks(filename,nil)).to eq("Listing tasks (all)\n")
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should show all tasks when no tag given" do
|
59
|
+
expect(Todo).to receive(:load_tasks).with(filename).and_return(one_todo_item)
|
60
|
+
final = "Listing tasks (all)\n(1)\n\t taskid : 123abc\n\t created_at : #{created_at}\n\t description : <%= color(':-)', :yellow) %>\n"
|
61
|
+
expect(Todo::show_tasks(filename,nil)).to eq(final)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should show only tagged tasks when tag given" do
|
65
|
+
expect(Todo).to receive(:load_tasks).with(filename).and_return(new_task_list)
|
66
|
+
expect(Todo::show_tasks(filename,["a"])).to eq("Listing tasks ([\"a\"])\n")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
data/todo.gemspec
CHANGED
@@ -6,11 +6,11 @@ require 'todo/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "todo"
|
8
8
|
spec.version = Todo::VERSION
|
9
|
-
spec.authors = ["Lakshan Perera", "Aniket Pant"]
|
10
|
-
spec.email = ["
|
9
|
+
spec.authors = ["Lakshan Perera", "Aniket Pant", "Dennis Theisen"]
|
10
|
+
spec.email = ["lakshanlaktek.com"]
|
11
11
|
spec.description = %q{simple command line todo list manager}
|
12
12
|
spec.summary = %q{simple command line todo list manager}
|
13
|
-
spec.homepage = %q{http://todo
|
13
|
+
spec.homepage = %q{http://github.com/laktek/todo}
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.3"
|
22
22
|
spec.add_development_dependency "rake"
|
23
|
-
spec.add_development_dependency "rspec", "~>
|
23
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
24
24
|
|
25
25
|
spec.add_runtime_dependency "main", ">= 2.8.2"
|
26
26
|
spec.add_runtime_dependency "highline", ">= 1.4.0"
|
metadata
CHANGED
@@ -1,80 +1,96 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: todo
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
|
-
authors:
|
6
|
+
authors:
|
7
7
|
- Lakshan Perera
|
8
8
|
- Aniket Pant
|
9
|
+
- Dennis Theisen
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
13
|
+
date: 2014-07-21 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
version: "1.3"
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '1.3'
|
23
22
|
type: :development
|
24
|
-
version_requirements: *id001
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: rake
|
27
23
|
prerelease: false
|
28
|
-
|
29
|
-
requirements:
|
30
|
-
-
|
31
|
-
-
|
32
|
-
|
33
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '1.3'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: rake
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
34
36
|
type: :development
|
35
|
-
version_requirements: *id002
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: rspec
|
38
37
|
prerelease: false
|
39
|
-
|
40
|
-
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version:
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rspec
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '3.0'
|
44
50
|
type: :development
|
45
|
-
version_requirements: *id003
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: main
|
48
51
|
prerelease: false
|
49
|
-
|
50
|
-
requirements:
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '3.0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: main
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
51
61
|
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
62
|
+
- !ruby/object:Gem::Version
|
53
63
|
version: 2.8.2
|
54
64
|
type: :runtime
|
55
|
-
version_requirements: *id004
|
56
|
-
- !ruby/object:Gem::Dependency
|
57
|
-
name: highline
|
58
65
|
prerelease: false
|
59
|
-
|
60
|
-
requirements:
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 2.8.2
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: highline
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
61
75
|
- - ">="
|
62
|
-
- !ruby/object:Gem::Version
|
76
|
+
- !ruby/object:Gem::Version
|
63
77
|
version: 1.4.0
|
64
78
|
type: :runtime
|
65
|
-
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 1.4.0
|
66
85
|
description: simple command line todo list manager
|
67
|
-
email:
|
68
|
-
-
|
69
|
-
|
70
|
-
executables:
|
86
|
+
email:
|
87
|
+
- lakshanlaktek.com
|
88
|
+
executables:
|
71
89
|
- todo
|
72
90
|
extensions: []
|
73
|
-
|
74
91
|
extra_rdoc_files: []
|
75
|
-
|
76
|
-
|
77
|
-
- .gitignore
|
92
|
+
files:
|
93
|
+
- ".gitignore"
|
78
94
|
- Gemfile
|
79
95
|
- History.txt
|
80
96
|
- LICENSE.txt
|
@@ -83,35 +99,33 @@ files:
|
|
83
99
|
- bin/todo
|
84
100
|
- lib/todo.rb
|
85
101
|
- lib/todo/cli.rb
|
86
|
-
- lib/todo/
|
87
|
-
- lib/todo/store.rb
|
102
|
+
- lib/todo/controller.rb
|
88
103
|
- lib/todo/version.rb
|
89
|
-
- spec/
|
90
|
-
- spec/todo_store_spec.rb
|
104
|
+
- spec/todo_controller_spec.rb
|
91
105
|
- todo.gemspec
|
92
|
-
homepage: http://todo
|
93
|
-
licenses:
|
106
|
+
homepage: http://github.com/laktek/todo
|
107
|
+
licenses:
|
94
108
|
- MIT
|
95
109
|
metadata: {}
|
96
|
-
|
97
110
|
post_install_message:
|
98
111
|
rdoc_options: []
|
99
|
-
|
100
|
-
require_paths:
|
112
|
+
require_paths:
|
101
113
|
- lib
|
102
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
103
|
-
requirements:
|
104
|
-
-
|
105
|
-
|
106
|
-
|
107
|
-
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
108
124
|
requirements: []
|
109
|
-
|
110
125
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.0
|
126
|
+
rubygems_version: 2.2.0
|
112
127
|
signing_key:
|
113
128
|
specification_version: 4
|
114
129
|
summary: simple command line todo list manager
|
115
|
-
test_files:
|
116
|
-
- spec/
|
117
|
-
- spec/todo_store_spec.rb
|
130
|
+
test_files:
|
131
|
+
- spec/todo_controller_spec.rb
|
data/lib/todo/list.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
module Todo
|
2
|
-
|
3
|
-
class List < Hash
|
4
|
-
|
5
|
-
def tagged(tag)
|
6
|
-
self.reject do |name, tags|
|
7
|
-
not tags.include?(tag)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def add(task, *tags)
|
12
|
-
self.store(task, tags.flatten)
|
13
|
-
self
|
14
|
-
end
|
15
|
-
|
16
|
-
#Returns the list after removing specific item
|
17
|
-
def remove(task)
|
18
|
-
#find key by index
|
19
|
-
task = self.keys[task - 1] if task.instance_of? Fixnum
|
20
|
-
self if self.delete(task)
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
data/lib/todo/store.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'yaml'
|
3
|
-
|
4
|
-
module Todo
|
5
|
-
class Store
|
6
|
-
def self.read(file)
|
7
|
-
begin
|
8
|
-
loaded_list = YAML::load( File.open( file ) )
|
9
|
-
loaded_list ? List[loaded_list] : List.new
|
10
|
-
rescue
|
11
|
-
nil
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.write(list, file)
|
16
|
-
begin
|
17
|
-
File.open( file, 'w' ) do |f|
|
18
|
-
f << list.to_yaml
|
19
|
-
end
|
20
|
-
rescue
|
21
|
-
nil
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
data/spec/todo_list_spec.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'todo/list'
|
2
|
-
|
3
|
-
describe "Todo::List" do
|
4
|
-
|
5
|
-
describe "filtering by tag" do
|
6
|
-
before(:each) do
|
7
|
-
@todolist = Todo::List["dummy task" => ["added:31-07-2008", "important"], "Buy milk" => ["important", "home"]]
|
8
|
-
@list_with_task_tagged_home = {"Buy milk" => ["important", "home"]}
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should return matched items by tag" do
|
12
|
-
@todolist.tagged("important").should == @todolist
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should filter items by tags" do
|
16
|
-
@todolist.tagged("home").should == @list_with_task_tagged_home
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should be able to apply chain of filters" do
|
20
|
-
@todolist.tagged("important").tagged("home").should == @list_with_task_tagged_home
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
describe "add" do
|
26
|
-
before(:each) do
|
27
|
-
@todolist =Todo::List["dummy task" => ["added:31-07-2008", "important"]]
|
28
|
-
@after_list =Todo::List["dummy task" => ["added:31-07-2008", "important"], "Buy milk" => []]
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should add new item to the exisitng task list" do
|
32
|
-
@todolist.add("Buy milk").should == @after_list
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should accept list of tags with the item" do
|
36
|
-
list_with_tags_added = {"dummy task" => ["added:31-07-2008", "important"], "Buy milk" => ["important", "assigned:mom"]}
|
37
|
-
|
38
|
-
@todolist.add("Buy milk", "important", "assigned:mom").should == list_with_tags_added
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
describe "remove" do
|
44
|
-
before(:each) do
|
45
|
-
@todolist =Todo::List["dummy task" => ["added:31-07-2008", "important"], "Buy milk" => []]
|
46
|
-
@after_list =Todo::List["dummy task" => ["added:31-07-2008", "important"]]
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should remove a task by name" do
|
50
|
-
@todolist.remove("Buy milk").should == @after_list
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should remove a task by its index" do
|
54
|
-
@todolist.remove(2).should == @after_list
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should return nil if the task is not found" do
|
58
|
-
@todolist.remove("not done").should == nil
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
data/spec/todo_store_spec.rb
DELETED