todo-txt 0.3.1 → 0.4
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 -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
|
[](http://travis-ci.org/samwho/todo-txt-gem)
|
4
4
|
[](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: []
|