todo-txt 0.3.1 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +1 -0
- data/Gemfile +6 -1
- data/Gemfile.lock +4 -1
- data/README.md +61 -42
- data/Rakefile +2 -0
- data/lib/todo-txt.rb +6 -4
- data/lib/todo-txt/list.rb +1 -1
- data/lib/todo-txt/logger.rb +21 -0
- data/lib/todo-txt/task.rb +187 -43
- data/spec/todo-txt/task_spec.rb +197 -11
- data/todo-txt.gemspec +2 -3
- metadata +8 -9
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: aab28ef27bccaf771aff05bbc5dbff0ac330143f
|
4
|
+
data.tar.gz: 454ff5faf63eaf1fbec2ed0e25fbb87ae6784c41
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 25cddbf92e85d098afa16bda2a3cf33a9ed5d8dc7fe60362194c8993b8073f6595838b982ca6e173b884da5cdd009211925270b3bc0e4063874fc0b2b80713f4
|
7
|
+
data.tar.gz: 2855f72b5b3417517d1126ab35c68c80a96663e8676309f31b5ab853d8a70d1e4406c051159abe317abd051f1fc585097c4ad189f155fceccf167b0921ad74e7
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
GEM
|
2
|
-
remote:
|
2
|
+
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
4
|
diff-lcs (1.1.3)
|
5
5
|
rake (0.9.2.2)
|
@@ -11,10 +11,13 @@ GEM
|
|
11
11
|
rspec-expectations (2.9.1)
|
12
12
|
diff-lcs (~> 1.1.3)
|
13
13
|
rspec-mocks (2.9.0)
|
14
|
+
timecop (0.6.1)
|
14
15
|
|
15
16
|
PLATFORMS
|
16
17
|
ruby
|
17
18
|
|
18
19
|
DEPENDENCIES
|
20
|
+
bundler
|
19
21
|
rake
|
20
22
|
rspec
|
23
|
+
timecop
|
data/README.md
CHANGED
@@ -3,13 +3,17 @@
|
|
3
3
|
[![Development Build Status](https://secure.travis-ci.org/samwho/todo-txt-gem.png?branch=develop)](http://travis-ci.org/samwho/todo-txt-gem)
|
4
4
|
[![Master Build Status](https://secure.travis-ci.org/samwho/todo-txt-gem.png?branch=master)](http://travis-ci.org/samwho/todo-txt-gem)
|
5
5
|
|
6
|
-
This is a Ruby client library for Gina Trapani's
|
6
|
+
This is a Ruby client library for Gina Trapani's
|
7
|
+
[todo.txt](https://github.com/ginatrapani/todo.txt-cli/). It allows for easy
|
8
|
+
parsing of task lists and tasks in the todo.txt format.
|
7
9
|
|
8
|
-
Find the project on GitHub:
|
10
|
+
Find the project on GitHub:
|
11
|
+
[http://github.com/samwho/todo-txt-gem](http://github.com/samwho/todo-txt-gem).
|
9
12
|
|
10
13
|
# Installation
|
11
14
|
|
12
|
-
Installation is very simple. The project is packaged as a Ruby gem and can be
|
15
|
+
Installation is very simple. The project is packaged as a Ruby gem and can be
|
16
|
+
installed by running:
|
13
17
|
|
14
18
|
gem install todo-txt
|
15
19
|
|
@@ -17,76 +21,91 @@ Installation is very simple. The project is packaged as a Ruby gem and can be in
|
|
17
21
|
|
18
22
|
## Todo::List
|
19
23
|
|
20
|
-
A `Todo::List` object encapsulates your todo.txt file. You initialise it by
|
24
|
+
A `Todo::List` object encapsulates your todo.txt file. You initialise it by
|
25
|
+
passing the path to your todo.txt to the constructor:
|
21
26
|
|
22
|
-
|
27
|
+
``` ruby
|
28
|
+
require 'todo-txt'
|
23
29
|
|
24
|
-
|
30
|
+
list = Todo::List.new "path/to/todo.txt"
|
31
|
+
```
|
25
32
|
|
26
|
-
`Todo::List` subclasses `Array` so it has all of the standard methods that are
|
33
|
+
`Todo::List` subclasses `Array` so it has all of the standard methods that are
|
34
|
+
available on an array. It is, basically, an array of `Todo::Task` items.
|
27
35
|
|
28
36
|
### Filtering
|
29
37
|
|
30
|
-
You can filter your todo list by priority, project, context or a combination of
|
38
|
+
You can filter your todo list by priority, project, context or a combination of
|
39
|
+
all three with ease.
|
31
40
|
|
32
|
-
|
41
|
+
``` ruby
|
42
|
+
require 'todo-txt'
|
33
43
|
|
34
|
-
|
44
|
+
list = Todo::List.new "path/to/todo.txt"
|
35
45
|
|
36
|
-
|
37
|
-
|
46
|
+
list.by_priority "A"
|
47
|
+
# => Contains a Todo::List object with only priority A tasks.
|
38
48
|
|
39
|
-
|
40
|
-
|
49
|
+
list.by_context "@code"
|
50
|
+
# => Returns a new Todo::List with only tasks that have a @code context.
|
41
51
|
|
42
|
-
|
43
|
-
|
44
|
-
|
52
|
+
list.by_project "+manhatten"
|
53
|
+
# => Returns a new Todo::List with only tasks that are part of the
|
54
|
+
# +manhatten project (see what I did there?)
|
45
55
|
|
46
|
-
|
47
|
-
|
56
|
+
# And you can combine these, like so
|
57
|
+
list.by_project("+manhatten").by_priority("B")
|
58
|
+
```
|
48
59
|
|
49
60
|
## Todo::Task
|
50
61
|
|
51
|
-
A `Todo::Task` object can be created from a standard task string if you don't
|
62
|
+
A `Todo::Task` object can be created from a standard task string if you don't
|
63
|
+
want to use the `Todo::List` approach (though using `Todo::List` is
|
64
|
+
recommended).
|
52
65
|
|
53
|
-
|
66
|
+
``` ruby
|
67
|
+
require 'todo-txt'
|
54
68
|
|
55
|
-
|
69
|
+
task = Todo::Task.new "(A) This task is top priority! +project @context"
|
56
70
|
|
57
|
-
|
58
|
-
|
71
|
+
task.priority
|
72
|
+
# => "A"
|
59
73
|
|
60
|
-
|
61
|
-
|
74
|
+
task.contexts
|
75
|
+
# => ["@context"]
|
62
76
|
|
63
|
-
|
64
|
-
|
77
|
+
task.projects
|
78
|
+
# => ["+project"]
|
65
79
|
|
66
|
-
|
67
|
-
|
80
|
+
task.text
|
81
|
+
# => "This task is top priority!"
|
68
82
|
|
69
|
-
|
70
|
-
|
83
|
+
task.orig
|
84
|
+
# => "(A) This task is top priority! +project @context"
|
85
|
+
```
|
71
86
|
|
72
87
|
### Comparable
|
73
88
|
|
74
|
-
The `Todo::Task` object includes the `Comparable` mixin. It compares with other
|
89
|
+
The `Todo::Task` object includes the `Comparable` mixin. It compares with other
|
90
|
+
tasks and sorts by priority in descending order.
|
75
91
|
|
76
|
-
|
77
|
-
|
92
|
+
``` ruby
|
93
|
+
task1 = Todo::Task.new "(A) Priority A."
|
94
|
+
task2 = Todo::Task.new "(B) Priority B."
|
78
95
|
|
79
|
-
|
80
|
-
|
96
|
+
task1 > task2
|
97
|
+
# => true
|
81
98
|
|
82
|
-
|
83
|
-
|
99
|
+
task1 == task2
|
100
|
+
# => false
|
84
101
|
|
85
|
-
|
86
|
-
|
102
|
+
task2 > task1
|
103
|
+
# => false
|
104
|
+
```
|
87
105
|
|
88
106
|
Tasks without a priority will always be less than a task with a priority.
|
89
107
|
|
90
108
|
# Requirements
|
91
109
|
|
92
|
-
The todo-txt gem requires Ruby 1.9.2 or higher. It doesn't currently run on
|
110
|
+
The todo-txt gem requires Ruby 1.9.2 or higher. It doesn't currently run on
|
111
|
+
1.8.7.
|
data/Rakefile
CHANGED
data/lib/todo-txt.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require file
|
4
|
-
end
|
1
|
+
lib = File.dirname(__FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
3
|
|
4
|
+
require 'logger'
|
5
|
+
require 'todo-txt/logger'
|
6
|
+
require 'todo-txt/list'
|
7
|
+
require 'todo-txt/task'
|
data/lib/todo-txt/list.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Todo
|
4
|
+
module Logger
|
5
|
+
def self.included base
|
6
|
+
base.extend(self)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.logger= new_logger
|
10
|
+
@@logger = new_logger
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.logger
|
14
|
+
@@logger ||= ::Logger.new(STDOUT)
|
15
|
+
end
|
16
|
+
|
17
|
+
def logger
|
18
|
+
Todo::Logger.logger
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/todo-txt/task.rb
CHANGED
@@ -3,6 +3,7 @@ require 'date'
|
|
3
3
|
module Todo
|
4
4
|
class Task
|
5
5
|
include Comparable
|
6
|
+
include Todo::Logger
|
6
7
|
|
7
8
|
# The regular expression used to match contexts.
|
8
9
|
def self.contexts_regex
|
@@ -15,8 +16,8 @@ module Todo
|
|
15
16
|
end
|
16
17
|
|
17
18
|
# The regex used to match priorities.
|
18
|
-
def self.
|
19
|
-
|
19
|
+
def self.priority_regex
|
20
|
+
/(?:^|\s+)\(([A-Za-z])\)\s+/
|
20
21
|
end
|
21
22
|
|
22
23
|
# The regex used to match dates.
|
@@ -24,14 +25,34 @@ module Todo
|
|
24
25
|
/(?:\s+|^)([0-9]{4}-[0-9]{2}-[0-9]{2})/
|
25
26
|
end
|
26
27
|
|
28
|
+
# The regex used to match creation date.
|
29
|
+
def self.created_on_regex
|
30
|
+
/(?:^|-\d{2}\s|\)\s)(\d{4}-\d{2}-\d{2})\s/
|
31
|
+
end
|
32
|
+
|
27
33
|
# The regex used to match completion.
|
28
34
|
def self.done_regex
|
29
|
-
/^x\s+/
|
35
|
+
/^x\s+(\d{4}-\d{2}-\d{2})\s+/
|
36
|
+
end
|
37
|
+
|
38
|
+
# The regex used to match due date.
|
39
|
+
def self.due_on_regex
|
40
|
+
/(?:due:)(\d{4}-\d{2}-\d{2})(?:\s+|$)/i
|
30
41
|
end
|
31
42
|
|
32
|
-
# Creates a new task. The argument that you pass in must be
|
43
|
+
# Creates a new task. The argument that you pass in must be the string
|
44
|
+
# representation of a task.
|
45
|
+
#
|
46
|
+
# Example:
|
47
|
+
#
|
48
|
+
# task = Todo::Task.new("(A) A high priority task!")
|
33
49
|
def initialize task
|
34
50
|
@orig = task
|
51
|
+
@completed_on = get_completed_date #orig.scan(self.class.done_regex)[1] ||= nil
|
52
|
+
@priority, @created_on = orig_priority, orig_created_on
|
53
|
+
@due_on = get_due_on_date
|
54
|
+
@contexts ||= orig.scan(self.class.contexts_regex).map { |item| item.strip }
|
55
|
+
@projects ||= orig.scan(self.class.projects_regex).map { |item| item.strip }
|
35
56
|
end
|
36
57
|
|
37
58
|
# Returns the original content of the task.
|
@@ -40,9 +61,46 @@ module Todo
|
|
40
61
|
#
|
41
62
|
# task = Todo::Task.new "(A) @context +project Hello!"
|
42
63
|
# task.orig #=> "(A) @context +project Hello!"
|
43
|
-
|
44
|
-
|
45
|
-
|
64
|
+
attr_reader :orig
|
65
|
+
|
66
|
+
# Returns the task's creation date, if any.
|
67
|
+
#
|
68
|
+
# Example:
|
69
|
+
#
|
70
|
+
# task = Todo::Task.new "(A) 2012-03-04 Task."
|
71
|
+
# task.created_on
|
72
|
+
# #=> <Date: 2012-03-04 (4911981/2,0,2299161)>
|
73
|
+
#
|
74
|
+
# Dates _must_ be in the YYYY-MM-DD format as specified in the todo.txt
|
75
|
+
# format. Dates in any other format will be classed as malformed and this
|
76
|
+
# attribute will be nil.
|
77
|
+
attr_reader :created_on
|
78
|
+
|
79
|
+
# Returns the task's completion date if task is done.
|
80
|
+
#
|
81
|
+
# Example:
|
82
|
+
#
|
83
|
+
# task = Todo::Task.new "x 2012-03-04 Task."
|
84
|
+
# task.completed_on
|
85
|
+
# #=> <Date: 2012-03-04 (4911981/2,0,2299161)>
|
86
|
+
#
|
87
|
+
# Dates _must_ be in the YYYY-MM-DD format as specified in the todo.txt
|
88
|
+
# format. Dates in any other format will be classed as malformed and this
|
89
|
+
# attribute will be nil.
|
90
|
+
attr_reader :completed_on
|
91
|
+
|
92
|
+
# Returns the task's due date, if any.
|
93
|
+
#
|
94
|
+
# Example:
|
95
|
+
#
|
96
|
+
# task = Todo::Task.new "(A) This is a task. due:2012-03-04"
|
97
|
+
# task.due_on
|
98
|
+
# #=> <Date: 2012-03-04 (4911981/2,0,2299161)>
|
99
|
+
#
|
100
|
+
# Dates _must_ be in the YYYY-MM-DD format as specified in the todo.txt
|
101
|
+
# format. Dates in any other format will be classed as malformed and this
|
102
|
+
# attribute will be nil.
|
103
|
+
attr_reader :due_on
|
46
104
|
|
47
105
|
# Returns the priority, if any.
|
48
106
|
#
|
@@ -53,33 +111,23 @@ module Todo
|
|
53
111
|
#
|
54
112
|
# task = Todo::Task.new "Some task."
|
55
113
|
# task.priority #=> nil
|
56
|
-
|
57
|
-
@priority ||= if orig =~ self.class.priotity_regex
|
58
|
-
orig[1]
|
59
|
-
else
|
60
|
-
nil
|
61
|
-
end
|
62
|
-
end
|
114
|
+
attr_reader :priority
|
63
115
|
|
64
|
-
#
|
116
|
+
# Returns an array of all the @context annotations.
|
65
117
|
#
|
66
118
|
# Example:
|
67
119
|
#
|
68
120
|
# task = Todo:Task.new "(A) @context Testing!"
|
69
121
|
# task.context #=> ["@context"]
|
70
|
-
|
71
|
-
@contexts ||= orig.scan(self.class.contexts_regex).map { |item| item.strip }
|
72
|
-
end
|
122
|
+
attr_reader :contexts
|
73
123
|
|
74
|
-
#
|
124
|
+
# Returns an array of all the +project annotations.
|
75
125
|
#
|
76
126
|
# Example:
|
77
127
|
#
|
78
128
|
# task = Todo:Task.new "(A) +test Testing!"
|
79
129
|
# task.projects #=> ["+test"]
|
80
|
-
|
81
|
-
@projects ||= orig.scan(self.class.projects_regex).map { |item| item.strip }
|
82
|
-
end
|
130
|
+
attr_reader :projects
|
83
131
|
|
84
132
|
# Gets just the text content of the todo, without the priority, contexts
|
85
133
|
# and projects annotations.
|
@@ -91,14 +139,15 @@ module Todo
|
|
91
139
|
def text
|
92
140
|
@text ||= orig.
|
93
141
|
gsub(self.class.done_regex, '').
|
94
|
-
gsub(self.class.
|
95
|
-
gsub(self.class.
|
142
|
+
gsub(self.class.priority_regex, '').
|
143
|
+
gsub(self.class.created_on_regex, '').
|
96
144
|
gsub(self.class.contexts_regex, '').
|
97
145
|
gsub(self.class.projects_regex, '').
|
146
|
+
gsub(self.class.due_on_regex, '').
|
98
147
|
strip
|
99
148
|
end
|
100
149
|
|
101
|
-
# Returns the
|
150
|
+
# Returns the task's creation date, if any.
|
102
151
|
#
|
103
152
|
# Example:
|
104
153
|
#
|
@@ -109,32 +158,24 @@ module Todo
|
|
109
158
|
# Dates _must_ be in the YYYY-MM-DD format as specified in the todo.txt
|
110
159
|
# format. Dates in any other format will be classed as malformed and this
|
111
160
|
# method will return nil.
|
161
|
+
#
|
162
|
+
# Deprecated
|
112
163
|
def date
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
@date = nil
|
117
|
-
end
|
164
|
+
logger.warn("Task#date is deprecated, use created_on instead.")
|
165
|
+
|
166
|
+
@created_on
|
118
167
|
end
|
119
168
|
|
120
|
-
#
|
121
|
-
# the current date.
|
122
|
-
#
|
123
|
-
# If there is no date specified for this task, this method returns nil.
|
169
|
+
# Returns whether a task's due date is in the past.
|
124
170
|
#
|
125
171
|
# Example:
|
126
172
|
#
|
127
|
-
# task = Todo::Task.new
|
173
|
+
# task = Todo::Task.new("This task is overdue! due:#{Date.today - 1}")
|
128
174
|
# task.overdue?
|
129
175
|
# #=> true
|
130
176
|
def overdue?
|
131
|
-
if
|
132
|
-
|
133
|
-
elsif date < Date.today
|
134
|
-
true
|
135
|
-
else
|
136
|
-
false
|
137
|
-
end
|
177
|
+
return true if !due_on.nil? && due_on < Date.today
|
178
|
+
false
|
138
179
|
end
|
139
180
|
|
140
181
|
# Returns if the task is done.
|
@@ -149,7 +190,79 @@ module Todo
|
|
149
190
|
# task.done?
|
150
191
|
# #=> false
|
151
192
|
def done?
|
152
|
-
|
193
|
+
!@completed_on.nil?
|
194
|
+
end
|
195
|
+
|
196
|
+
# Completes the task on the current date.
|
197
|
+
#
|
198
|
+
# Example:
|
199
|
+
#
|
200
|
+
# task = Todo::Task.new "2012-12-08 Task."
|
201
|
+
# task.done?
|
202
|
+
# #=> false
|
203
|
+
#
|
204
|
+
# task.do!
|
205
|
+
# task.done?
|
206
|
+
# #=> true
|
207
|
+
# task.date
|
208
|
+
# #=> # the current date
|
209
|
+
def do!
|
210
|
+
@completed_on = Date.today
|
211
|
+
@priority = nil
|
212
|
+
end
|
213
|
+
|
214
|
+
# Marks the task as incomplete and resets its original due date.
|
215
|
+
#
|
216
|
+
# Example:
|
217
|
+
#
|
218
|
+
# task = Todo::Task.new "x 2012-12-08 Task."
|
219
|
+
# task.done?
|
220
|
+
# #=> true
|
221
|
+
#
|
222
|
+
# task.undo!
|
223
|
+
# task.done?
|
224
|
+
# #=> false
|
225
|
+
# task.date
|
226
|
+
# #=> # <Date: 2012-03-04 (4911981/2,0,2299161)>
|
227
|
+
def undo!
|
228
|
+
@completed_on = nil
|
229
|
+
@priority = orig_priority
|
230
|
+
end
|
231
|
+
|
232
|
+
# Toggles the task from complete to incomplete or vice versa.
|
233
|
+
#
|
234
|
+
# Example:
|
235
|
+
#
|
236
|
+
# task = Todo::Task.new "x 2012-12-08 Task."
|
237
|
+
# task.done?
|
238
|
+
# #=> true
|
239
|
+
#
|
240
|
+
# task.toggle!
|
241
|
+
# task.done?
|
242
|
+
# #=> false
|
243
|
+
#
|
244
|
+
# task.toggle!
|
245
|
+
# task.done?
|
246
|
+
# #=> true
|
247
|
+
def toggle!
|
248
|
+
done? ? undo! : do!
|
249
|
+
end
|
250
|
+
|
251
|
+
# Returns this task as a string.
|
252
|
+
#
|
253
|
+
# Example:
|
254
|
+
#
|
255
|
+
# task = Todo::Task.new "(A) 2012-12-08 Task"
|
256
|
+
# task.to_s
|
257
|
+
# #=> "(A) 2012-12-08 Task"
|
258
|
+
def to_s
|
259
|
+
priority_string = priority ? "(#{priority}) " : ""
|
260
|
+
done_string = done? ? "x #{completed_on} " : ""
|
261
|
+
created_on_string = created_on ? "#{created_on} " : ""
|
262
|
+
contexts_string = contexts.empty? ? "" : " #{contexts.join ' '}"
|
263
|
+
projects_string = projects.empty? ? "" : " #{projects.join ' '}"
|
264
|
+
due_on_string = due_on.nil? ? "" : " due:#{due_on}"
|
265
|
+
"#{done_string}#{priority_string}#{created_on_string}#{text}#{contexts_string}#{projects_string}#{due_on_string}"
|
153
266
|
end
|
154
267
|
|
155
268
|
# Compares the priorities of two tasks.
|
@@ -178,5 +291,36 @@ module Todo
|
|
178
291
|
other_task.priority <=> self.priority
|
179
292
|
end
|
180
293
|
end
|
294
|
+
|
295
|
+
private
|
296
|
+
|
297
|
+
def orig_priority
|
298
|
+
@orig.match(self.class.priority_regex)[1] if @orig =~ self.class.priority_regex
|
299
|
+
end
|
300
|
+
|
301
|
+
def orig_created_on
|
302
|
+
begin
|
303
|
+
if @orig =~ self.class.created_on_regex
|
304
|
+
date = @orig.match self.class.created_on_regex
|
305
|
+
return Date.parse(date[1]) unless date.nil?
|
306
|
+
end
|
307
|
+
rescue; end
|
308
|
+
nil
|
309
|
+
end
|
310
|
+
|
311
|
+
def get_completed_date
|
312
|
+
begin
|
313
|
+
return Date.parse(self.class.done_regex.match(@orig)[1])
|
314
|
+
rescue; end
|
315
|
+
nil
|
316
|
+
end
|
317
|
+
|
318
|
+
def get_due_on_date
|
319
|
+
begin
|
320
|
+
return Date.parse(self.class.due_on_regex.match(@orig)[1])
|
321
|
+
rescue; end
|
322
|
+
nil
|
323
|
+
end
|
324
|
+
|
181
325
|
end
|
182
326
|
end
|
data/spec/todo-txt/task_spec.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require_relative '../spec_helper'
|
2
2
|
require 'date'
|
3
|
+
require 'timecop'
|
3
4
|
|
4
5
|
describe Todo::Task do
|
5
6
|
it 'should recognise priorities' do
|
@@ -12,6 +13,11 @@ describe Todo::Task do
|
|
12
13
|
task.priority.should == nil
|
13
14
|
end
|
14
15
|
|
16
|
+
it 'should recognize priorities around dates' do
|
17
|
+
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context +project"
|
18
|
+
task.priority.should == "B"
|
19
|
+
end
|
20
|
+
|
15
21
|
it 'should recognise contexts' do
|
16
22
|
task = Todo::Task.new "Hello, world! @test"
|
17
23
|
task.contexts.should == ["@test"]
|
@@ -38,7 +44,7 @@ describe Todo::Task do
|
|
38
44
|
end
|
39
45
|
|
40
46
|
it 'should be able to get just the text, no contexts etc.' do
|
41
|
-
task = Todo::Task.new "x (B) 2012-03-04 This is a sweet task. @context +project"
|
47
|
+
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context +project"
|
42
48
|
task.text.should == "This is a sweet task."
|
43
49
|
end
|
44
50
|
|
@@ -68,37 +74,37 @@ describe Todo::Task do
|
|
68
74
|
|
69
75
|
it 'should be able to recognise dates' do
|
70
76
|
task = Todo::Task.new "(C) 2012-03-04 This has a date!"
|
71
|
-
task.
|
77
|
+
task.created_on.should == Date.parse("4th March 2012")
|
72
78
|
end
|
73
79
|
|
74
80
|
it 'should be able to recognise dates without priority' do
|
75
81
|
task = Todo::Task.new "2012-03-04 This has a date!"
|
76
|
-
task.
|
82
|
+
task.created_on.should == Date.parse("4th March 2012")
|
77
83
|
end
|
78
84
|
|
79
85
|
it 'should return nil if no date is present' do
|
80
86
|
task = Todo::Task.new "No date!"
|
81
|
-
task.
|
87
|
+
task.created_on.should be_nil
|
82
88
|
end
|
83
89
|
|
84
90
|
it 'should not recognise malformed dates' do
|
85
91
|
task = Todo::Task.new "03-04-2012 This has a malformed date!"
|
86
|
-
task.
|
92
|
+
task.created_on.should be_nil
|
87
93
|
end
|
88
94
|
|
89
95
|
it 'should be able to tell if the task is overdue' do
|
90
96
|
task = Todo::Task.new((Date.today - 1).to_s + " This task is overdue!")
|
91
|
-
task.overdue?.should
|
97
|
+
task.overdue?.should be_false
|
92
98
|
end
|
93
99
|
|
94
|
-
it 'should return
|
100
|
+
it 'should return false on overdue? if there is no date' do
|
95
101
|
task = Todo::Task.new "No date!"
|
96
|
-
task.overdue?.should
|
102
|
+
task.overdue?.should be_false
|
97
103
|
end
|
98
104
|
|
99
105
|
it 'should return nil on ridiculous date data' do
|
100
106
|
task = Todo::Task.new "2012-56-99 This has a malformed date!"
|
101
|
-
task.
|
107
|
+
task.created_on.should be_nil
|
102
108
|
end
|
103
109
|
|
104
110
|
it 'should be able to recognise completed tasks' do
|
@@ -107,12 +113,192 @@ describe Todo::Task do
|
|
107
113
|
end
|
108
114
|
|
109
115
|
it 'should not recognize incomplete tasks as done' do
|
110
|
-
task = Todo::Task.new "2012-12-08 This
|
116
|
+
task = Todo::Task.new "2012-12-08 This ain't done!"
|
117
|
+
task.done?.should be_false
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'should be completable' do
|
121
|
+
task = Todo::Task.new "2012-12-08 This ain't done!"
|
122
|
+
task.do!
|
123
|
+
task.done?.should be_true
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should be marked as incomplete' do
|
127
|
+
task = Todo::Task.new "x 2012-12-08 This is done!"
|
128
|
+
task.undo!
|
129
|
+
task.done?.should be_false
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'should be marked as incomplete without any date' do
|
133
|
+
task = Todo::Task.new "x 2012-12-08 This is done!"
|
134
|
+
task.undo!
|
135
|
+
task.completed_on.should be_nil
|
136
|
+
task.created_on.should be_nil
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should be toggable' do
|
140
|
+
task = Todo::Task.new "2012-12-08 This ain't done!"
|
141
|
+
task.toggle!
|
142
|
+
task.done?.should be_true
|
143
|
+
task.toggle!
|
111
144
|
task.done?.should be_false
|
112
145
|
end
|
113
146
|
|
114
147
|
it 'should be able to recognise completion dates' do
|
115
148
|
task = Todo::Task.new "x 2012-12-08 This is done!"
|
116
|
-
task.
|
149
|
+
task.completed_on.should == Date.parse("8th December 2012")
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'should remove the priority when calling Task#do!' do
|
153
|
+
task = Todo::Task.new "(A) Task"
|
154
|
+
task.do!
|
155
|
+
task.priority.should be_nil
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'should reset to the original priority when calling Task#undo!' do
|
159
|
+
task = Todo::Task.new "(A) Task"
|
160
|
+
task.do!
|
161
|
+
task.undo!
|
162
|
+
task.priority.should == "A"
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'should set the current completion dates when calling Task#do!' do
|
166
|
+
task = Todo::Task.new "2012-12-08 Task"
|
167
|
+
Timecop.freeze(2013, 12, 8) do
|
168
|
+
task.do!
|
169
|
+
task.completed_on.should == Date.parse("8th December 2013")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
it 'should reset to the original due date when calling Task#undo!' do
|
174
|
+
task = Todo::Task.new "2012-12-08 Task"
|
175
|
+
Timecop.freeze(2013, 12, 8) do
|
176
|
+
task.do!
|
177
|
+
task.undo!
|
178
|
+
task.created_on.should == Date.parse("8th December 2012")
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'should manage dates when calling Task#toggle!' do
|
183
|
+
task = Todo::Task.new "2012-12-08 This ain't done!"
|
184
|
+
Timecop.freeze(2013, 12, 8) do
|
185
|
+
task.toggle!
|
186
|
+
task.completed_on.should == Date.parse("8th December 2013")
|
187
|
+
task.created_on.should == Date.parse("8th December 2012")
|
188
|
+
task.toggle!
|
189
|
+
task.created_on.should == Date.parse("8th December 2012")
|
190
|
+
task.completed_on.should be_nil
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'should convert to a string' do
|
195
|
+
task = Todo::Task.new "(A) 2012-12-08 My task @test +test2"
|
196
|
+
task.to_s.should == "(A) 2012-12-08 My task @test +test2"
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'should keep track of the original string after changing the task' do
|
200
|
+
task = Todo::Task.new "(A) 2012-12-08 My task @test +test2"
|
201
|
+
Timecop.freeze(2013, 12, 8) do
|
202
|
+
task.do!
|
203
|
+
task.orig.should == "(A) 2012-12-08 My task @test +test2"
|
204
|
+
end
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'should show be modifiable' do
|
208
|
+
task = Todo::Task.new "2012-12-08 My task @test +test2"
|
209
|
+
task.projects.clear
|
210
|
+
task.contexts << ["@test3"]
|
211
|
+
Timecop.freeze(2013, 12, 8) do
|
212
|
+
task.do!
|
213
|
+
task.to_s.should == "x 2013-12-08 2012-12-08 My task @test @test3"
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'should be not done with missing date' do
|
218
|
+
task = Todo::Task.new "x This is not done"
|
219
|
+
task.done?.should be false
|
220
|
+
end
|
221
|
+
|
222
|
+
it 'should be not done with malformed date' do
|
223
|
+
task = Todo::Task.new "x 01-01-2013 This is not done"
|
224
|
+
task.done?.should be false
|
225
|
+
task.completed_on.should be nil
|
226
|
+
end
|
227
|
+
|
228
|
+
it 'should be not done with an invalid date' do
|
229
|
+
task = Todo::Task.new "x 2013-02-31 This is not done"
|
230
|
+
task.done?.should be false
|
231
|
+
task.completed_on.should be nil
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'should be done on 2013-04-22' do
|
235
|
+
task = Todo::Task.new "x 2013-04-22 This is really done"
|
236
|
+
task.done?.should be true
|
237
|
+
task.completed_on.should == Date.parse('22th April 2013')
|
238
|
+
end
|
239
|
+
|
240
|
+
its 'should have a due date' do
|
241
|
+
task = Todo::Task.new '(A) this task has due date due:2013-12-22'
|
242
|
+
task.due_on.should_not be_nil
|
243
|
+
end
|
244
|
+
|
245
|
+
it 'should due on 2013-12-22' do
|
246
|
+
task = Todo::Task.new '(A) this task has due date due:2013-12-22'
|
247
|
+
task.due_on.should == Date.parse('22th December 2013')
|
248
|
+
end
|
249
|
+
|
250
|
+
it 'should not be overdue on 2013-12-01' do
|
251
|
+
task = Todo::Task.new '(A) this task has due date due:2013-12-22'
|
252
|
+
Timecop.freeze(2013, 12, 01) do
|
253
|
+
task.overdue?.should be_false
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'should be overdue on 2013-12-23' do
|
258
|
+
task = Todo::Task.new '(A) this task has due date due:2013-12-22'
|
259
|
+
Timecop.freeze(2013, 12, 23) do
|
260
|
+
task.overdue?.should be_true
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'should be able to get just the text, no due date etc.' do
|
265
|
+
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-01-01 +project"
|
266
|
+
task.text.should == "This is a sweet task."
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'should convert to a string with due date' do
|
270
|
+
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-01-01 +project"
|
271
|
+
task.to_s.should == "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context +project due:2012-01-01"
|
272
|
+
end
|
273
|
+
|
274
|
+
it 'should have no due date with malformed date' do
|
275
|
+
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:01-01-2012 +project"
|
276
|
+
task.due_on.should be_nil
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'should have no due date with invalid date' do
|
280
|
+
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-02-31 +project"
|
281
|
+
task.due_on.should be_nil
|
282
|
+
end
|
283
|
+
|
284
|
+
it 'should recognize DUE:2013-12-22 (case insensitive)' do
|
285
|
+
task = Todo::Task.new '(A) this task has due date DUE:2013-12-22'
|
286
|
+
task.due_on.should == Date.parse('22th December 2013')
|
287
|
+
end
|
288
|
+
|
289
|
+
it 'should have a logger' do
|
290
|
+
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-02-31 +project"
|
291
|
+
task.logger.should_not be nil
|
292
|
+
end
|
293
|
+
|
294
|
+
it 'should call @logger.warn if #date called as deprecated method' do
|
295
|
+
logger = double(Logger)
|
296
|
+
Todo::Logger.logger = logger
|
297
|
+
|
298
|
+
task = Todo::Task.new "x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-02-31 +project"
|
299
|
+
error_message = 'Task#date is deprecated, use created_on instead.'
|
300
|
+
|
301
|
+
logger.should_receive(:warn).with(error_message)
|
302
|
+
task.date
|
117
303
|
end
|
118
304
|
end
|
data/todo-txt.gemspec
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{todo-txt}
|
3
|
-
s.version = "0.
|
4
|
-
s.date = %q{2012-03-31}
|
3
|
+
s.version = "0.4"
|
5
4
|
s.authors = ["Sam Rose"]
|
6
5
|
s.email = %q{samwho@lbak.co.uk}
|
7
6
|
s.summary = %q{A client library for parsing todo.txt files.}
|
@@ -11,5 +10,5 @@ Gem::Specification.new do |s|
|
|
11
10
|
s.license = 'GPL-2'
|
12
11
|
|
13
12
|
# Add all files to the files parameter.
|
14
|
-
s.files = `git ls-files`.split
|
13
|
+
s.files = `git ls-files`.split(/\n/)
|
15
14
|
end
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: todo-txt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: '0.4'
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Sam Rose
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-11-15 00:00:00.000000000 Z
|
13
12
|
dependencies: []
|
14
13
|
description: Allows for simple parsing of todo.txt files, as per Gina Trapani's todo.txt
|
15
14
|
project.
|
@@ -28,6 +27,7 @@ files:
|
|
28
27
|
- Rakefile
|
29
28
|
- lib/todo-txt.rb
|
30
29
|
- lib/todo-txt/list.rb
|
30
|
+
- lib/todo-txt/logger.rb
|
31
31
|
- lib/todo-txt/task.rb
|
32
32
|
- spec/data/todo.txt
|
33
33
|
- spec/spec_helper.rb
|
@@ -37,26 +37,25 @@ files:
|
|
37
37
|
homepage: http://github.com/samwho/todo-txt-gem
|
38
38
|
licenses:
|
39
39
|
- GPL-2
|
40
|
+
metadata: {}
|
40
41
|
post_install_message:
|
41
42
|
rdoc_options: []
|
42
43
|
require_paths:
|
43
44
|
- lib
|
44
45
|
required_ruby_version: !ruby/object:Gem::Requirement
|
45
|
-
none: false
|
46
46
|
requirements:
|
47
|
-
- -
|
47
|
+
- - '>='
|
48
48
|
- !ruby/object:Gem::Version
|
49
49
|
version: 1.9.2
|
50
50
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
51
|
requirements:
|
53
|
-
- -
|
52
|
+
- - '>='
|
54
53
|
- !ruby/object:Gem::Version
|
55
54
|
version: '0'
|
56
55
|
requirements: []
|
57
56
|
rubyforge_project:
|
58
|
-
rubygems_version:
|
57
|
+
rubygems_version: 2.0.3
|
59
58
|
signing_key:
|
60
|
-
specification_version:
|
59
|
+
specification_version: 4
|
61
60
|
summary: A client library for parsing todo.txt files.
|
62
61
|
test_files: []
|