todo-txt 0.7 → 0.8

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dd4d9a9131316d54020bfc771727481a05a7694f
4
- data.tar.gz: 98e9a7d6a3ba5070db9521140d7d2f340a59cc27
3
+ metadata.gz: 61f9189159159b6e65f5f74b988b2e10bce9ebdd
4
+ data.tar.gz: d4b2af334263168828b8c55907bb7cbd88d5e961
5
5
  SHA512:
6
- metadata.gz: 5d7c8d30855037df15053d219e4051dbd2f93d29bca14fa2f7477b706d634a433a282f9e51d3a7239b92d63f5e47bf291463846c5f663ac19b31cff197e0772a
7
- data.tar.gz: 1cd0e7eed6b6de21fc4e6d19b8addff687f0c513c1c823441696ff8dae4c9466ac9ca3283fa53290d6e2525f518c89ace94dafef66895b3b8fe24a1db978fd89
6
+ metadata.gz: e21f06a513c28f57ee49574a9cf433d3adaf84bd6ce7de7101263ddd414919cd83b6f2d3d73c7720a85bd3c028e6b22689b7208134d5727bd1ec6d55fa204619
7
+ data.tar.gz: bec7f7985f84d4d966936f454ebb21d7c820e67488e5fe98c2eceb013a2e5454686084377e4f924a6eaac5d56c47d69a7c50451972ea5d257475a1ff1e720b7d
data/.gitignore CHANGED
@@ -2,3 +2,4 @@
2
2
  pkg/
3
3
  coverage/
4
4
  Gemfile.lock
5
+ *.gem
@@ -3,6 +3,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
3
 
4
4
  require 'logger'
5
5
  require 'todo-txt/logger'
6
+ require 'todo-txt/options'
6
7
  require 'todo-txt/syntax'
7
8
  require 'todo-txt/list'
8
9
  require 'todo-txt/task'
@@ -0,0 +1,41 @@
1
+ module Todo
2
+ class << self
3
+ attr_accessor :options_instance
4
+ end
5
+
6
+ def self.options
7
+ self.options_instance ||= Options.new
8
+ end
9
+
10
+ def self.customize
11
+ self.options_instance ||= Options.new
12
+ yield(options_instance)
13
+ end
14
+
15
+ class Options
16
+ # Require all done tasks to have a `completed_on` date. True by default.
17
+ #
18
+ # - When `true`, tasks with invalid dates are considered not done.
19
+ # - When `false`, tasks starting with `x ` are considered done.
20
+ #
21
+ # @return [Boolean]
22
+ attr_accessor :require_completed_on
23
+
24
+ # PENDING
25
+ #
26
+ # Whether or not to preserve original field order for roundtripping.
27
+ #
28
+ # @return [Boolean]
29
+ attr_accessor :maintain_field_order
30
+
31
+ def initialize
32
+ reset
33
+ end
34
+
35
+ # Reset to defaults.
36
+ def reset
37
+ @require_completed_on = true
38
+ @maintain_field_order = false
39
+ end
40
+ end
41
+ end
@@ -52,7 +52,7 @@ module Todo
52
52
  #
53
53
  # @param line [String] the todo item to be processed
54
54
  # @return [Date] the completed date of the line
55
- def get_completed_date(line)
55
+ def extract_completed_date(line)
56
56
  date = COMPLETED_ON_PATTERN.match(line)
57
57
  begin
58
58
  Date.parse(date[1]) if date
@@ -61,6 +61,20 @@ module Todo
61
61
  end
62
62
  end
63
63
 
64
+ COMPLETED_FLAG = 'x'.freeze
65
+ SINGLE_SPACE = ' '.freeze
66
+
67
+ # Checks whether the given todo item has a completion flag set.
68
+ #
69
+ # This provides support for ad-hoc handwritten lists where the completed flag
70
+ # is set but there is no completed date.
71
+ #
72
+ # @param line [String] the todo item to be processed
73
+ # @return [Boolean]
74
+ def check_completed_flag(line)
75
+ line[0] == COMPLETED_FLAG && line[1] == SINGLE_SPACE
76
+ end
77
+
64
78
  # Extracts the completion date for the given todo item.
65
79
  # Returns nil if a valid date is not found.
66
80
  #
@@ -14,11 +14,18 @@ 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(orig)
18
17
  @priority, @created_on = orig_priority(orig), orig_created_on(orig)
19
18
  @due_on = get_due_on_date(orig)
20
19
  @contexts ||= extract_contexts(orig)
21
20
  @projects ||= extract_projects(orig)
21
+
22
+ if Todo.options.require_completed_on
23
+ @completed_on = extract_completed_date(orig)
24
+ @is_completed = !@completed_on.nil?
25
+ else
26
+ @completed_on = extract_completed_date(orig)
27
+ @is_completed = check_completed_flag(orig)
28
+ end
22
29
  end
23
30
 
24
31
  # Returns the original content of the task.
@@ -148,7 +155,7 @@ module Todo
148
155
  # task.done?
149
156
  # #=> false
150
157
  def done?
151
- !@completed_on.nil?
158
+ @is_completed
152
159
  end
153
160
 
154
161
  # Completes the task on the current date.
@@ -168,6 +175,7 @@ module Todo
168
175
  # #=> # the current date
169
176
  def do!
170
177
  @completed_on = Date.today
178
+ @is_completed = true
171
179
  @priority = nil
172
180
  end
173
181
 
@@ -188,6 +196,7 @@ module Todo
188
196
  # #=> nil
189
197
  def undo!
190
198
  @completed_on = nil
199
+ @is_completed = false
191
200
  @priority = orig_priority(orig)
192
201
  end
193
202
 
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe '#require_completed_on' do
4
+ context 'set to true' do
5
+ it 'should treat tasks without the done flag as not done' do
6
+ task = Todo::Task.new('this task is treated as incomplete')
7
+ expect(task.done?).to be false
8
+ end
9
+
10
+ it 'should treat tasks with a the done flag and no date as not done' do
11
+ task = Todo::Task.new('x this task is treated as incomplete')
12
+ expect(task.done?).to be false
13
+ end
14
+
15
+ it 'should treat tasks with a the done flag and a completion date as done' do
16
+ task = Todo::Task.new('x 2016-04-08 this task is treated as complete')
17
+ expect(task.done?).to be true
18
+ end
19
+ end
20
+
21
+ context 'set to false' do
22
+ before(:all) do
23
+ Todo.customize do |options|
24
+ options.require_completed_on = false
25
+ end
26
+ end
27
+
28
+ it 'should treat tasks without the done flag as not done' do
29
+ task = Todo::Task.new('this task is treated as incomplete')
30
+ expect(task.done?).to be false
31
+ end
32
+
33
+ it 'should treat tasks with the done flag as done' do
34
+ task = Todo::Task.new('x this task is treated as complete')
35
+ expect(task.done?).to be true
36
+ end
37
+
38
+ after(:all) do
39
+ Todo.options.reset
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Todo::Options do
4
+ it 'should be available by default in the top-level module' do
5
+ expect(Todo.options).to be_a Todo::Options
6
+ end
7
+
8
+ it 'should provide require_completed_on as true by default' do
9
+ expect(Todo.options.require_completed_on).to be true
10
+ end
11
+
12
+ it 'should provide maintain_field_order as false by default' do
13
+ expect(Todo.options.maintain_field_order).to be false
14
+ end
15
+
16
+ it 'should support customization' do
17
+ Todo.customize do |options|
18
+ options.require_completed_on = false
19
+ end
20
+
21
+ expect(Todo.options.require_completed_on).to be false
22
+ end
23
+
24
+ after(:all) do
25
+ Todo.options.reset
26
+ end
27
+ end
@@ -79,21 +79,39 @@ describe Todo::Syntax do
79
79
  end
80
80
  end
81
81
 
82
- describe '#get_completed_date' do
82
+ describe '#extract_completed_date' do
83
83
  specify 'empty task' do
84
- expect(get_completed_date('')).to be nil
84
+ expect(extract_completed_date('')).to be nil
85
85
  end
86
86
 
87
87
  specify 'uncompleted task' do
88
- expect(get_completed_date('2016-03-29 something to do')).to be nil
88
+ expect(extract_completed_date('2016-03-29 something to do')).to be nil
89
89
  end
90
90
 
91
91
  specify 'completed task without date' do
92
- expect(get_completed_date('2016-03-29 something to do')).to be nil
92
+ expect(extract_completed_date('2016-03-29 something to do')).to be nil
93
93
  end
94
94
 
95
95
  specify 'completed task without date' do
96
- expect(get_completed_date('2016-03-29 something to do')).to be nil
96
+ expect(extract_completed_date('2016-03-29 something to do')).to be nil
97
+ end
98
+ end
99
+
100
+ describe '#check_completed_flag' do
101
+ specify 'empty task' do
102
+ expect(check_completed_flag('')).to be false
103
+ end
104
+
105
+ specify 'uncompleted task' do
106
+ expect(check_completed_flag('2016-03-29 something to do')).to be false
107
+ end
108
+
109
+ specify 'completed task without date' do
110
+ expect(check_completed_flag('x something to do')).to be true
111
+ end
112
+
113
+ specify 'completed task with date' do
114
+ expect(check_completed_flag('x 2016-03-29 something to do')).to be true
97
115
  end
98
116
  end
99
117
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = %q{todo-txt}
3
- s.version = '0.7'
3
+ s.version = '0.8'
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.}
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.7'
4
+ version: '0.8'
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-04-04 00:00:00.000000000 Z
11
+ date: 2016-04-08 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.
@@ -27,11 +27,14 @@ files:
27
27
  - lib/todo-txt.rb
28
28
  - lib/todo-txt/list.rb
29
29
  - lib/todo-txt/logger.rb
30
+ - lib/todo-txt/options.rb
30
31
  - lib/todo-txt/syntax.rb
31
32
  - lib/todo-txt/task.rb
32
33
  - spec/data/todo.txt
33
34
  - spec/spec_helper.rb
34
35
  - spec/todo-txt/list_spec.rb
36
+ - spec/todo-txt/options/require_completed_on_spec.rb
37
+ - spec/todo-txt/options_spec.rb
35
38
  - spec/todo-txt/syntax_spec.rb
36
39
  - spec/todo-txt/task_spec.rb
37
40
  - todo-txt.gemspec