todo-txt 0.5 → 0.6
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 +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
|