todo-txt 0.5 → 0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +1 -1
- data/Rakefile +1 -3
- data/lib/todo-txt.rb +1 -0
- data/lib/todo-txt/syntax.rb +33 -0
- data/lib/todo-txt/task.rb +15 -45
- data/spec/spec_helper.rb +9 -0
- data/spec/todo-txt/list_spec.rb +21 -21
- data/spec/todo-txt/task_spec.rb +80 -72
- data/todo-txt.gemspec +1 -1
- metadata +3 -3
- data/Gemfile.lock +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87c3206db6b8a924eeedaaee0699cbaa9a63ea0f
|
4
|
+
data.tar.gz: ba6c31c870bd51c7a191a250bf20c9e1a8fbb5ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ee77ef0490c7b423a52f779b810af66521ed1ed253560cd08c5a1b207102fcf36e4ab6d3f78666039c49d748c27e9d96d2149e28eeb0d2b3ad60e7cc6307760
|
7
|
+
data.tar.gz: 82050a6db87b76ef1c3ab51c428d26b7f045242628eeebbd3817b1c884634f73f159004435db20b9967bf40feb99a0d043afb4dab5502d9d7389417ba32909f9
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/lib/todo-txt.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Todo
|
2
|
+
module Syntax
|
3
|
+
# The regular expression used to match contexts.
|
4
|
+
def contexts_regex
|
5
|
+
/(?:\s+|^)@[^\s]+/
|
6
|
+
end
|
7
|
+
|
8
|
+
# The regex used to match projects.
|
9
|
+
def projects_regex
|
10
|
+
/(?:\s+|^)\+[^\s]+/
|
11
|
+
end
|
12
|
+
|
13
|
+
# The regex used to match priorities.
|
14
|
+
def priority_regex
|
15
|
+
/(?:^|\s+)\(([A-Za-z])\)\s+/
|
16
|
+
end
|
17
|
+
|
18
|
+
# The regex used to match creation date.
|
19
|
+
def created_on_regex
|
20
|
+
/(?:^|-\d{2}\s|\)\s)(\d{4}-\d{2}-\d{2})\s/
|
21
|
+
end
|
22
|
+
|
23
|
+
# The regex used to match completion.
|
24
|
+
def done_regex
|
25
|
+
/^x\s+(\d{4}-\d{2}-\d{2})\s+/
|
26
|
+
end
|
27
|
+
|
28
|
+
# The regex used to match due date.
|
29
|
+
def due_on_regex
|
30
|
+
/(?:due:)(\d{4}-\d{2}-\d{2})(?:\s+|$)/i
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/todo-txt/task.rb
CHANGED
@@ -4,36 +4,7 @@ module Todo
|
|
4
4
|
class Task
|
5
5
|
include Comparable
|
6
6
|
include Todo::Logger
|
7
|
-
|
8
|
-
# The regular expression used to match contexts.
|
9
|
-
def self.contexts_regex
|
10
|
-
/(?:\s+|^)@\w+/
|
11
|
-
end
|
12
|
-
|
13
|
-
# The regex used to match projects.
|
14
|
-
def self.projects_regex
|
15
|
-
/(?:\s+|^)\+\w+/
|
16
|
-
end
|
17
|
-
|
18
|
-
# The regex used to match priorities.
|
19
|
-
def self.priority_regex
|
20
|
-
/(?:^|\s+)\(([A-Za-z])\)\s+/
|
21
|
-
end
|
22
|
-
|
23
|
-
# The regex used to match creation date.
|
24
|
-
def self.created_on_regex
|
25
|
-
/(?:^|-\d{2}\s|\)\s)(\d{4}-\d{2}-\d{2})\s/
|
26
|
-
end
|
27
|
-
|
28
|
-
# The regex used to match completion.
|
29
|
-
def self.done_regex
|
30
|
-
/^x\s+(\d{4}-\d{2}-\d{2})\s+/
|
31
|
-
end
|
32
|
-
|
33
|
-
# The regex used to match due date.
|
34
|
-
def self.due_on_regex
|
35
|
-
/(?:due:)(\d{4}-\d{2}-\d{2})(?:\s+|$)/i
|
36
|
-
end
|
7
|
+
include Todo::Syntax
|
37
8
|
|
38
9
|
# Creates a new task. The argument that you pass in must be the string
|
39
10
|
# representation of a task.
|
@@ -46,8 +17,8 @@ module Todo
|
|
46
17
|
@completed_on = get_completed_date #orig.scan(self.class.done_regex)[1] ||= nil
|
47
18
|
@priority, @created_on = orig_priority, orig_created_on
|
48
19
|
@due_on = get_due_on_date
|
49
|
-
@contexts ||= orig.scan(
|
50
|
-
@projects ||= orig.scan(
|
20
|
+
@contexts ||= orig.scan(contexts_regex).map { |item| item.strip }
|
21
|
+
@projects ||= orig.scan(projects_regex).map { |item| item.strip }
|
51
22
|
end
|
52
23
|
|
53
24
|
# Returns the original content of the task.
|
@@ -133,12 +104,12 @@ module Todo
|
|
133
104
|
# task.text #=> "Testing!"
|
134
105
|
def text
|
135
106
|
@text ||= orig.
|
136
|
-
gsub(
|
137
|
-
gsub(
|
138
|
-
gsub(
|
139
|
-
gsub(
|
140
|
-
gsub(
|
141
|
-
gsub(
|
107
|
+
gsub(done_regex, '').
|
108
|
+
gsub(priority_regex, '').
|
109
|
+
gsub(created_on_regex, '').
|
110
|
+
gsub(contexts_regex, '').
|
111
|
+
gsub(projects_regex, '').
|
112
|
+
gsub(due_on_regex, '').
|
142
113
|
strip
|
143
114
|
end
|
144
115
|
|
@@ -169,8 +140,7 @@ module Todo
|
|
169
140
|
# task.overdue?
|
170
141
|
# #=> true
|
171
142
|
def overdue?
|
172
|
-
|
173
|
-
false
|
143
|
+
!due_on.nil? && due_on < Date.today
|
174
144
|
end
|
175
145
|
|
176
146
|
# Returns if the task is done.
|
@@ -294,13 +264,13 @@ module Todo
|
|
294
264
|
private
|
295
265
|
|
296
266
|
def orig_priority
|
297
|
-
@orig.match(
|
267
|
+
@orig.match(priority_regex)[1] if @orig =~ priority_regex
|
298
268
|
end
|
299
269
|
|
300
270
|
def orig_created_on
|
301
271
|
begin
|
302
|
-
if @orig =~
|
303
|
-
date = @orig.match
|
272
|
+
if @orig =~ created_on_regex
|
273
|
+
date = @orig.match created_on_regex
|
304
274
|
return Date.parse(date[1]) unless date.nil?
|
305
275
|
end
|
306
276
|
rescue; end
|
@@ -309,14 +279,14 @@ module Todo
|
|
309
279
|
|
310
280
|
def get_completed_date
|
311
281
|
begin
|
312
|
-
return Date.parse(
|
282
|
+
return Date.parse(done_regex.match(@orig)[1])
|
313
283
|
rescue; end
|
314
284
|
nil
|
315
285
|
end
|
316
286
|
|
317
287
|
def get_due_on_date
|
318
288
|
begin
|
319
|
-
return Date.parse(
|
289
|
+
return Date.parse(due_on_regex.match(@orig)[1])
|
320
290
|
rescue; end
|
321
291
|
nil
|
322
292
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/todo-txt/list_spec.rb
CHANGED
@@ -1,47 +1,47 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Todo::List do
|
4
4
|
let(:path) { File.dirname(__FILE__) + '/../data/todo.txt' }
|
5
5
|
let(:list) { Todo::List.new(path) }
|
6
6
|
|
7
7
|
it 'should have the correct path' do
|
8
|
-
list.path.
|
8
|
+
expect(list.path).to eq(path)
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'should grab a list of Todo::Tasks' do
|
12
12
|
list.each do |task|
|
13
|
-
task.class.
|
13
|
+
expect(task.class).to eq(Todo::Task)
|
14
14
|
end
|
15
15
|
|
16
16
|
# This is a little bit fragile but it helps me sleep at night.
|
17
|
-
list[0].priority.
|
17
|
+
expect(list[0].priority).to eq("A")
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should be able to filter by priority' do
|
21
21
|
list.by_priority("A").each do |task|
|
22
|
-
task.priority.
|
22
|
+
expect(task.priority).to eq("A")
|
23
23
|
end
|
24
24
|
|
25
25
|
# Make sure some data was actually checked
|
26
|
-
list.by_priority("A").length.
|
26
|
+
expect(list.by_priority("A").length).to be > 0
|
27
27
|
end
|
28
28
|
|
29
29
|
it 'should be able to filter by context' do
|
30
30
|
list.by_context("@context").each do |task|
|
31
|
-
task.contexts.
|
31
|
+
expect(task.contexts).to include "@context"
|
32
32
|
end
|
33
33
|
|
34
34
|
# Make sure some data was actually checked
|
35
|
-
list.by_context("@context").length.
|
35
|
+
expect(list.by_context("@context").length).to be > 0
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'should be able to filter by project' do
|
39
39
|
list.by_project("+project").each do |task|
|
40
|
-
task.projects.
|
40
|
+
expect(task.projects).to include "+project"
|
41
41
|
end
|
42
42
|
|
43
43
|
# Make sure some data was actually checked
|
44
|
-
list.by_project("+project").length.
|
44
|
+
expect(list.by_project("+project").length).to be > 0
|
45
45
|
end
|
46
46
|
|
47
47
|
it 'should be able to filter by project, context and priority' do
|
@@ -50,38 +50,38 @@ describe Todo::List do
|
|
50
50
|
by_priority("C")
|
51
51
|
|
52
52
|
filtered.each do |task|
|
53
|
-
task.projects.
|
54
|
-
task.contexts.
|
55
|
-
task.priority.
|
53
|
+
expect(task.projects).to include "+project"
|
54
|
+
expect(task.contexts).to include "@context"
|
55
|
+
expect(task.priority).to eq("C")
|
56
56
|
end
|
57
57
|
|
58
58
|
# Make sure some data was actually checked
|
59
|
-
filtered.length.
|
59
|
+
expect(filtered.length).to be > 0
|
60
60
|
end
|
61
61
|
|
62
62
|
it 'should be able to filter by done' do
|
63
63
|
list.by_done.each do |task|
|
64
|
-
task.text.
|
64
|
+
expect(task.text).to include 'This task is completed'
|
65
65
|
end
|
66
66
|
|
67
|
-
list.by_done.length.
|
67
|
+
expect(list.by_done.length).to eq(2)
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'should be able to filter by not done' do
|
71
71
|
list.by_not_done.each do |task|
|
72
|
-
task.text.
|
72
|
+
expect(task.text).not_to include 'This task is completed'
|
73
73
|
end
|
74
74
|
|
75
|
-
list.by_not_done.length.
|
75
|
+
expect(list.by_not_done.length).to eq(9)
|
76
76
|
end
|
77
77
|
|
78
78
|
it 'should be sortable' do
|
79
79
|
list.sort.each_cons(2) do |task_a, task_b|
|
80
|
-
task_a.
|
80
|
+
expect(task_a).to be <= task_b
|
81
81
|
end
|
82
82
|
|
83
83
|
# Make sure some data was actually checked
|
84
|
-
list.sort.length.
|
84
|
+
expect(list.sort.length).to be > 0
|
85
85
|
|
86
86
|
# Class should still be Todo::List
|
87
87
|
# This assertion currently fails. TODO.
|
@@ -95,7 +95,7 @@ describe Todo::List do
|
|
95
95
|
Todo::Task.new("Another task!"),
|
96
96
|
])
|
97
97
|
|
98
|
-
l.length.
|
98
|
+
expect(l.length).to eq(2)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
data/spec/todo-txt/task_spec.rb
CHANGED
@@ -1,267 +1,275 @@
|
|
1
|
-
require
|
2
|
-
require 'date'
|
3
|
-
require 'timecop'
|
1
|
+
require 'spec_helper'
|
4
2
|
|
5
3
|
describe Todo::Task do
|
6
4
|
describe "Descriptions:" do
|
7
5
|
it 'should convert to a string' do
|
8
6
|
task = Todo::Task.new "(A) 2012-12-08 My task @test +test2"
|
9
|
-
task.to_s.
|
7
|
+
expect(task.to_s).to eq("(A) 2012-12-08 My task @test +test2")
|
10
8
|
end
|
11
|
-
|
9
|
+
|
12
10
|
it 'should keep track of the original string after changing the task' do
|
13
11
|
task = Todo::Task.new "(A) 2012-12-08 My task @test +test2"
|
14
12
|
Timecop.freeze(2013, 12, 8) do
|
15
13
|
task.do!
|
16
|
-
task.orig.
|
14
|
+
expect(task.orig).to eq("(A) 2012-12-08 My task @test +test2")
|
17
15
|
end
|
18
16
|
end
|
19
|
-
|
17
|
+
|
20
18
|
it 'should be modifiable' do
|
21
19
|
task = Todo::Task.new "2012-12-08 My task @test +test2"
|
22
20
|
task.projects.clear
|
23
21
|
task.contexts << ["@test3"]
|
24
22
|
Timecop.freeze(2013, 12, 8) do
|
25
23
|
task.do!
|
26
|
-
task.to_s.
|
24
|
+
expect(task.to_s).to eq("x 2013-12-08 2012-12-08 My task @test @test3")
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
30
28
|
it 'should be able to get just the text, no due date etc.' do
|
31
29
|
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-01-01 +project"
|
32
|
-
task.text.
|
30
|
+
expect(task.text).to eq("This is a sweet task.")
|
33
31
|
end
|
34
32
|
|
35
33
|
it 'should retain the original task creation string' do
|
36
34
|
task = Todo::Task.new "(A) This is an awesome task, yo. +winning"
|
37
|
-
task.orig.
|
35
|
+
expect(task.orig).to eq("(A) This is an awesome task, yo. +winning")
|
38
36
|
end
|
39
37
|
|
40
38
|
it 'should be able to get just the text, no contexts etc.' do
|
41
39
|
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context +project"
|
42
|
-
task.text.
|
40
|
+
expect(task.text).to eq("This is a sweet task.")
|
43
41
|
end
|
44
42
|
end
|
45
|
-
|
43
|
+
|
46
44
|
describe "Priorities:" do
|
47
45
|
it 'should recognise priorities' do
|
48
46
|
task = Todo::Task.new "(A) Hello world!"
|
49
|
-
task.priority.
|
47
|
+
expect(task.priority).to eq("A")
|
50
48
|
end
|
51
49
|
|
52
50
|
it 'should only recognise priorities at the start of a task' do
|
53
51
|
task = Todo::Task.new "Hello, world! (A)"
|
54
|
-
task.priority.
|
52
|
+
expect(task.priority).to eq(nil)
|
55
53
|
end
|
56
54
|
|
57
55
|
it 'should recognize priorities around dates' do
|
58
56
|
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context +project"
|
59
|
-
task.priority.
|
57
|
+
expect(task.priority).to eq("B")
|
60
58
|
end
|
61
59
|
|
62
60
|
it 'should remove the priority when calling Task#do!' do
|
63
61
|
task = Todo::Task.new "(A) Task"
|
64
62
|
task.do!
|
65
|
-
task.priority.
|
63
|
+
expect(task.priority).to be_nil
|
66
64
|
end
|
67
65
|
|
68
66
|
it 'should reset to the original priority when calling Task#undo!' do
|
69
67
|
task = Todo::Task.new "(A) Task"
|
70
68
|
task.do!
|
71
69
|
task.undo!
|
72
|
-
task.priority.
|
70
|
+
expect(task.priority).to eq("A")
|
73
71
|
end
|
74
72
|
end
|
75
73
|
|
76
74
|
describe "Completion:" do
|
77
75
|
it 'should be not done with missing date' do
|
78
76
|
task = Todo::Task.new "x This is not done"
|
79
|
-
task.done
|
77
|
+
expect(task.done?).to be false
|
80
78
|
end
|
81
79
|
|
82
80
|
it 'should be not done with malformed date' do
|
83
81
|
task = Todo::Task.new "x 01-01-2013 This is not done"
|
84
|
-
task.done
|
85
|
-
task.completed_on.
|
82
|
+
expect(task.done?).to be false
|
83
|
+
expect(task.completed_on).to be nil
|
86
84
|
end
|
87
85
|
|
88
86
|
it 'should be not done with an invalid date' do
|
89
87
|
task = Todo::Task.new "x 2013-02-31 This is not done"
|
90
|
-
task.done
|
91
|
-
task.completed_on.
|
88
|
+
expect(task.done?).to be false
|
89
|
+
expect(task.completed_on).to be nil
|
92
90
|
end
|
93
91
|
|
94
92
|
it 'should be done on 2013-04-22' do
|
95
93
|
task = Todo::Task.new "x 2013-04-22 This is really done"
|
96
|
-
task.done
|
97
|
-
task.completed_on.
|
94
|
+
expect(task.done?).to be true
|
95
|
+
expect(task.completed_on).to eq(Date.parse('22th April 2013'))
|
98
96
|
end
|
99
|
-
|
97
|
+
|
100
98
|
it 'should be able to recognise completed tasks' do
|
101
99
|
task = Todo::Task.new "x 2012-12-08 This is done!"
|
102
|
-
task.done
|
100
|
+
expect(task.done?).to be true
|
103
101
|
end
|
104
102
|
|
105
103
|
it 'should not recognize incomplete tasks as done' do
|
106
104
|
task = Todo::Task.new "2012-12-08 This ain't done!"
|
107
|
-
task.done
|
105
|
+
expect(task.done?).to be false
|
108
106
|
end
|
109
107
|
|
110
108
|
it 'should be completable' do
|
111
109
|
task = Todo::Task.new "2012-12-08 This ain't done!"
|
112
110
|
task.do!
|
113
|
-
task.done
|
111
|
+
expect(task.done?).to be true
|
114
112
|
end
|
115
113
|
|
116
114
|
it 'should be marked as incomplete' do
|
117
115
|
task = Todo::Task.new "x 2012-12-08 This is done!"
|
118
116
|
task.undo!
|
119
|
-
task.done
|
117
|
+
expect(task.done?).to be false
|
120
118
|
end
|
121
119
|
|
122
120
|
it 'should be marked as incomplete without any date' do
|
123
121
|
task = Todo::Task.new "x 2012-12-08 This is done!"
|
124
122
|
task.undo!
|
125
|
-
task.completed_on.
|
126
|
-
task.created_on.
|
123
|
+
expect(task.completed_on).to be_nil
|
124
|
+
expect(task.created_on).to be_nil
|
127
125
|
end
|
128
126
|
|
129
127
|
it 'should be toggable' do
|
130
128
|
task = Todo::Task.new "2012-12-08 This ain't done!"
|
131
129
|
task.toggle!
|
132
|
-
task.done
|
130
|
+
expect(task.done?).to be true
|
133
131
|
task.toggle!
|
134
|
-
task.done
|
132
|
+
expect(task.done?).to be false
|
135
133
|
end
|
136
134
|
end
|
137
|
-
|
135
|
+
|
138
136
|
describe "Contexts:" do
|
139
137
|
it 'should recognise contexts' do
|
140
138
|
task = Todo::Task.new "Hello, world! @test"
|
141
|
-
task.contexts.
|
139
|
+
expect(task.contexts).to eq(["@test"])
|
142
140
|
end
|
143
141
|
|
144
142
|
it 'should recognise multiple contexts' do
|
145
143
|
task = Todo::Task.new "Hello, world! @test @test2"
|
146
|
-
task.contexts.
|
144
|
+
expect(task.contexts).to eq(["@test", "@test2"])
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should recognise contexts with dashes and underscores' do
|
148
|
+
task = Todo::Task.new "Hello, world! @test-me @test2_me"
|
149
|
+
expect(task.contexts).to eq(["@test-me", "@test2_me"])
|
147
150
|
end
|
148
151
|
end
|
149
|
-
|
152
|
+
|
150
153
|
describe "Projects:" do
|
151
154
|
it 'should recognise projects' do
|
152
155
|
task = Todo::Task.new "Hello, world! +test"
|
153
|
-
task.projects.
|
156
|
+
expect(task.projects).to eq(["+test"])
|
154
157
|
end
|
155
158
|
|
156
159
|
it 'should recognise multiple projects' do
|
157
160
|
task = Todo::Task.new "Hello, world! +test +test2"
|
158
|
-
task.projects.
|
161
|
+
expect(task.projects).to eq(["+test", "+test2"])
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'should recognise projects with dashes and underscores' do
|
165
|
+
task = Todo::Task.new "Hello, world! +test-me +test2_me"
|
166
|
+
expect(task.projects).to eq(["+test-me", "+test2_me"])
|
159
167
|
end
|
160
168
|
end
|
161
|
-
|
169
|
+
|
162
170
|
describe "Creation dates:" do
|
163
171
|
it 'should be able to recognise creation dates' do
|
164
172
|
task = Todo::Task.new "(C) 2012-03-04 This has a date!"
|
165
|
-
task.created_on.
|
173
|
+
expect(task.created_on).to eq(Date.parse("4th March 2012"))
|
166
174
|
end
|
167
175
|
|
168
176
|
it 'should be able to recognise creation dates without priority' do
|
169
177
|
task = Todo::Task.new "2012-03-04 This has a date!"
|
170
|
-
task.created_on.
|
178
|
+
expect(task.created_on).to eq(Date.parse("4th March 2012"))
|
171
179
|
end
|
172
180
|
|
173
181
|
it 'should return nil if no creation date is present' do
|
174
182
|
task = Todo::Task.new "No date!"
|
175
|
-
task.created_on.
|
183
|
+
expect(task.created_on).to be_nil
|
176
184
|
end
|
177
185
|
|
178
186
|
it 'should not recognise malformed dates' do
|
179
187
|
task = Todo::Task.new "03-04-2012 This has a malformed date!"
|
180
|
-
task.created_on.
|
188
|
+
expect(task.created_on).to be_nil
|
181
189
|
end
|
182
|
-
|
190
|
+
|
183
191
|
it 'should be able to tell if the task is overdue' do
|
184
192
|
task = Todo::Task.new((Date.today - 1).to_s + " This task is overdue!")
|
185
|
-
task.overdue
|
193
|
+
expect(task.overdue?).to be false
|
186
194
|
end
|
187
195
|
|
188
196
|
it 'should return false on overdue? if there is no creation date' do
|
189
197
|
task = Todo::Task.new "No date!"
|
190
|
-
task.overdue
|
198
|
+
expect(task.overdue?).to be false
|
191
199
|
end
|
192
200
|
|
193
201
|
it 'should return nil on ridiculous date data' do
|
194
202
|
task = Todo::Task.new "2012-56-99 This has a malformed date!"
|
195
|
-
task.created_on.
|
203
|
+
expect(task.created_on).to be_nil
|
196
204
|
end
|
197
205
|
end
|
198
|
-
|
206
|
+
|
199
207
|
describe "Completion dates:" do
|
200
208
|
it 'should be able to recognise completion dates' do
|
201
209
|
task = Todo::Task.new "x 2012-12-08 This is done!"
|
202
|
-
task.completed_on.
|
210
|
+
expect(task.completed_on).to eq(Date.parse("8th December 2012"))
|
203
211
|
end
|
204
212
|
|
205
213
|
it 'should set the current completion dates when calling Task#do!' do
|
206
214
|
task = Todo::Task.new "2012-12-08 Task"
|
207
215
|
Timecop.freeze(2013, 12, 8) do
|
208
216
|
task.do!
|
209
|
-
task.completed_on.
|
217
|
+
expect(task.completed_on).to eq(Date.parse("8th December 2013"))
|
210
218
|
end
|
211
219
|
end
|
212
220
|
end
|
213
221
|
|
214
222
|
describe "Due dates:" do
|
215
|
-
|
223
|
+
it 'should have a due date' do
|
216
224
|
task = Todo::Task.new '(A) this task has due date due:2013-12-22'
|
217
|
-
task.due_on.
|
225
|
+
expect(task.due_on).not_to be_nil
|
218
226
|
end
|
219
227
|
|
220
228
|
it 'should due on 2013-12-22' do
|
221
229
|
task = Todo::Task.new '(A) this task has due date due:2013-12-22'
|
222
|
-
task.due_on.
|
230
|
+
expect(task.due_on).to eq(Date.parse('22th December 2013'))
|
223
231
|
end
|
224
232
|
|
225
233
|
it 'should not be overdue on 2013-12-01' do
|
226
234
|
task = Todo::Task.new '(A) this task has due date due:2013-12-22'
|
227
235
|
Timecop.freeze(2013, 12, 01) do
|
228
|
-
task.overdue
|
236
|
+
expect(task.overdue?).to be false
|
229
237
|
end
|
230
238
|
end
|
231
239
|
|
232
240
|
it 'should be overdue on 2013-12-23' do
|
233
241
|
task = Todo::Task.new '(A) this task has due date due:2013-12-22'
|
234
242
|
Timecop.freeze(2013, 12, 23) do
|
235
|
-
task.overdue
|
243
|
+
expect(task.overdue?).to be true
|
236
244
|
end
|
237
245
|
end
|
238
246
|
|
239
247
|
it 'should convert to a string with due date' do
|
240
248
|
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-01-01 +project"
|
241
|
-
task.to_s.
|
249
|
+
expect(task.to_s).to eq("x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context +project due:2012-01-01")
|
242
250
|
end
|
243
251
|
|
244
252
|
it 'should have no due date with malformed date' do
|
245
253
|
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:01-01-2012 +project"
|
246
|
-
task.due_on.
|
254
|
+
expect(task.due_on).to be_nil
|
247
255
|
end
|
248
256
|
|
249
257
|
it 'should have no due date with invalid date' do
|
250
258
|
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-02-31 +project"
|
251
|
-
task.due_on.
|
259
|
+
expect(task.due_on).to be_nil
|
252
260
|
end
|
253
261
|
|
254
262
|
it 'should recognize DUE:2013-12-22 (case insensitive)' do
|
255
263
|
task = Todo::Task.new '(A) this task has due date DUE:2013-12-22'
|
256
|
-
task.due_on.
|
264
|
+
expect(task.due_on).to eq(Date.parse('22th December 2013'))
|
257
265
|
end
|
258
|
-
|
266
|
+
|
259
267
|
it 'should reset to the original due date when calling Task#undo!' do
|
260
268
|
task = Todo::Task.new "2012-12-08 Task"
|
261
269
|
Timecop.freeze(2013, 12, 8) do
|
262
270
|
task.do!
|
263
271
|
task.undo!
|
264
|
-
task.created_on.
|
272
|
+
expect(task.created_on).to eq(Date.parse("8th December 2012"))
|
265
273
|
end
|
266
274
|
end
|
267
275
|
|
@@ -269,11 +277,11 @@ describe Todo::Task do
|
|
269
277
|
task = Todo::Task.new "2012-12-08 This ain't done!"
|
270
278
|
Timecop.freeze(2013, 12, 8) do
|
271
279
|
task.toggle!
|
272
|
-
task.completed_on.
|
273
|
-
task.created_on.
|
280
|
+
expect(task.completed_on).to eq(Date.parse("8th December 2013"))
|
281
|
+
expect(task.created_on).to eq(Date.parse("8th December 2012"))
|
274
282
|
task.toggle!
|
275
|
-
task.created_on.
|
276
|
-
task.completed_on.
|
283
|
+
expect(task.created_on).to eq(Date.parse("8th December 2012"))
|
284
|
+
expect(task.completed_on).to be_nil
|
277
285
|
end
|
278
286
|
end
|
279
287
|
end
|
@@ -284,7 +292,7 @@ describe Todo::Task do
|
|
284
292
|
task2 = Todo::Task.new "(B) Not quite so high."
|
285
293
|
|
286
294
|
assertion = task1 > task2
|
287
|
-
assertion.
|
295
|
+
expect(assertion).to eq(true)
|
288
296
|
end
|
289
297
|
|
290
298
|
it 'should be comparable to task without priority' do
|
@@ -292,7 +300,7 @@ describe Todo::Task do
|
|
292
300
|
task2 = Todo::Task.new "(B) Not quite so high."
|
293
301
|
|
294
302
|
assertion = task1 < task2
|
295
|
-
assertion.
|
303
|
+
expect(assertion).to eq(true)
|
296
304
|
end
|
297
305
|
|
298
306
|
it 'should be able to compare two tasks without priority' do
|
@@ -300,14 +308,14 @@ describe Todo::Task do
|
|
300
308
|
task2 = Todo::Task.new "Not quite so high."
|
301
309
|
|
302
310
|
assertion = task1 == task2
|
303
|
-
assertion.
|
311
|
+
expect(assertion).to eq(true)
|
304
312
|
end
|
305
313
|
end
|
306
|
-
|
314
|
+
|
307
315
|
describe "Logging:" do
|
308
316
|
it 'should have a logger' do
|
309
317
|
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-02-31 +project"
|
310
|
-
task.logger.
|
318
|
+
expect(task.logger).not_to be nil
|
311
319
|
end
|
312
320
|
|
313
321
|
it 'should call @logger.warn if #date called as deprecated method' do
|
@@ -317,7 +325,7 @@ describe Todo::Task do
|
|
317
325
|
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-02-31 +project"
|
318
326
|
error_message = 'Task#date is deprecated, use created_on instead.'
|
319
327
|
|
320
|
-
logger.
|
328
|
+
expect(logger).to receive(:warn).with(error_message)
|
321
329
|
task.date
|
322
330
|
end
|
323
331
|
end
|
data/todo-txt.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: todo-txt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.6'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Rose
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-10 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Allows for simple parsing of todo.txt files, as per Gina Trapani's todo.txt
|
14
14
|
project.
|
@@ -21,13 +21,13 @@ files:
|
|
21
21
|
- ".gitignore"
|
22
22
|
- ".travis.yml"
|
23
23
|
- Gemfile
|
24
|
-
- Gemfile.lock
|
25
24
|
- LICENSE
|
26
25
|
- README.md
|
27
26
|
- Rakefile
|
28
27
|
- lib/todo-txt.rb
|
29
28
|
- lib/todo-txt/list.rb
|
30
29
|
- lib/todo-txt/logger.rb
|
30
|
+
- lib/todo-txt/syntax.rb
|
31
31
|
- lib/todo-txt/task.rb
|
32
32
|
- spec/data/todo.txt
|
33
33
|
- spec/spec_helper.rb
|
data/Gemfile.lock
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
GEM
|
2
|
-
remote: https://rubygems.org/
|
3
|
-
specs:
|
4
|
-
diff-lcs (1.1.3)
|
5
|
-
multi_json (1.8.0)
|
6
|
-
rake (0.9.2.2)
|
7
|
-
rspec (2.9.0)
|
8
|
-
rspec-core (~> 2.9.0)
|
9
|
-
rspec-expectations (~> 2.9.0)
|
10
|
-
rspec-mocks (~> 2.9.0)
|
11
|
-
rspec-core (2.9.0)
|
12
|
-
rspec-expectations (2.9.1)
|
13
|
-
diff-lcs (~> 1.1.3)
|
14
|
-
rspec-mocks (2.9.0)
|
15
|
-
simplecov (0.7.1)
|
16
|
-
multi_json (~> 1.0)
|
17
|
-
simplecov-html (~> 0.7.1)
|
18
|
-
simplecov-html (0.7.1)
|
19
|
-
timecop (0.6.1)
|
20
|
-
|
21
|
-
PLATFORMS
|
22
|
-
ruby
|
23
|
-
|
24
|
-
DEPENDENCIES
|
25
|
-
bundler
|
26
|
-
rake
|
27
|
-
rspec
|
28
|
-
simplecov
|
29
|
-
timecop
|