rtasklib 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6dd45dd292c87269556e732b902f18cf38a098eb
4
- data.tar.gz: a8adeee47b89eb6cadc2a5cf79e4825711f4e181
3
+ metadata.gz: 9c5a99ddcc9e77d7834e92188d32d30b3ee4cd9a
4
+ data.tar.gz: 45ca4b324093c94949cebfe0d73dbe50ff11e1ad
5
5
  SHA512:
6
- metadata.gz: f2ad056508be0fabd7365c5431abe144220283ea6ba7beb77718d807f1549307876f1cde5708342339a50b3c4e6fa9b0ce4d9781b52c670020d55397850d5678
7
- data.tar.gz: 8afd466375b305d8ed56fe5e98b66328391063c864db40637a02ecb9f65b58bfc4b6f49542977a739a7f44ccd394744deb9e0d5a7fe7bd2e3ff7b028eb2459c1
6
+ metadata.gz: b535c4f6d7d4a6af2cfab8d2b0daace0db2d447cb50ada8d5e4746f7a36bf26e8e284b916b100e4829ae1da0ee68ad3cb29803409cb8f8d0d22e1f0b06f617fb
7
+ data.tar.gz: 6bcf89204ae9ea660e969ea5972d8690b71c0d8937df9c224297f908fbc9777dfbf7eb008f7f5d21249e002914b5621f2e2d91e57ef6b48a674b24e00978c5a0
data/.gitignore CHANGED
@@ -6,6 +6,6 @@
6
6
  /pkg/
7
7
  /doc/
8
8
  /spec/reports/
9
- /spec/data/
9
+ /spec/data/.task/*
10
10
  /tmp/
11
11
  *.py
data/.travis.yml CHANGED
@@ -26,7 +26,6 @@ before_install:
26
26
  - export TASKDATA=/home/travis/build/dropofwill/rtasklib/spec/data/.task
27
27
  - task _version
28
28
  - task export
29
- - task add "Test task persistence"
30
29
 
31
30
  script: 'bundle exec rake'
32
31
 
data/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  ## Description
7
7
 
8
- A Ruby wrapper around the TaskWarrior CLI, based on the Python tasklib. Requires a working TaskWarrior install.
8
+ A Ruby wrapper around the TaskWarrior command line tool.
9
9
 
10
10
 
11
11
  ## Installation
@@ -29,7 +29,7 @@ Or install it yourself as:
29
29
 
30
30
  * Taskwarrior > 2.4 (require custom UDAs, recurrences, and duration data types)
31
31
 
32
- * Ruby > 2 (currently untested on older versions)
32
+ * Ruby > 2.1 (Because default keyword arguments are too hard to live without :) )
33
33
 
34
34
  * See `./rtasklib.gemspec` for the latest Ruby dependencies
35
35
 
data/lib/rtasklib.rb CHANGED
@@ -18,6 +18,7 @@ module Rtasklib
18
18
  DEFAULTS = {
19
19
  json_array: 'true',
20
20
  verbose: 'nothing',
21
+ gc: 'off',
21
22
  confirmation: 'no',
22
23
  dependency_confirmation: 'no',
23
24
  exit_on_missing_db: 'yes', }
@@ -49,7 +50,7 @@ module Rtasklib
49
50
  version
50
51
  end
51
52
  end
52
-
53
+
53
54
  # Add a convenience alias
54
55
  TW = TaskWarrior
55
56
  end
@@ -17,11 +17,13 @@ module Rtasklib
17
17
 
18
18
  # Retrieves the current task list from the TW database
19
19
  #
20
+ # @param active [Boolean] return only pending & waiting tasks
20
21
  # @return [Array<Models::TaskModel>]
21
22
  # @api public
22
- def all
23
+ def all active: true
23
24
  all = []
24
- Execute.task_popen3(*override_a, "export") do |i, o, e, t|
25
+ f = Helpers.pending_or_waiting(active)
26
+ Execute.task_popen3(*override_a, f, "export") do |i, o, e, t|
25
27
  all = MultiJson.load(o.read).map do |x|
26
28
  Rtasklib::Models::TaskModel.new(x)
27
29
  end
@@ -43,8 +45,8 @@ module Rtasklib
43
45
  # @api public
44
46
  def some ids: nil, tags: nil, dom: nil
45
47
  some = []
46
- filter_s = Helpers.filter(ids: ids, tags: tags, dom: dom)
47
- Execute.task_popen3(*@override_a, filter_s, "export") do |i, o, e, t|
48
+ f = Helpers.filter(ids: ids, tags: tags, dom: dom)
49
+ Execute.task_popen3(*@override_a, f, "export") do |i, o, e, t|
48
50
  some = MultiJson.load(o.read).map do |x|
49
51
  Rtasklib::Models::TaskModel.new(x)
50
52
  end
@@ -52,46 +54,144 @@ module Rtasklib
52
54
  return some
53
55
  end
54
56
 
55
- #
57
+ # Add a single task to the database
56
58
  #
57
59
  # @param ids [Array<Range, Fixnum, String>, String, Range, Fixnum]
58
60
  # @param tags [Array<String>, String]
59
61
  # @param dom [Array<String>, String]
60
62
  # @api public
61
- def add! description
63
+ def count ids: nil, tags: nil, dom: nil
64
+ f = Helpers.filter(ids: ids, tags: tags, dom: dom)
65
+ Execute.task_popen3(*@override_a, f, "count") do |i, o, e, t|
66
+ return Integer(o.read)
67
+ end
62
68
  end
69
+ alias_method :size, :count
70
+ alias_method :length, :count
63
71
 
72
+ # Calls `task _show` with initial overrides returns a Taskrc object of the
73
+ # result
64
74
  #
75
+ # @return [Taskrc]
76
+ # @api public
77
+ def get_rc
78
+ res = []
79
+ Execute.task_popen3(*@override_a, "_show") do |i, o, e, t|
80
+ res = o.read.each_line.map { |l| l.chomp }
81
+ end
82
+ Taskrc.new(res, :array)
83
+ end
84
+
85
+ # Calls `task _version` and returns the result
65
86
  #
87
+ # @return [String]
88
+ # @api public
89
+ def get_version
90
+ version = nil
91
+ Execute.task_popen3("_version") do |i, o, e, t|
92
+ version = Helpers.to_gem_version(o.read.chomp)
93
+ end
94
+ version
95
+ end
96
+
97
+ # Mark the filter of tasks as started
98
+ # Returns false if filter (ids:, tags:, dom:) is blank.
99
+ #
100
+ # @api public
101
+ def start! ids: nil, tags: nil, dom: nil
102
+ f = Helpers.filter(ids: ids, tags: tags, dom: dom)
103
+ return false if f.blank?
104
+
105
+ Execute.task_popen3(*@override_a, f, "start") do |i, o, e, t|
106
+ return t.value
107
+ end
108
+ end
109
+
110
+ # Mark the filter of tasks as stopped
111
+ # Returns false if filter (ids:, tags:, dom:) is blank.
112
+ #
113
+ # @api public
114
+ def stop! ids: nil, tags: nil, dom: nil
115
+ f = Helpers.filter(ids: ids, tags: tags, dom: dom)
116
+ return false if f.blank?
117
+
118
+ Execute.task_popen3(*@override_a, f, "stop") do |i, o, e, t|
119
+ return t.value
120
+ end
121
+ end
122
+
123
+ # Add a single task to the database w/required description and optional
124
+ # tags and dom queries (e.g. project:Work)
125
+ #
126
+ # @param description [String] the required desc of the task
127
+ # @param tags [Array<String>, String]
128
+ # @param dom [Array<String>, String]
129
+ # @api public
130
+ def add! description, tags: nil, dom: nil
131
+ f = Helpers.filter(tags: tags, dom: dom)
132
+ d = Helpers.wrap_string(description)
133
+ Execute.task_popen3(*override_a, "add", d, f) do |i, o, e, t|
134
+ return t.value
135
+ end
136
+ end
137
+
138
+ # Modify a set of task the match the input filter with a single attr/value
139
+ # pair.
140
+ # Returns false if filter (ids:, tags:, dom:) is blank.
141
+ #
142
+ # @param attr [String]
143
+ # @param val [String]
66
144
  # @param ids [Array<Range, Fixnum, String>, String, Range, Fixnum]
67
145
  # @param tags [Array<String>, String]
68
146
  # @param dom [Array<String>, String]
69
147
  # @api public
70
148
  def modify! attr:, val:, ids: nil, tags: nil, dom: nil
71
- f = filter(ids, tags, dom)
149
+ f = Helpers.filter(ids: ids, tags: tags, dom: dom)
150
+ return false if f.blank?
151
+
72
152
  query = "#{f} modify #{attr} #{val}"
73
153
  Execute.task_popen3(*override_a, query) do |i, o, e, t|
74
154
  return t.value
75
155
  end
76
156
  end
77
157
 
78
- # Directly call `task undo`, which only applies to edits to the task db
79
- # not configuration changes
158
+ # Finishes the filtered tasks
159
+ # Returns false if filter (ids:, tags:, dom:) is blank.
80
160
  #
161
+ # @param ids [Array<Range, Fixnum, String>, String, Range, Fixnum]
162
+ # @param tags [Array<String>, String]
163
+ # @param dom [Array<String>, String]
81
164
  # @api public
82
- def undo!
83
- Execute.task_popen3(*override_a, "undo") do |i, o, e, t|
165
+ def done! ids: nil, tags: nil, dom: nil
166
+ f = Helpers.filter(ids: ids, tags: tags, dom: dom)
167
+ return false if f.blank?
168
+
169
+ Execute.task_popen3(*override_a, f, "done") do |i, o, e, t|
84
170
  return t.value
85
171
  end
86
172
  end
87
173
 
88
- # Update a configuration variable in the .taskrc
174
+ # Returns false if filter is blank.
89
175
  #
90
- # @param attr [String]
91
- # @param val [String]
176
+ # @param ids [Array<Range, Fixnum, String>, String, Range, Fixnum]
177
+ # @param tags [Array<String>, String]
178
+ # @param dom [Array<String>, String]
92
179
  # @api public
93
- def update_config! attr, val
94
- Execute.task_popen3(*override_a, "config #{attr} #{val}") do |i, o, e, t|
180
+ def delete! ids: nil, tags: nil, dom: nil
181
+ f = Helpers.filter(ids: ids, tags: tags, dom: dom)
182
+ return false if f.blank?
183
+
184
+ Execute.task_popen3(*override_a, f, "delete") do |i, o, e, t|
185
+ return t.value
186
+ end
187
+ end
188
+
189
+ # Directly call `task undo`, which only applies to edits to the task db
190
+ # not configuration changes
191
+ #
192
+ # @api public
193
+ def undo!
194
+ Execute.task_popen3(*override_a, "undo") do |i, o, e, t|
95
195
  return t.value
96
196
  end
97
197
  end
@@ -115,6 +215,17 @@ module Rtasklib
115
215
  return udas
116
216
  end
117
217
 
218
+ # Update a configuration variable in the .taskrc
219
+ #
220
+ # @param attr [String]
221
+ # @param val [String]
222
+ # @api public
223
+ def update_config! attr, val
224
+ Execute.task_popen3(*override_a, "config #{attr} #{val}") do |i, o, e, t|
225
+ return t.value
226
+ end
227
+ end
228
+
118
229
  # Add new found udas to our internal TaskModel
119
230
  #
120
231
  # @param uda_hash [Hash{Symbol=>Hash}]
@@ -146,7 +257,7 @@ module Rtasklib
146
257
  # @param uda_name [String] the uda name to check for
147
258
  # @return [Boolean] whether it matches or not
148
259
  # @api public
149
- def check_uda uda_name
260
+ def uda_exists? uda_name
150
261
  if get_udas.any? { |uda| uda == uda_name }
151
262
  true
152
263
  else
@@ -175,29 +286,19 @@ module Rtasklib
175
286
  update_config("uda.#{name}.urgency", urgency) unless urgency.nil?
176
287
  end
177
288
 
178
- # Calls `task _show` with initial overrides returns a Taskrc object of the
179
- # result
180
- #
181
- # @return [Taskrc]
182
- # @api public
183
- def get_rc
184
- res = []
185
- Execute.task_popen3(*@override_a, "_show") do |i, o, e, t|
186
- res = o.read.each_line.map { |l| l.chomp }
187
- end
188
- Taskrc.new(res, :array)
189
- end
190
289
 
191
- # Calls `task _version` and returns the result
290
+ # TODO: implement and test convenience methods for modifying tasks
192
291
  #
193
- # @return [String]
194
- # @api public
195
- def get_version
196
- version = nil
197
- Execute.task_popen3("_version") do |i, o, e, t|
198
- version = Helpers.to_gem_version(o.read.chomp)
199
- end
200
- version
201
- end
292
+ # def annotate
293
+ # end
294
+ #
295
+ # def denotate
296
+ # end
297
+ #
298
+ # def append
299
+ # end
300
+ #
301
+ # def prepend
302
+ # end
202
303
  end
203
304
  end
@@ -7,10 +7,16 @@ module Rtasklib
7
7
  # so that the methods are available within the modules lookup path
8
8
  extend self
9
9
 
10
- @@exp_regex = {
11
- create_rc: %r{Would \s you \s like \s a \s sample \s *.+ \s created, \s
12
- so \s taskwarrior \s can \s proceed\? \s
13
- \(yes/no\)}x }
10
+ DEBUG = false
11
+
12
+ # Turned off confirmations, so this regex is deprecated
13
+ # This also means we have to handle that all ourselves
14
+ # For example warn user with bang methods.
15
+ #
16
+ # @@exp_regex = {
17
+ # create_rc: %r{Would \s you \s like \s a \s sample \s *.+ \s created, \s
18
+ # so \s taskwarrior \s can \s proceed\? \s
19
+ # \(yes/no\)}x }
14
20
 
15
21
  # Use Open3#popen3 to execute a unix program with an array of options
16
22
  # and an optional block to handle the response.
@@ -28,10 +34,10 @@ module Rtasklib
28
34
  def popen3 program='task', *opts, &block
29
35
  execute = opts.unshift(program)
30
36
  execute = execute.join(" ")
31
- warn execute
37
+ warn execute if DEBUG
32
38
 
33
39
  Open3.popen3(execute) do |i, o, e, t|
34
- handle_response(e, t)
40
+ handle_response(o, e, t)
35
41
  yield(i, o, e, t) if block_given?
36
42
  end
37
43
  end
@@ -85,10 +91,10 @@ module Rtasklib
85
91
  # thread had a failing exit code
86
92
  #
87
93
  # @raise [RuntimeError] if failing exit code
88
- def handle_response stderr, thread
94
+ def handle_response stdout, stderr, thread
89
95
  unless thread.value.success?
90
- puts stderr.read
91
- raise thread.inspect
96
+ dump = "#{thread.value} \n Stderr: #{stderr.read} \n Stdout: #{stdout.read} \n"
97
+ raise dump
92
98
  end
93
99
  end
94
100
  end
@@ -9,6 +9,14 @@ module Rtasklib
9
9
  # make this module a stateless, singleton
10
10
  extend self
11
11
 
12
+ # Wrap a string with quotes to make it safe to pass to `task`
13
+ #
14
+ # @param string [String]
15
+ # @api public
16
+ def wrap_string string
17
+ "\"#{string.to_s}\""
18
+ end
19
+
12
20
  # Converts ids, tags, and dom queries to a single string ready to pass
13
21
  # directly to task.
14
22
  #
@@ -96,12 +104,35 @@ module Rtasklib
96
104
  return tag
97
105
  end
98
106
 
99
- # @api private
107
+ # Process string and array input of the likes of project:Work or
108
+ # description.contains:yolo
109
+ #
110
+ # @param dom [String, Array<String>, Hash]
111
+ # @api public
100
112
  def process_dom dom
113
+ case dom
114
+ when String
115
+ dom
116
+ when Array
117
+ dom.join(" ")
118
+ when Hash
119
+ process_hash_dom(dom)
120
+ end
121
+ end
122
+
123
+ # Parse the hash input to a string
124
+ #
125
+ # @param dom_hash [Hash]
126
+ # @return [String]
127
+ # @api public
128
+ def process_hash_dom dom_hash
129
+ dom_hash.reduce("") { |dom, (k,v)| dom += "#{k.to_s}:#{v} " }.strip
101
130
  end
102
131
 
103
132
  # Is a given taskrc attribute dealing with udas?
104
133
  #
134
+ # @param attr [String]
135
+ # @return [Boolean]
105
136
  # @api public
106
137
  def uda_attr? attr
107
138
  attr.to_s.start_with? "uda"
@@ -109,6 +140,9 @@ module Rtasklib
109
140
 
110
141
  # Returns part of attribute at a given depth
111
142
  #
143
+ # @param attr [String]
144
+ # @param depth [Integer]
145
+ # @return [Boolean]
112
146
  # @api public
113
147
  def arbitrary_attr attr, depth: 1
114
148
  attr.to_s.split("_")[depth]
@@ -116,6 +150,9 @@ module Rtasklib
116
150
 
117
151
  # Returns all attribute string after given depth
118
152
  #
153
+ # @param attr [String]
154
+ # @param depth [Integer]
155
+ # @return [Boolean]
119
156
  # @api public
120
157
  def deep_attr attr, depth: 2
121
158
  attr.to_s.split("_")[depth..-1].join("_")
@@ -131,6 +168,19 @@ module Rtasklib
131
168
  Gem::Version.new std_ver
132
169
  end
133
170
 
171
+ # Returns a "+PENDING or +WAITING" tag string if true, else ""
172
+ #
173
+ # @param use [Boolean]
174
+ # @return [String]
175
+ # @api public
176
+ def pending_or_waiting use=true
177
+ if use
178
+ "+PENDING or +WAITING"
179
+ else
180
+ ""
181
+ end
182
+ end
183
+
134
184
  # Determine the type that a value should be coerced to
135
185
  # Int needs to precede float because ints are also floats
136
186
  # Doesn't detect arrays, b/c task stores these as comma separated strings
@@ -55,6 +55,7 @@ module Rtasklib::Models
55
55
  # But on creation these should be set by `task`
56
56
  attribute :status, String
57
57
  attribute :uuid, String
58
+ attribute :id, Fixnum
58
59
  attribute :entry, DateTime
59
60
 
60
61
  # Optional for every task
@@ -1,3 +1,3 @@
1
1
  module Rtasklib
2
- VERSION = "0.1.5"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -18,9 +18,10 @@ describe Rtasklib::Controller do
18
18
  shared_examples_for 'export all' do
19
19
  it_behaves_like 'export'
20
20
 
21
- it 'should load in the correct number of task models' do
22
- expect(subject.size).to eq(4)
23
- end
21
+ # Number changes to often
22
+ # it 'should load in the correct number of task models' do
23
+ # expect(subject.size).to eq(4)
24
+ # end
24
25
  end
25
26
 
26
27
  describe 'Rtasklib::Controller#all' do
@@ -45,20 +46,91 @@ describe Rtasklib::Controller do
45
46
  end
46
47
  end
47
48
 
48
- describe 'Rtasklib::Controller#check_uda' do
49
- it 'should return true if a uda is found that matches the input' do
49
+ describe 'Rtasklib::Controller#uda_exists?' do
50
+ subject { Rtasklib::TaskWarrior.new("spec/data/.task").uda_exists?("client")}
51
+
52
+ it 'should return false if a uda is not found that matches the input' do
53
+ expect(subject).to eq(false)
50
54
  end
51
55
  end
52
56
 
53
- describe 'Rtasklib::Controller#all' do
57
+ describe 'Rtasklib::Controller#count' do
58
+
59
+ describe '#count should count existing tasks' do
60
+
61
+ subject { Rtasklib::TaskWarrior.new("spec/data/.task").count ids:[1,2] }
62
+
63
+ it 'should return an integer' do
64
+ expect(subject.is_a? Integer).to eq(true)
65
+ end
66
+
67
+ it 'should return 2 for ids 1,2' do
68
+ expect(subject).to eq(2)
69
+ end
70
+ end
71
+
72
+ describe '#count should return 0 for non existing tasks' do
73
+
74
+ subject { Rtasklib::TaskWarrior.new("spec/data/.task").count ids:1000 }
75
+
76
+ it 'should return 0 for ids 1000' do
77
+ expect(subject).to eq(0)
78
+ end
79
+ end
54
80
  end
55
81
 
56
82
  describe 'Rtasklib::Controller#add!' do
83
+ before(:context) do
84
+ @tw = Rtasklib::TaskWarrior.new("spec/data/.task")
85
+ @pre_count = @tw.all.count
86
+ @count_of_undos = 0
87
+ @tw.add!("Test adding methods")
88
+ end
89
+
90
+ it 'should add another task' do
91
+ expect(@tw.all.count).to eq(@pre_count + 1)
92
+ end
93
+
94
+ after(:context) do
95
+ @tw.undo!
96
+ end
57
97
  end
58
98
 
59
99
  describe 'Rtasklib::Controller#modify!' do
100
+ before(:context) do
101
+ @tw = Rtasklib::TaskWarrior.new("spec/data/.task")
102
+ @pre_task = @tw.some(ids: 1).first
103
+ @tw.modify!(attr: "description", val: "Modified description", ids: 1)
104
+ @after_task = @tw.some(ids: 1).first
105
+ @tw.undo!
106
+ end
107
+
108
+ it 'should have a different description after modification' do
109
+ expect(@pre_task.description).not_to eq(@after_task.description)
110
+ end
111
+
112
+ it 'should have the same description after undo' do
113
+ expect(@pre_task.description).to eq(@tw.some(ids: 1).first.description)
114
+ end
60
115
  end
61
116
 
62
117
  describe 'Rtasklib::Controller#undo!' do
118
+ describe '#undo! should fix changes from add!' do
119
+ before(:context) do
120
+ @tw = Rtasklib::TaskWarrior.new("spec/data/.task")
121
+ @pre_count = @tw.all.count
122
+ @tw.add!("#undo! test")
123
+ @after_count = @tw.all.count
124
+ @tw.undo!
125
+ end
126
+
127
+ it 'should have the same count as before the "undo! test" task was created' do
128
+ expect(@tw.all.count).to eq(@pre_count)
129
+ expect(@tw.all.count).not_to eq(@after_count)
130
+ end
131
+ end
132
+
133
+ describe '#undo! should fix changes from modify!' do
134
+ end
63
135
  end
64
136
  end
data/spec/data/.taskrc ADDED
@@ -0,0 +1,231 @@
1
+ data.location=.task
2
+
3
+ forcecolor=no
4
+ abbreviation.minimum=2
5
+ active.indicator=*
6
+ alias.burndown=burndown.weekly
7
+ alias.ghistory=ghistory.monthly
8
+ alias.history=history.monthly
9
+ alias.rm=delete
10
+ alias.shell=exec tasksh
11
+ allow.empty.filter=yes
12
+ avoidlastcolumn=no
13
+ bulk=3
14
+ burndown.bias=0.666
15
+ calendar.details=sparse
16
+ calendar.details.report=list
17
+ calendar.holidays=none
18
+ calendar.legend=yes
19
+ calendar.offset=no
20
+ calendar.offset.value=-1
21
+ color=on
22
+ color.active=color15 on rgb035
23
+ color.alternate=on gray0
24
+ color.blocked=bold gray10 on gray4
25
+ color.blocking=bold gray18 on gray6
26
+ color.burndown.done=on rgb013
27
+ color.burndown.pending=on gray9
28
+ color.burndown.started=on gray16
29
+ color.calendar.due=color0 on gray10
30
+ color.calendar.due.today=color0 on gray15
31
+ color.calendar.holiday=color15 on rgb005
32
+ color.calendar.overdue=color0 on gray20
33
+ color.calendar.today=underline black on color15
34
+ color.calendar.weekend=on gray4
35
+ color.calendar.weeknumber=gray10
36
+ color.completed=
37
+ color.debug=rgb500
38
+ color.deleted=
39
+ color.due=color0 on rgb013
40
+ color.due.today=color0 on rgb024
41
+ color.error=rgb500
42
+ color.footnote=gray10
43
+ color.header=gray10
44
+ color.history.add=on gray9
45
+ color.history.delete=black on gray23
46
+ color.history.done=black on rgb013
47
+ color.label=
48
+ color.label.sort=
49
+ color.overdue=color0 on rgb035
50
+ color.pri.H=
51
+ color.pri.L=
52
+ color.pri.M=
53
+ color.pri.none=
54
+ color.project.none=
55
+ color.recurring=
56
+ color.scheduled=
57
+ color.summary.background=on color0
58
+ color.summary.bar=on rgb012
59
+ color.sync.added=gray10
60
+ color.sync.changed=gray15
61
+ color.sync.rejected=gray23
62
+ color.tag.next=
63
+ color.tag.none=
64
+ color.tagged=
65
+ color.undo.after=red
66
+ color.undo.before=green
67
+ color.until=
68
+ color.warning=
69
+ column.padding=1
70
+ complete.all.tags=no
71
+ confirmation=yes
72
+ dateformat=Y-M-D
73
+ dateformat.annotation=
74
+ dateformat.edit=Y-M-D H:N:S
75
+ dateformat.holiday=YMD
76
+ dateformat.info=Y-M-D H:N:S
77
+ dateformat.report=
78
+ debug=no
79
+ default.command=next
80
+ default.due=
81
+ default.priority=
82
+ default.project=
83
+ defaultheight=24
84
+ defaultwidth=80
85
+ dependency.confirmation=on
86
+ dependency.indicator=D
87
+ dependency.reminder=on
88
+ detection=on
89
+ displayweeknumber=yes
90
+ dom=on
91
+ due=7
92
+ exit.on.missing.db=no
93
+ expressions=infix
94
+ fontunderline=yes
95
+ gc=on
96
+ hooks=on
97
+ hyphenate=on
98
+ indent.annotation=2
99
+ indent.report=0
100
+ journal.info=on
101
+ journal.time=no
102
+ journal.time.start.annotation=Started task
103
+ journal.time.stop.annotation=Stopped task
104
+ json.array=off
105
+ list.all.projects=no
106
+ list.all.tags=no
107
+ locking=on
108
+ nag=You have more urgent tasks.
109
+ print.empty.columns=no
110
+ recurrence.confirmation=prompt
111
+ recurrence.indicator=R
112
+ recurrence.limit=1
113
+ regex=yes
114
+ report.active.columns=id,start,start.age,entry.age,depends.indicator,priority,project,tags,recur,wait.indicator,scheduled.age,due,until,description
115
+ report.active.description=Active tasks
116
+ report.active.filter=status:pending and +ACTIVE
117
+ report.active.labels=ID,Started,Active,Age,D,P,Project,Tags,Recur,W,Sch,Due,Until,Description
118
+ report.active.sort=project+,start+
119
+ report.all.columns=id,status.short,uuid.short,start.active,entry.age,end.age,depends.indicator,priority,project.parent,tags.count,recur.indicator,wait.age,scheduled.age,due,until.age,description
120
+ report.all.description=All tasks
121
+ report.all.labels=ID,St,UUID,A,Age,Done,D,P,Project,Tags,R,Wait,Sch,Due,Until,Description
122
+ report.all.sort=entry-
123
+ report.blocked.columns=id,depends,project,priority,due,start.active,entry.age,description
124
+ report.blocked.description=Blocked tasks
125
+ report.blocked.filter=status:pending +BLOCKED
126
+ report.blocked.labels=ID,Deps,Proj,Pri,Due,Active,Age,Description
127
+ report.blocked.sort=due+,priority-,start-,project+
128
+ report.blocking.columns=id,uuid.short,start.active,depends,project,tags,recur,wait.indicator,scheduled.age,due.age,until.age,description.count,urgency
129
+ report.blocking.description=Blocking tasks
130
+ report.blocking.filter=status:pending +BLOCKING
131
+ report.blocking.labels=ID,UUID,A,Deps,Project,Tags,R,W,Sch,Due,Until,Description,Urg
132
+ report.blocking.sort=urgency-,due+,entry+
133
+ report.completed.columns=id,uuid.short,entry,end,entry.age,depends,priority,project,tags,recur.indicator,due,description
134
+ report.completed.description=Completed tasks
135
+ report.completed.filter=status:completed
136
+ report.completed.labels=ID,UUID,Created,Completed,took,Deps,P,Project,Tags,R,Due,Description
137
+ report.completed.sort=end+
138
+ report.list.columns=id,start.age,entry.age,depends.indicator,priority,project,tags,recur.indicator,scheduled.countdown,due,until.age,description.count,urgency
139
+ report.list.description=Most details of tasks
140
+ report.list.filter=status:pending
141
+ report.list.labels=ID,Active,Age,D,P,Project,Tags,R,Sch,Due,Until,Description,Urg
142
+ report.list.sort=start-,due+,project+/,urgency-
143
+ report.long.columns=id,start.active,entry,modified.age,depends,priority,project,tags,recur,wait.age,scheduled,due,until,description
144
+ report.long.description=All details of tasks
145
+ report.long.filter=status:pending
146
+ report.long.labels=ID,A,Created,Mod,Deps,P,Project,Tags,Recur,Wait,Sched,Due,Until,Description
147
+ report.long.sort=modified-
148
+ report.ls.columns=id,start.active,depends.indicator,project,tags,recur.indicator,wait.age,scheduled.countdown,due.countdown,until.countdown,description.count
149
+ report.ls.description=Few details of tasks
150
+ report.ls.filter=status:pending
151
+ report.ls.labels=ID,A,D,Project,Tags,R,Wait,S,Due,Until,Description
152
+ report.ls.sort=start-,description+
153
+ report.minimal.columns=id,project,tags.count,description.count
154
+ report.minimal.description=Minimal details of tasks
155
+ report.minimal.filter=(status:pending or status:waiting)
156
+ report.minimal.labels=ID,Project,Tags,Description
157
+ report.minimal.sort=project+/,description+
158
+ report.newest.columns=id,start.age,entry,entry.age,modified.age,depends.indicator,priority,project,tags,recur.indicator,wait.age,scheduled.countdown,due,until.age,description
159
+ report.newest.description=Newest tasks
160
+ report.newest.filter=(status:pending or status:waiting) and recur.none:
161
+ report.newest.labels=ID,Active,Created,Age,Mod,D,P,Project,Tags,R,Wait,Sch,Due,Until,Description
162
+ report.newest.sort=entry-
163
+ report.next.columns=id,start.age,entry.age,depends,priority,project,tags,recur,scheduled.countdown,due.age,until.age,description,urgency
164
+ report.next.description=Most urgent tasks
165
+ report.next.filter=status:pending limit:page
166
+ report.next.labels=ID,Active,Age,Deps,P,Project,Tag,Recur,S,Due,Until,Description,Urg
167
+ report.next.sort=start-,urgency-
168
+ report.oldest.columns=id,start.age,entry,entry.age,modified.age,depends.indicator,priority,project,tags,recur.indicator,wait.age,scheduled.countdown,due,until.age,description
169
+ report.oldest.description=Oldest tasks
170
+ report.oldest.filter=(status:pending or status:waiting)
171
+ report.oldest.labels=ID,Active,Created,Age,Mod,D,P,Project,Tags,R,Wait,Sch,Due,Until,Description
172
+ report.oldest.sort=entry+
173
+ report.overdue.columns=id,start.age,entry.age,depends,priority,project,tags,recur.indicator,scheduled.countdown,due,until,description,urgency
174
+ report.overdue.description=Overdue tasks
175
+ report.overdue.filter=(status:pending or status:waiting) and +OVERDUE
176
+ report.overdue.labels=ID,Active,Age,Deps,P,Project,Tag,R,S,Due,Until,Description,Urg
177
+ report.overdue.sort=urgency-,due+
178
+ report.ready.columns=id,start.age,entry.age,depends.indicator,priority,project,tags,recur.indicator,scheduled.countdown,due.countdown,until.age,description,urgency
179
+ report.ready.description=Most urgent actionable tasks
180
+ report.ready.filter=+READY
181
+ report.ready.labels=ID,Active,Age,D,P,Project,Tags,R,S,Due,Until,Description,Urg
182
+ report.ready.sort=start-,urgency-
183
+ report.recurring.columns=id,start.age,entry.age,depends.indicator,priority,project,tags,recur,scheduled.countdown,due,until.age,description,urgency
184
+ report.recurring.description=Recurring Tasks
185
+ report.recurring.filter=(status:pending or status:waiting) and (+PARENT or +CHILD)
186
+ report.recurring.labels=ID,Active,Age,D,P,Project,Tags,Recur,Sch,Due,Until,Description,Urg
187
+ report.recurring.sort=due+,urgency-,entry+
188
+ report.unblocked.columns=id,depends,project,priority,due,start.active,entry.age,description
189
+ report.unblocked.description=Unblocked tasks
190
+ report.unblocked.filter=status:pending -BLOCKED
191
+ report.unblocked.labels=ID,Deps,Proj,Pri,Due,Active,Age,Description
192
+ report.unblocked.sort=due+,priority-,start-,project+
193
+ report.waiting.columns=id,start.active,entry.age,depends.indicator,priority,project,tags,recur.indicator,wait,wait.age,scheduled,due,until,description
194
+ report.waiting.description=Waiting (hidden) tasks
195
+ report.waiting.filter=+WAITING
196
+ report.waiting.labels=ID,A,Age,D,P,Project,Tags,R,Wait,for,Sched,Due,Until,Description
197
+ report.waiting.sort=due+,wait+,entry+
198
+ reserved.lines=1
199
+ row.padding=0
200
+ rule.precedence.color=deleted,completed,active,keyword.,tag.,uda.,project.,overdue,scheduled,due.today,due,blocked,blocking,recurring,tagged,pri.
201
+ search.case.sensitive=yes
202
+ shell.prompt=task>
203
+ tag.indicator=+
204
+ taskd.ca=~/.task/ca.cert.pem
205
+ taskd.certificate=~/.task/private.certificate.pem
206
+ taskd.ciphers=NORMAL
207
+ taskd.credentials=inthe_am/whp3652/76399cb0-70e4-42c0-9a2e-4095a11d52b2
208
+ taskd.key=~/.task/private.key.pem
209
+ taskd.server=taskwarrior.inthe.am:53589
210
+ taskd.trust=ignore hostname
211
+ uda.author.label=Auth
212
+ uda.author.type=string
213
+ uda.author.values=
214
+ undo.style=side
215
+ urgency.active.coefficient=4.0
216
+ urgency.age.coefficient=2.0
217
+ urgency.age.max=365
218
+ urgency.annotations.coefficient=1.0
219
+ urgency.blocked.coefficient=-5.0
220
+ urgency.blocking.coefficient=8.0
221
+ urgency.due.coefficient=12.0
222
+ urgency.inherit.coefficient=0.0
223
+ urgency.next.coefficient=15.0
224
+ urgency.priority.coefficient=6.0
225
+ urgency.project.coefficient=1.0
226
+ urgency.scheduled.coefficient=5.0
227
+ urgency.tags.coefficient=1.0
228
+ urgency.waiting.coefficient=-3.0
229
+ verbose=yes
230
+ weekstart=sunday
231
+ xterm.title=no
data/spec/helpers_spec.rb CHANGED
@@ -72,5 +72,20 @@ describe Rtasklib::Helpers do
72
72
  .to eq("1,2,4,5 +stuff -school +work")
73
73
  end
74
74
 
75
+ it 'treats dom strings properly' do
76
+ expect(Rtasklib::Helpers.filter(dom: "project:Work due:today"))
77
+ .to eq("project:Work due:today")
78
+ end
79
+
80
+ it 'treats dom arrays properly' do
81
+ expect(Rtasklib::Helpers.filter(dom: ["project:Work", "due:today priority:L"]))
82
+ .to eq("project:Work due:today priority:L")
83
+ end
84
+
85
+ it 'treats dom hashes properly' do
86
+ expect(Rtasklib::Helpers.filter(dom: {project:"Work", due:"today", priority:"L"}))
87
+ .to eq("project:Work due:today priority:L")
88
+ end
89
+
75
90
  end
76
91
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
2
  require 'coveralls'
3
+ Coveralls.wear!
3
4
  require 'rtasklib'
4
5
 
5
- Coveralls.wear!
data/spec/taskrc_spec.rb CHANGED
@@ -3,6 +3,7 @@ require 'spec_helper'
3
3
  describe Rtasklib::Taskrc do
4
4
 
5
5
  describe "initialize with a test .taskrc" do
6
+
6
7
  subject { Rtasklib::Taskrc.new("spec/data/.taskrc", :path).config }
7
8
 
8
9
  it "creates a Virtus model representation" do
@@ -10,7 +11,7 @@ describe Rtasklib::Taskrc do
10
11
  end
11
12
 
12
13
  it "attribute name dot paths are converted to underscores" do
13
- expect(subject.data_location).to eq "./.task"
14
+ expect(subject.data_location).to eq ".task"
14
15
  end
15
16
 
16
17
  it "top level configs are possible" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rtasklib
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Will Paul
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-05-16 00:00:00.000000000 Z
11
+ date: 2015-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: virtus