todo-txt 0.6 → 0.7
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/.travis.yml +2 -1
- data/README.md +10 -7
- data/lib/todo-txt/logger.rb +11 -8
- data/lib/todo-txt/syntax.rb +78 -17
- data/lib/todo-txt/task.rb +27 -45
- data/spec/todo-txt/list_spec.rb +79 -48
- data/spec/todo-txt/syntax_spec.rb +131 -0
- data/spec/todo-txt/task_spec.rb +156 -84
- data/todo-txt.gemspec +2 -2
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd4d9a9131316d54020bfc771727481a05a7694f
|
4
|
+
data.tar.gz: 98e9a7d6a3ba5070db9521140d7d2f340a59cc27
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d7c8d30855037df15053d219e4051dbd2f93d29bca14fa2f7477b706d634a433a282f9e51d3a7239b92d63f5e47bf291463846c5f663ac19b31cff197e0772a
|
7
|
+
data.tar.gz: 1cd0e7eed6b6de21fc4e6d19b8addff687f0c513c1c823441696ff8dae4c9466ac9ca3283fa53290d6e2525f518c89ace94dafef66895b3b8fe24a1db978fd89
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
# Todo.txt
|
2
2
|
|
3
|
-
[](https://rubygems.org/gems/todo-txt)
|
4
|
+
[](https://travis-ci.org/samwho/todo-txt-gem)
|
5
5
|
|
6
6
|
This is a Ruby client library for Gina Trapani's
|
7
7
|
[todo.txt](https://github.com/ginatrapani/todo.txt-cli/). It allows for easy
|
8
|
-
|
8
|
+
management of task lists and tasks in the todo.txt format.
|
9
9
|
|
10
10
|
Find the project on GitHub:
|
11
11
|
[http://github.com/samwho/todo-txt-gem](http://github.com/samwho/todo-txt-gem).
|
12
12
|
|
13
|
+
Find the full API docs on Rubydoc.info:
|
14
|
+
[http://www.rubydoc.info/gems/todo-txt](http://www.rubydoc.info/gems/todo-txt).
|
15
|
+
|
13
16
|
# Installation
|
14
17
|
|
15
18
|
Installation is very simple. The project is packaged as a Ruby gem and can be
|
@@ -49,12 +52,12 @@ list.by_priority "A"
|
|
49
52
|
list.by_context "@code"
|
50
53
|
# => Returns a new Todo::List with only tasks that have a @code context.
|
51
54
|
|
52
|
-
list.by_project "+
|
55
|
+
list.by_project "+manhattan"
|
53
56
|
# => Returns a new Todo::List with only tasks that are part of the
|
54
|
-
# +
|
57
|
+
# +manhattan project (see what I did there?)
|
55
58
|
|
56
59
|
# And you can combine these, like so
|
57
|
-
list.by_project("+
|
60
|
+
list.by_project("+manhattan").by_priority("B")
|
58
61
|
```
|
59
62
|
|
60
63
|
## Todo::Task
|
@@ -107,4 +110,4 @@ Tasks without a priority will always be less than a task with a priority.
|
|
107
110
|
|
108
111
|
# Requirements
|
109
112
|
|
110
|
-
The todo-txt gem requires Ruby
|
113
|
+
The todo-txt gem requires Ruby 2.0 or higher.
|
data/lib/todo-txt/logger.rb
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
3
|
module Todo
|
4
|
+
# Handles depreciation warnings and other issues related to API usage
|
4
5
|
module Logger
|
5
|
-
def self.included
|
6
|
+
def self.included(base)
|
6
7
|
base.extend(self)
|
7
8
|
end
|
8
9
|
|
9
|
-
def
|
10
|
-
|
10
|
+
def logger
|
11
|
+
Todo::Logger.logger
|
11
12
|
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
class << self
|
15
|
+
# Sets a new logger object
|
16
|
+
attr_writer :logger
|
16
17
|
|
17
|
-
|
18
|
-
|
18
|
+
# Creates a new logger object
|
19
|
+
def logger
|
20
|
+
@logger ||= ::Logger.new(STDOUT)
|
21
|
+
end
|
19
22
|
end
|
20
23
|
end
|
21
24
|
end
|
data/lib/todo-txt/syntax.rb
CHANGED
@@ -1,33 +1,94 @@
|
|
1
1
|
module Todo
|
2
2
|
module Syntax
|
3
3
|
# The regular expression used to match contexts.
|
4
|
-
|
5
|
-
/(?:\s+|^)@[^\s]+/
|
6
|
-
end
|
4
|
+
CONTEXTS_PATTERN = /(?:\s+|^)@[^\s]+/.freeze
|
7
5
|
|
8
6
|
# The regex used to match projects.
|
9
|
-
|
10
|
-
/(?:\s+|^)\+[^\s]+/
|
11
|
-
end
|
7
|
+
PROJECTS_PATTERN = /(?:\s+|^)\+[^\s]+/.freeze
|
12
8
|
|
13
9
|
# The regex used to match priorities.
|
14
|
-
|
15
|
-
/(?:^|\s+)\(([A-Za-z])\)\s+/
|
16
|
-
end
|
10
|
+
PRIORITY_PATTERN = /(?:^|\s+)\(([A-Za-z])\)\s+/
|
17
11
|
|
18
12
|
# The regex used to match creation date.
|
19
|
-
|
20
|
-
/(?:^|-\d{2}\s|\)\s)(\d{4}-\d{2}-\d{2})\s/
|
21
|
-
end
|
13
|
+
CREATED_ON_PATTERN = /(?:^|-\d{2}\s|\)\s)(\d{4}-\d{2}-\d{2})\s/.freeze
|
22
14
|
|
23
15
|
# The regex used to match completion.
|
24
|
-
|
25
|
-
/^x\s+(\d{4}-\d{2}-\d{2})\s+/
|
26
|
-
end
|
16
|
+
COMPLETED_ON_PATTERN = /^x\s+(\d{4}-\d{2}-\d{2})\s+/.freeze
|
27
17
|
|
28
18
|
# The regex used to match due date.
|
29
|
-
|
30
|
-
|
19
|
+
DUE_ON_PATTERN = /(?:due:)(\d{4}-\d{2}-\d{2})(?:\s+|$)/i.freeze
|
20
|
+
|
21
|
+
def get_item_text(line)
|
22
|
+
line.
|
23
|
+
gsub(COMPLETED_ON_PATTERN, '').
|
24
|
+
gsub(PRIORITY_PATTERN, '').
|
25
|
+
gsub(CREATED_ON_PATTERN, '').
|
26
|
+
gsub(CONTEXTS_PATTERN, '').
|
27
|
+
gsub(PROJECTS_PATTERN, '').
|
28
|
+
gsub(DUE_ON_PATTERN, '').
|
29
|
+
strip
|
30
|
+
end
|
31
|
+
|
32
|
+
def orig_priority(line)
|
33
|
+
line.match(PRIORITY_PATTERN)[1] if line =~ PRIORITY_PATTERN
|
34
|
+
end
|
35
|
+
|
36
|
+
# Extracts the creation date for the given todo item.
|
37
|
+
# Returns nil if a valid date is not found.
|
38
|
+
#
|
39
|
+
# @param line [String] the todo item to be processed
|
40
|
+
# @return [Date] the created date of the line
|
41
|
+
def orig_created_on(line)
|
42
|
+
date = line.match CREATED_ON_PATTERN
|
43
|
+
begin
|
44
|
+
Date.parse(date[1]) if date
|
45
|
+
rescue ArgumentError
|
46
|
+
return nil # The given date is not valid
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Extracts the completion date for the given todo item.
|
51
|
+
# Returns nil if a valid date is not found.
|
52
|
+
#
|
53
|
+
# @param line [String] the todo item to be processed
|
54
|
+
# @return [Date] the completed date of the line
|
55
|
+
def get_completed_date(line)
|
56
|
+
date = COMPLETED_ON_PATTERN.match(line)
|
57
|
+
begin
|
58
|
+
Date.parse(date[1]) if date
|
59
|
+
rescue ArgumentError
|
60
|
+
return nil # The given date is not valid
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Extracts the completion date for the given todo item.
|
65
|
+
# Returns nil if a valid date is not found.
|
66
|
+
#
|
67
|
+
# @param line [String] the todo item to be processed
|
68
|
+
# @return [Date] the due date of the line
|
69
|
+
def get_due_on_date(line)
|
70
|
+
date = DUE_ON_PATTERN.match(line)
|
71
|
+
begin
|
72
|
+
Date.parse(date[1]) if date
|
73
|
+
rescue ArgumentError
|
74
|
+
return nil # The given date is not valid
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Extract the list of `@context` tags out of the task line.
|
79
|
+
#
|
80
|
+
# @param [String] line Line of text encoding a single task
|
81
|
+
# @return [Array<String>] List of context tags
|
82
|
+
def extract_contexts(line)
|
83
|
+
line.scan(CONTEXTS_PATTERN).map { |tag| tag.strip }
|
84
|
+
end
|
85
|
+
|
86
|
+
# Extract the list of `+project` tags out of the task line.
|
87
|
+
#
|
88
|
+
# @param [String] line Line of text encoding a single task
|
89
|
+
# @return [Array<String>] List of project tags
|
90
|
+
def extract_projects(line)
|
91
|
+
line.scan(PROJECTS_PATTERN).map { |tag| tag.strip }
|
31
92
|
end
|
32
93
|
end
|
33
94
|
end
|
data/lib/todo-txt/task.rb
CHANGED
@@ -14,11 +14,11 @@ module Todo
|
|
14
14
|
# task = Todo::Task.new("(A) A high priority task!")
|
15
15
|
def initialize task
|
16
16
|
@orig = task
|
17
|
-
@completed_on = get_completed_date
|
18
|
-
@priority, @created_on = orig_priority, orig_created_on
|
19
|
-
@due_on = get_due_on_date
|
20
|
-
@contexts ||= orig
|
21
|
-
@projects ||= orig
|
17
|
+
@completed_on = get_completed_date(orig)
|
18
|
+
@priority, @created_on = orig_priority(orig), orig_created_on(orig)
|
19
|
+
@due_on = get_due_on_date(orig)
|
20
|
+
@contexts ||= extract_contexts(orig)
|
21
|
+
@projects ||= extract_projects(orig)
|
22
22
|
end
|
23
23
|
|
24
24
|
# Returns the original content of the task.
|
@@ -103,14 +103,7 @@ module Todo
|
|
103
103
|
# task = Todo::Task.new "(A) @test Testing!"
|
104
104
|
# task.text #=> "Testing!"
|
105
105
|
def text
|
106
|
-
@text ||= orig
|
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, '').
|
113
|
-
strip
|
106
|
+
@text ||= get_item_text(orig)
|
114
107
|
end
|
115
108
|
|
116
109
|
# Returns the task's creation date, if any.
|
@@ -195,7 +188,27 @@ module Todo
|
|
195
188
|
# #=> nil
|
196
189
|
def undo!
|
197
190
|
@completed_on = nil
|
198
|
-
@priority = orig_priority
|
191
|
+
@priority = orig_priority(orig)
|
192
|
+
end
|
193
|
+
|
194
|
+
# Increases the priority until A. If it's nil, it sets it to A.
|
195
|
+
# @return [Char] the new priority of the task
|
196
|
+
def priority_inc!
|
197
|
+
if @priority.nil?
|
198
|
+
@priority = 'A'
|
199
|
+
elsif @priority.ord > 65
|
200
|
+
@priority = (@priority.ord - 1).chr
|
201
|
+
end
|
202
|
+
@priority
|
203
|
+
end
|
204
|
+
|
205
|
+
# Decreases the priority until Z. if it's nil, it does nothing and
|
206
|
+
# returns nil.
|
207
|
+
# @return [Char] the new priority of the task
|
208
|
+
def priority_dec!
|
209
|
+
return if @priority.nil?
|
210
|
+
@priority = @priority.next if @priority.ord < 90
|
211
|
+
@priority
|
199
212
|
end
|
200
213
|
|
201
214
|
# Toggles the task from complete to incomplete or vice versa.
|
@@ -260,36 +273,5 @@ module Todo
|
|
260
273
|
other_task.priority <=> self.priority
|
261
274
|
end
|
262
275
|
end
|
263
|
-
|
264
|
-
private
|
265
|
-
|
266
|
-
def orig_priority
|
267
|
-
@orig.match(priority_regex)[1] if @orig =~ priority_regex
|
268
|
-
end
|
269
|
-
|
270
|
-
def orig_created_on
|
271
|
-
begin
|
272
|
-
if @orig =~ created_on_regex
|
273
|
-
date = @orig.match created_on_regex
|
274
|
-
return Date.parse(date[1]) unless date.nil?
|
275
|
-
end
|
276
|
-
rescue; end
|
277
|
-
nil
|
278
|
-
end
|
279
|
-
|
280
|
-
def get_completed_date
|
281
|
-
begin
|
282
|
-
return Date.parse(done_regex.match(@orig)[1])
|
283
|
-
rescue; end
|
284
|
-
nil
|
285
|
-
end
|
286
|
-
|
287
|
-
def get_due_on_date
|
288
|
-
begin
|
289
|
-
return Date.parse(due_on_regex.match(@orig)[1])
|
290
|
-
rescue; end
|
291
|
-
nil
|
292
|
-
end
|
293
|
-
|
294
276
|
end
|
295
277
|
end
|
data/spec/todo-txt/list_spec.rb
CHANGED
@@ -4,75 +4,116 @@ 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
|
+
context 'create with an array' do
|
8
|
+
it 'successfully creates an object' do
|
9
|
+
array = Array.new
|
10
|
+
array.push "(A) A string task!"
|
11
|
+
array.push Todo::Task.new("(A) An actual task!")
|
12
|
+
expect(Todo::List.new array).not_to eq(nil)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'does not have a path' do
|
16
|
+
array = Array.new
|
17
|
+
array.push "(A) A string task!"
|
18
|
+
array.push Todo::Task.new("(A) An actual task!")
|
19
|
+
expect(Todo::List.new(array).path).to eq(nil)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'accepts a mix of tasks and strings' do
|
24
|
+
l = Todo::List.new([
|
25
|
+
"A task!",
|
26
|
+
Todo::Task.new("Another task!"),
|
27
|
+
])
|
28
|
+
|
29
|
+
expect(l.length).to eq(2)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'has the correct path' do
|
8
33
|
expect(list.path).to eq(path)
|
9
34
|
end
|
10
35
|
|
11
|
-
it '
|
36
|
+
it 'creates a list of Todo::Tasks' do
|
12
37
|
list.each do |task|
|
13
38
|
expect(task.class).to eq(Todo::Task)
|
14
39
|
end
|
40
|
+
end
|
15
41
|
|
16
|
-
|
17
|
-
expect(list
|
42
|
+
it 'it retrieves the list in the expected order' do
|
43
|
+
expect(list.first.text).to eq('Crack the Da Vinci Code.')
|
44
|
+
expect(list.last.text).to eq(
|
45
|
+
'This task is completed and has created and completion dates')
|
18
46
|
end
|
19
47
|
|
20
|
-
it '
|
21
|
-
list.
|
22
|
-
|
23
|
-
end
|
48
|
+
it 'it retrieves the expected number of items' do
|
49
|
+
expect(list.count).to eq(11)
|
50
|
+
end
|
24
51
|
|
52
|
+
it 'should be able to filter by priority' do
|
25
53
|
# Make sure some data was actually checked
|
26
|
-
|
27
|
-
|
54
|
+
priority_list = list.by_priority('A')
|
55
|
+
expect(priority_list.length).to be > 0
|
28
56
|
|
29
|
-
|
30
|
-
|
31
|
-
expect(task.contexts).to include "@context"
|
57
|
+
priority_list.each do |task|
|
58
|
+
expect(task.priority).to eq('A')
|
32
59
|
end
|
60
|
+
end
|
33
61
|
|
62
|
+
it 'should be able to filter by context' do
|
34
63
|
# Make sure some data was actually checked
|
35
|
-
|
36
|
-
|
64
|
+
context_list = list.by_context('@context')
|
65
|
+
expect(context_list.length).to be > 0
|
37
66
|
|
38
|
-
|
39
|
-
|
40
|
-
expect(task.projects).to include "+project"
|
67
|
+
context_list.each do |task|
|
68
|
+
expect(task.contexts).to include '@context'
|
41
69
|
end
|
70
|
+
end
|
42
71
|
|
72
|
+
it 'should be able to filter by project' do
|
43
73
|
# Make sure some data was actually checked
|
44
|
-
|
74
|
+
project_list = list.by_project('+project')
|
75
|
+
expect(project_list.length).to be > 0
|
76
|
+
|
77
|
+
project_list.each do |task|
|
78
|
+
expect(task.projects).to include '+project'
|
79
|
+
end
|
45
80
|
end
|
46
81
|
|
47
82
|
it 'should be able to filter by project, context and priority' do
|
48
|
-
filtered = list.by_project(
|
49
|
-
by_context(
|
50
|
-
by_priority(
|
83
|
+
filtered = list.by_project('+project').
|
84
|
+
by_context('@context').
|
85
|
+
by_priority('C')
|
86
|
+
|
87
|
+
# Make sure some data was actually checked
|
88
|
+
expect(filtered.length).to be > 0
|
51
89
|
|
52
90
|
filtered.each do |task|
|
53
|
-
expect(task.projects).to include
|
54
|
-
expect(task.contexts).to include
|
55
|
-
expect(task.priority).to eq(
|
91
|
+
expect(task.projects).to include '+project'
|
92
|
+
expect(task.contexts).to include '@context'
|
93
|
+
expect(task.priority).to eq('C')
|
56
94
|
end
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'filters by done' do
|
98
|
+
done_list = list.by_done
|
57
99
|
|
58
100
|
# Make sure some data was actually checked
|
59
|
-
expect(
|
60
|
-
end
|
101
|
+
expect(done_list.length).to eq(2)
|
61
102
|
|
62
|
-
it 'should be able to filter by done' do
|
63
103
|
list.by_done.each do |task|
|
64
104
|
expect(task.text).to include 'This task is completed'
|
65
105
|
end
|
66
|
-
|
67
|
-
expect(list.by_done.length).to eq(2)
|
68
106
|
end
|
69
107
|
|
70
|
-
it '
|
71
|
-
list.by_not_done
|
108
|
+
it 'filters by not done' do
|
109
|
+
not_done_list = list.by_not_done
|
110
|
+
|
111
|
+
# Make sure some data was actually checked
|
112
|
+
expect(not_done_list.length).to eq(9)
|
113
|
+
|
114
|
+
not_done_list.each do |task|
|
72
115
|
expect(task.text).not_to include 'This task is completed'
|
73
116
|
end
|
74
|
-
|
75
|
-
expect(list.by_not_done.length).to eq(9)
|
76
117
|
end
|
77
118
|
|
78
119
|
it 'should be sortable' do
|
@@ -82,20 +123,10 @@ describe Todo::List do
|
|
82
123
|
|
83
124
|
# Make sure some data was actually checked
|
84
125
|
expect(list.sort.length).to be > 0
|
85
|
-
|
86
|
-
# Class should still be Todo::List
|
87
|
-
# This assertion currently fails. TODO.
|
88
|
-
# list.sort.should be_a Todo::List
|
89
126
|
end
|
90
127
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
Todo::Task.new("Another task!"),
|
96
|
-
])
|
97
|
-
|
98
|
-
expect(l.length).to eq(2)
|
99
|
-
end
|
100
|
-
end
|
128
|
+
it 'returns a list on sort'
|
129
|
+
# Class should still be Todo::List
|
130
|
+
# This assertion currently fails. TODO.
|
131
|
+
# expect(list.sort).to be_a Todo::List
|
101
132
|
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Todo::Syntax do
|
4
|
+
include Todo::Syntax
|
5
|
+
|
6
|
+
describe '#get_context_tags' do
|
7
|
+
specify 'empty task' do
|
8
|
+
expect(extract_contexts('')).to eq([])
|
9
|
+
end
|
10
|
+
|
11
|
+
specify 'task without context' do
|
12
|
+
expect(extract_contexts('something to do')).to eq([])
|
13
|
+
end
|
14
|
+
|
15
|
+
specify 'task with single context' do
|
16
|
+
expect(extract_contexts('something to do @work')).to eq(['@work'])
|
17
|
+
end
|
18
|
+
|
19
|
+
specify 'task with multiple contexts' do
|
20
|
+
expect(extract_contexts('something to do @work @play')).to eq(['@work', '@play'])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#get_project_tags' do
|
25
|
+
specify 'empty task' do
|
26
|
+
expect(extract_projects('')).to eq([])
|
27
|
+
end
|
28
|
+
|
29
|
+
specify 'task without project' do
|
30
|
+
expect(extract_projects('something to do')).to eq([])
|
31
|
+
end
|
32
|
+
|
33
|
+
specify 'task with single project' do
|
34
|
+
expect(extract_projects('something to do +report')).to eq(['+report'])
|
35
|
+
end
|
36
|
+
|
37
|
+
specify 'task with multiple projects' do
|
38
|
+
expect(extract_projects('something to do +report +analysis')).to eq(['+report', '+analysis'])
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#orig_priority' do
|
43
|
+
specify 'empty task' do
|
44
|
+
expect(orig_priority('')).to be nil
|
45
|
+
end
|
46
|
+
|
47
|
+
specify 'task without priority' do
|
48
|
+
expect(orig_priority('something to do')).to be nil
|
49
|
+
end
|
50
|
+
|
51
|
+
specify 'task with priority A' do
|
52
|
+
expect(orig_priority('(A) something to do')).to eq('A')
|
53
|
+
end
|
54
|
+
|
55
|
+
specify 'task with priority B' do
|
56
|
+
expect(orig_priority('(B) something to do')).to eq('B')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#orig_created_on' do
|
61
|
+
specify 'empty task' do
|
62
|
+
expect(orig_created_on('')).to be nil
|
63
|
+
end
|
64
|
+
|
65
|
+
specify 'task without date' do
|
66
|
+
expect(orig_created_on('something to do')).to be nil
|
67
|
+
end
|
68
|
+
|
69
|
+
specify 'task with created date' do
|
70
|
+
expect(orig_created_on('2016-03-29 something to do')).to eq(Date.new(2016, 03, 29))
|
71
|
+
end
|
72
|
+
|
73
|
+
specify 'prioritised task with created date' do
|
74
|
+
expect(orig_created_on('(A) 2016-03-29 something to do')).to eq(Date.new(2016, 03, 29))
|
75
|
+
end
|
76
|
+
|
77
|
+
specify 'date included in task text' do
|
78
|
+
expect(orig_created_on('(A) something to do on 2016-03-29')).to be nil
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#get_completed_date' do
|
83
|
+
specify 'empty task' do
|
84
|
+
expect(get_completed_date('')).to be nil
|
85
|
+
end
|
86
|
+
|
87
|
+
specify 'uncompleted task' do
|
88
|
+
expect(get_completed_date('2016-03-29 something to do')).to be nil
|
89
|
+
end
|
90
|
+
|
91
|
+
specify 'completed task without date' do
|
92
|
+
expect(get_completed_date('2016-03-29 something to do')).to be nil
|
93
|
+
end
|
94
|
+
|
95
|
+
specify 'completed task without date' do
|
96
|
+
expect(get_completed_date('2016-03-29 something to do')).to be nil
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#get_due_on_date' do
|
101
|
+
specify 'empty task' do
|
102
|
+
expect(get_due_on_date('')).to be nil
|
103
|
+
end
|
104
|
+
|
105
|
+
specify 'task without due date' do
|
106
|
+
expect(get_due_on_date('something to do')).to be nil
|
107
|
+
end
|
108
|
+
|
109
|
+
specify 'task with due date' do
|
110
|
+
expect(get_due_on_date('something to do due:2016-03-30')).to eq(Date.new(2016, 03, 30))
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe '#get_item_text' do
|
115
|
+
specify 'empty task' do
|
116
|
+
expect(get_item_text('')).to eq('')
|
117
|
+
end
|
118
|
+
|
119
|
+
specify 'task without markup' do
|
120
|
+
expect(get_item_text('something to do')).to eq('something to do')
|
121
|
+
end
|
122
|
+
|
123
|
+
specify 'task with date, priority, projects and context' do
|
124
|
+
expect(get_item_text('(A) 2016-03-29 something to do +experiment @work')).to eq('something to do')
|
125
|
+
end
|
126
|
+
|
127
|
+
specify 'completed task with projects and context' do
|
128
|
+
expect(get_item_text('x 2016-03-30 2016-03-29 something to do +experiment @work')).to eq('something to do')
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
data/spec/todo-txt/task_spec.rb
CHANGED
@@ -1,131 +1,203 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Todo::Task do
|
4
|
-
describe
|
4
|
+
describe 'Descriptions:' do
|
5
5
|
it 'should convert to a string' do
|
6
|
-
task = Todo::Task.new
|
7
|
-
expect(task.to_s).to eq(
|
6
|
+
task = Todo::Task.new '(A) 2012-12-08 My task @test +test2'
|
7
|
+
expect(task.to_s).to eq('(A) 2012-12-08 My task @test +test2')
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'should keep track of the original string after changing the task' do
|
11
|
-
task = Todo::Task.new
|
11
|
+
task = Todo::Task.new '(A) 2012-12-08 My task @test +test2'
|
12
12
|
Timecop.freeze(2013, 12, 8) do
|
13
13
|
task.do!
|
14
|
-
expect(task.orig).to eq(
|
14
|
+
expect(task.orig).to eq('(A) 2012-12-08 My task @test +test2')
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'should be modifiable' do
|
19
|
-
task = Todo::Task.new
|
19
|
+
task = Todo::Task.new '2012-12-08 My task @test +test2'
|
20
20
|
task.projects.clear
|
21
|
-
task.contexts << [
|
21
|
+
task.contexts << ['@test3']
|
22
22
|
Timecop.freeze(2013, 12, 8) do
|
23
23
|
task.do!
|
24
|
-
expect(task.to_s).to eq(
|
24
|
+
expect(task.to_s).to eq('x 2013-12-08 2012-12-08 My task @test @test3')
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'should be able to get just the text, no due date etc.' do
|
29
|
-
task = Todo::Task.new
|
30
|
-
expect(task.text).to eq(
|
29
|
+
task = Todo::Task.new 'x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-01-01 +project'
|
30
|
+
expect(task.text).to eq('This is a sweet task.')
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'should retain the original task creation string' do
|
34
|
-
task = Todo::Task.new
|
35
|
-
expect(task.orig).to eq(
|
34
|
+
task = Todo::Task.new '(A) This is an awesome task, yo. +winning'
|
35
|
+
expect(task.orig).to eq('(A) This is an awesome task, yo. +winning')
|
36
36
|
end
|
37
37
|
|
38
38
|
it 'should be able to get just the text, no contexts etc.' do
|
39
|
-
task = Todo::Task.new
|
40
|
-
expect(task.text).to eq(
|
39
|
+
task = Todo::Task.new 'x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context +project'
|
40
|
+
expect(task.text).to eq('This is a sweet task.')
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
describe
|
44
|
+
describe 'Priorities:' do
|
45
45
|
it 'should recognise priorities' do
|
46
|
-
task = Todo::Task.new
|
47
|
-
expect(task.priority).to eq(
|
46
|
+
task = Todo::Task.new '(A) Hello world!'
|
47
|
+
expect(task.priority).to eq('A')
|
48
48
|
end
|
49
49
|
|
50
50
|
it 'should only recognise priorities at the start of a task' do
|
51
|
-
task = Todo::Task.new
|
51
|
+
task = Todo::Task.new 'Hello, world! (A)'
|
52
52
|
expect(task.priority).to eq(nil)
|
53
53
|
end
|
54
54
|
|
55
55
|
it 'should recognize priorities around dates' do
|
56
|
-
task = Todo::Task.new
|
57
|
-
expect(task.priority).to eq(
|
56
|
+
task = Todo::Task.new 'x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context +project'
|
57
|
+
expect(task.priority).to eq('B')
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'should remove the priority when calling Task#do!' do
|
61
|
-
task = Todo::Task.new
|
61
|
+
task = Todo::Task.new '(A) Task'
|
62
62
|
task.do!
|
63
63
|
expect(task.priority).to be_nil
|
64
64
|
end
|
65
65
|
|
66
66
|
it 'should reset to the original priority when calling Task#undo!' do
|
67
|
-
task = Todo::Task.new
|
67
|
+
task = Todo::Task.new '(A) Task'
|
68
68
|
task.do!
|
69
69
|
task.undo!
|
70
|
-
expect(task.priority).to eq(
|
70
|
+
expect(task.priority).to eq('A')
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
describe
|
74
|
+
describe 'Step priority:' do
|
75
|
+
context 'Increment' do
|
76
|
+
it 'increments the priority by one' do
|
77
|
+
task = Todo::Task.new '(B) Task'
|
78
|
+
task.priority_inc!
|
79
|
+
expect(task.priority).to eq('A')
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns the new priority' do
|
83
|
+
task = Todo::Task.new '(B) Task'
|
84
|
+
expect(task.priority_inc!).to eq('A')
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'does not increment priority beyond A' do
|
88
|
+
task = Todo::Task.new '(A) Task'
|
89
|
+
task.priority_inc!
|
90
|
+
expect(task.priority).to eq('A')
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'returns A if the priority did not change' do
|
94
|
+
task = Todo::Task.new '(A) Task'
|
95
|
+
expect(task.priority_inc!).to eq('A')
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'sets a priority if previous priority was nil' do
|
99
|
+
task = Todo::Task.new 'Task'
|
100
|
+
task.priority_inc!
|
101
|
+
expect(task.priority).to eq('A')
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'returns A if the previous priority was nil' do
|
105
|
+
task = Todo::Task.new 'Task'
|
106
|
+
expect(task.priority_inc!).to eq('A')
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'Decrement' do
|
111
|
+
it 'lowers the priority by one' do
|
112
|
+
task = Todo::Task.new '(A) Task'
|
113
|
+
task.priority_dec!
|
114
|
+
expect(task.priority).to eq('B')
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'returns the new priority' do
|
118
|
+
task = Todo::Task.new '(A) Task'
|
119
|
+
expect(task.priority_dec!).to eq('B')
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'does not go below Z' do
|
123
|
+
task = Todo::Task.new '(Z) Task'
|
124
|
+
task.priority_dec!
|
125
|
+
expect(task.priority).to eq('Z')
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'returns Z if priority did not change' do
|
129
|
+
task = Todo::Task.new '(Z) Task'
|
130
|
+
expect(task.priority_dec!).to eq('Z')
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'does not set a priority if priority was nil' do
|
134
|
+
task = Todo::Task.new 'Task'
|
135
|
+
task.priority_dec!
|
136
|
+
expect(task.priority).to eq(nil)
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'returns nil if priority was nil' do
|
140
|
+
task = Todo::Task.new 'Task'
|
141
|
+
expect(task.priority_dec!).to eq(nil)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe 'Completion:' do
|
75
147
|
it 'should be not done with missing date' do
|
76
|
-
task = Todo::Task.new
|
148
|
+
task = Todo::Task.new 'x This is not done'
|
77
149
|
expect(task.done?).to be false
|
78
150
|
end
|
79
151
|
|
80
152
|
it 'should be not done with malformed date' do
|
81
|
-
task = Todo::Task.new
|
153
|
+
task = Todo::Task.new 'x 01-01-2013 This is not done'
|
82
154
|
expect(task.done?).to be false
|
83
155
|
expect(task.completed_on).to be nil
|
84
156
|
end
|
85
157
|
|
86
158
|
it 'should be not done with an invalid date' do
|
87
|
-
task = Todo::Task.new
|
159
|
+
task = Todo::Task.new 'x 2013-02-31 This is not done'
|
88
160
|
expect(task.done?).to be false
|
89
161
|
expect(task.completed_on).to be nil
|
90
162
|
end
|
91
163
|
|
92
164
|
it 'should be done on 2013-04-22' do
|
93
|
-
task = Todo::Task.new
|
165
|
+
task = Todo::Task.new 'x 2013-04-22 This is really done'
|
94
166
|
expect(task.done?).to be true
|
95
167
|
expect(task.completed_on).to eq(Date.parse('22th April 2013'))
|
96
168
|
end
|
97
169
|
|
98
170
|
it 'should be able to recognise completed tasks' do
|
99
|
-
task = Todo::Task.new
|
171
|
+
task = Todo::Task.new 'x 2012-12-08 This is done!'
|
100
172
|
expect(task.done?).to be true
|
101
173
|
end
|
102
174
|
|
103
175
|
it 'should not recognize incomplete tasks as done' do
|
104
|
-
task = Todo::Task.new
|
176
|
+
task = Todo::Task.new '2012-12-08 This is not done!'
|
105
177
|
expect(task.done?).to be false
|
106
178
|
end
|
107
179
|
|
108
180
|
it 'should be completable' do
|
109
|
-
task = Todo::Task.new
|
181
|
+
task = Todo::Task.new '2012-12-08 This is not done!'
|
110
182
|
task.do!
|
111
183
|
expect(task.done?).to be true
|
112
184
|
end
|
113
185
|
|
114
186
|
it 'should be marked as incomplete' do
|
115
|
-
task = Todo::Task.new
|
187
|
+
task = Todo::Task.new 'x 2012-12-08 This is done!'
|
116
188
|
task.undo!
|
117
189
|
expect(task.done?).to be false
|
118
190
|
end
|
119
191
|
|
120
192
|
it 'should be marked as incomplete without any date' do
|
121
|
-
task = Todo::Task.new
|
193
|
+
task = Todo::Task.new 'x 2012-12-08 This is done!'
|
122
194
|
task.undo!
|
123
195
|
expect(task.completed_on).to be_nil
|
124
196
|
expect(task.created_on).to be_nil
|
125
197
|
end
|
126
198
|
|
127
199
|
it 'should be toggable' do
|
128
|
-
task = Todo::Task.new
|
200
|
+
task = Todo::Task.new '2012-12-08 This is not done!'
|
129
201
|
task.toggle!
|
130
202
|
expect(task.done?).to be true
|
131
203
|
task.toggle!
|
@@ -133,93 +205,93 @@ describe Todo::Task do
|
|
133
205
|
end
|
134
206
|
end
|
135
207
|
|
136
|
-
describe
|
208
|
+
describe 'Contexts:' do
|
137
209
|
it 'should recognise contexts' do
|
138
|
-
task = Todo::Task.new
|
139
|
-
expect(task.contexts).to eq([
|
210
|
+
task = Todo::Task.new 'Hello, world! @test'
|
211
|
+
expect(task.contexts).to eq(['@test'])
|
140
212
|
end
|
141
213
|
|
142
214
|
it 'should recognise multiple contexts' do
|
143
|
-
task = Todo::Task.new
|
144
|
-
expect(task.contexts).to eq([
|
215
|
+
task = Todo::Task.new 'Hello, world! @test @test2'
|
216
|
+
expect(task.contexts).to eq(['@test', '@test2'])
|
145
217
|
end
|
146
218
|
|
147
219
|
it 'should recognise contexts with dashes and underscores' do
|
148
|
-
task = Todo::Task.new
|
149
|
-
expect(task.contexts).to eq([
|
220
|
+
task = Todo::Task.new 'Hello, world! @test-me @test2_me'
|
221
|
+
expect(task.contexts).to eq(['@test-me', '@test2_me'])
|
150
222
|
end
|
151
223
|
end
|
152
224
|
|
153
|
-
describe
|
225
|
+
describe 'Projects:' do
|
154
226
|
it 'should recognise projects' do
|
155
|
-
task = Todo::Task.new
|
156
|
-
expect(task.projects).to eq([
|
227
|
+
task = Todo::Task.new 'Hello, world! +test'
|
228
|
+
expect(task.projects).to eq(['+test'])
|
157
229
|
end
|
158
230
|
|
159
231
|
it 'should recognise multiple projects' do
|
160
|
-
task = Todo::Task.new
|
161
|
-
expect(task.projects).to eq([
|
232
|
+
task = Todo::Task.new 'Hello, world! +test +test2'
|
233
|
+
expect(task.projects).to eq(['+test', '+test2'])
|
162
234
|
end
|
163
235
|
|
164
236
|
it 'should recognise projects with dashes and underscores' do
|
165
|
-
task = Todo::Task.new
|
166
|
-
expect(task.projects).to eq([
|
237
|
+
task = Todo::Task.new 'Hello, world! +test-me +test2_me'
|
238
|
+
expect(task.projects).to eq(['+test-me', '+test2_me'])
|
167
239
|
end
|
168
240
|
end
|
169
241
|
|
170
|
-
describe
|
242
|
+
describe 'Creation dates:' do
|
171
243
|
it 'should be able to recognise creation dates' do
|
172
|
-
task = Todo::Task.new
|
173
|
-
expect(task.created_on).to eq(Date.parse(
|
244
|
+
task = Todo::Task.new '(C) 2012-03-04 This has a date!'
|
245
|
+
expect(task.created_on).to eq(Date.parse('4th March 2012'))
|
174
246
|
end
|
175
247
|
|
176
248
|
it 'should be able to recognise creation dates without priority' do
|
177
|
-
task = Todo::Task.new
|
178
|
-
expect(task.created_on).to eq(Date.parse(
|
249
|
+
task = Todo::Task.new '2012-03-04 This has a date!'
|
250
|
+
expect(task.created_on).to eq(Date.parse('4th March 2012'))
|
179
251
|
end
|
180
252
|
|
181
253
|
it 'should return nil if no creation date is present' do
|
182
|
-
task = Todo::Task.new
|
254
|
+
task = Todo::Task.new 'No date!'
|
183
255
|
expect(task.created_on).to be_nil
|
184
256
|
end
|
185
257
|
|
186
258
|
it 'should not recognise malformed dates' do
|
187
|
-
task = Todo::Task.new
|
259
|
+
task = Todo::Task.new '03-04-2012 This has a malformed date!'
|
188
260
|
expect(task.created_on).to be_nil
|
189
261
|
end
|
190
262
|
|
191
263
|
it 'should be able to tell if the task is overdue' do
|
192
|
-
task = Todo::Task.new((Date.today - 1).to_s +
|
264
|
+
task = Todo::Task.new((Date.today - 1).to_s + ' This task is overdue!')
|
193
265
|
expect(task.overdue?).to be false
|
194
266
|
end
|
195
267
|
|
196
268
|
it 'should return false on overdue? if there is no creation date' do
|
197
|
-
task = Todo::Task.new
|
269
|
+
task = Todo::Task.new 'No date!'
|
198
270
|
expect(task.overdue?).to be false
|
199
271
|
end
|
200
272
|
|
201
273
|
it 'should return nil on ridiculous date data' do
|
202
|
-
task = Todo::Task.new
|
274
|
+
task = Todo::Task.new '2012-56-99 This has a malformed date!'
|
203
275
|
expect(task.created_on).to be_nil
|
204
276
|
end
|
205
277
|
end
|
206
278
|
|
207
|
-
describe
|
279
|
+
describe 'Completion dates:' do
|
208
280
|
it 'should be able to recognise completion dates' do
|
209
|
-
task = Todo::Task.new
|
210
|
-
expect(task.completed_on).to eq(Date.parse(
|
281
|
+
task = Todo::Task.new 'x 2012-12-08 This is done!'
|
282
|
+
expect(task.completed_on).to eq(Date.parse('8th December 2012'))
|
211
283
|
end
|
212
284
|
|
213
285
|
it 'should set the current completion dates when calling Task#do!' do
|
214
|
-
task = Todo::Task.new
|
286
|
+
task = Todo::Task.new '2012-12-08 Task'
|
215
287
|
Timecop.freeze(2013, 12, 8) do
|
216
288
|
task.do!
|
217
|
-
expect(task.completed_on).to eq(Date.parse(
|
289
|
+
expect(task.completed_on).to eq(Date.parse('8th December 2013'))
|
218
290
|
end
|
219
291
|
end
|
220
292
|
end
|
221
293
|
|
222
|
-
describe
|
294
|
+
describe 'Due dates:' do
|
223
295
|
it 'should have a due date' do
|
224
296
|
task = Todo::Task.new '(A) this task has due date due:2013-12-22'
|
225
297
|
expect(task.due_on).not_to be_nil
|
@@ -245,17 +317,17 @@ describe Todo::Task do
|
|
245
317
|
end
|
246
318
|
|
247
319
|
it 'should convert to a string with due date' do
|
248
|
-
task = Todo::Task.new
|
249
|
-
expect(task.to_s).to eq(
|
320
|
+
task = Todo::Task.new 'x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-01-01 +project'
|
321
|
+
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')
|
250
322
|
end
|
251
323
|
|
252
324
|
it 'should have no due date with malformed date' do
|
253
|
-
task = Todo::Task.new
|
325
|
+
task = Todo::Task.new 'x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:01-01-2012 +project'
|
254
326
|
expect(task.due_on).to be_nil
|
255
327
|
end
|
256
328
|
|
257
329
|
it 'should have no due date with invalid date' do
|
258
|
-
task = Todo::Task.new
|
330
|
+
task = Todo::Task.new 'x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-02-31 +project'
|
259
331
|
expect(task.due_on).to be_nil
|
260
332
|
end
|
261
333
|
|
@@ -265,56 +337,56 @@ describe Todo::Task do
|
|
265
337
|
end
|
266
338
|
|
267
339
|
it 'should reset to the original due date when calling Task#undo!' do
|
268
|
-
task = Todo::Task.new
|
340
|
+
task = Todo::Task.new '2012-12-08 Task'
|
269
341
|
Timecop.freeze(2013, 12, 8) do
|
270
342
|
task.do!
|
271
343
|
task.undo!
|
272
|
-
expect(task.created_on).to eq(Date.parse(
|
344
|
+
expect(task.created_on).to eq(Date.parse('8th December 2012'))
|
273
345
|
end
|
274
346
|
end
|
275
347
|
|
276
348
|
it 'should manage dates when calling Task#toggle!' do
|
277
|
-
task = Todo::Task.new
|
349
|
+
task = Todo::Task.new '2012-12-08 This is not done!'
|
278
350
|
Timecop.freeze(2013, 12, 8) do
|
279
351
|
task.toggle!
|
280
|
-
expect(task.completed_on).to eq(Date.parse(
|
281
|
-
expect(task.created_on).to eq(Date.parse(
|
352
|
+
expect(task.completed_on).to eq(Date.parse('8th December 2013'))
|
353
|
+
expect(task.created_on).to eq(Date.parse('8th December 2012'))
|
282
354
|
task.toggle!
|
283
|
-
expect(task.created_on).to eq(Date.parse(
|
355
|
+
expect(task.created_on).to eq(Date.parse('8th December 2012'))
|
284
356
|
expect(task.completed_on).to be_nil
|
285
357
|
end
|
286
358
|
end
|
287
359
|
end
|
288
360
|
|
289
|
-
describe
|
361
|
+
describe 'Comparisons:' do
|
290
362
|
it 'should be comparable' do
|
291
|
-
task1 = Todo::Task.new
|
292
|
-
task2 = Todo::Task.new
|
363
|
+
task1 = Todo::Task.new '(A) Top priority!'
|
364
|
+
task2 = Todo::Task.new '(B) Not quite so high.'
|
293
365
|
|
294
366
|
assertion = task1 > task2
|
295
367
|
expect(assertion).to eq(true)
|
296
368
|
end
|
297
369
|
|
298
370
|
it 'should be comparable to task without priority' do
|
299
|
-
task1 = Todo::Task.new
|
300
|
-
task2 = Todo::Task.new
|
371
|
+
task1 = Todo::Task.new 'Top priority!'
|
372
|
+
task2 = Todo::Task.new '(B) Not quite so high.'
|
301
373
|
|
302
374
|
assertion = task1 < task2
|
303
375
|
expect(assertion).to eq(true)
|
304
376
|
end
|
305
377
|
|
306
378
|
it 'should be able to compare two tasks without priority' do
|
307
|
-
task1 = Todo::Task.new
|
308
|
-
task2 = Todo::Task.new
|
379
|
+
task1 = Todo::Task.new 'Top priority!'
|
380
|
+
task2 = Todo::Task.new 'Not quite so high.'
|
309
381
|
|
310
382
|
assertion = task1 == task2
|
311
383
|
expect(assertion).to eq(true)
|
312
384
|
end
|
313
385
|
end
|
314
386
|
|
315
|
-
describe
|
387
|
+
describe 'Logging:' do
|
316
388
|
it 'should have a logger' do
|
317
|
-
task = Todo::Task.new
|
389
|
+
task = Todo::Task.new 'x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-02-31 +project'
|
318
390
|
expect(task.logger).not_to be nil
|
319
391
|
end
|
320
392
|
|
@@ -322,7 +394,7 @@ describe Todo::Task do
|
|
322
394
|
logger = double(Logger)
|
323
395
|
Todo::Logger.logger = logger
|
324
396
|
|
325
|
-
task = Todo::Task.new
|
397
|
+
task = Todo::Task.new 'x 2012-09-11 (B) 2012-03-04 This is a sweet task. @context due:2012-02-31 +project'
|
326
398
|
error_message = 'Task#date is deprecated, use created_on instead.'
|
327
399
|
|
328
400
|
expect(logger).to receive(:warn).with(error_message)
|
data/todo-txt.gemspec
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{todo-txt}
|
3
|
-
s.version =
|
3
|
+
s.version = '0.7'
|
4
4
|
s.authors = ["Sam Rose"]
|
5
5
|
s.email = %q{samwho@lbak.co.uk}
|
6
6
|
s.summary = %q{A client library for parsing todo.txt files.}
|
7
7
|
s.homepage = %q{http://github.com/samwho/todo-txt-gem}
|
8
8
|
s.description = %q{Allows for simple parsing of todo.txt files, as per Gina Trapani's todo.txt project.}
|
9
|
-
s.required_ruby_version = '>=
|
9
|
+
s.required_ruby_version = '>= 2.0'
|
10
10
|
s.license = 'GPL-2'
|
11
11
|
|
12
12
|
# Add all files to the files parameter.
|
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.7'
|
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-04-04 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.
|
@@ -32,6 +32,7 @@ files:
|
|
32
32
|
- spec/data/todo.txt
|
33
33
|
- spec/spec_helper.rb
|
34
34
|
- spec/todo-txt/list_spec.rb
|
35
|
+
- spec/todo-txt/syntax_spec.rb
|
35
36
|
- spec/todo-txt/task_spec.rb
|
36
37
|
- todo-txt.gemspec
|
37
38
|
homepage: http://github.com/samwho/todo-txt-gem
|
@@ -46,7 +47,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
46
47
|
requirements:
|
47
48
|
- - ">="
|
48
49
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
50
|
+
version: '2.0'
|
50
51
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
53
|
- - ">="
|