checkoff 0.56.0 → 0.57.0
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/Gemfile.lock +1 -1
- data/lib/checkoff/internal/task_selector_evaluator.rb +83 -9
- data/lib/checkoff/tasks.rb +23 -23
- data/lib/checkoff/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '096eda83e243c4db30bcb92480b82f9be93dd9155b5fdb70058c4e364fe35c22'
|
4
|
+
data.tar.gz: e2886085e543f652cf99c8f0784d2726a470e41f26434171afa3da3e43d84118
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a119915c86c1124bc61aecb09bad54c3ec274feea2f4f627aadf24a090baae996a200361c4c5bfa52d9b8a65d822ca14b87b36fff4c486a9ee2f3763fc416a3
|
7
|
+
data.tar.gz: 3596da35a48094243a44794df858acb0718141b40555c56889b6adf4ad16c47287633e1e5cbcd293385424e13aafc21ef640c6475933551370c9e6142facaee3
|
data/Gemfile.lock
CHANGED
@@ -37,7 +37,7 @@ module Checkoff
|
|
37
37
|
#
|
38
38
|
# @sg-ignore
|
39
39
|
# @return [Date, nil]
|
40
|
-
def
|
40
|
+
def pull_date_field_by_name(task, field_name)
|
41
41
|
if field_name == :modified
|
42
42
|
return Time.parse(task.modified_at).to_date unless task.modified_at.nil?
|
43
43
|
|
@@ -55,6 +55,31 @@ module Checkoff
|
|
55
55
|
raise "Teach me how to handle field #{field_name}"
|
56
56
|
end
|
57
57
|
|
58
|
+
# @param task [Asana::Resources::Task]
|
59
|
+
# @param field_name [Symbol]
|
60
|
+
#
|
61
|
+
# @sg-ignore
|
62
|
+
# @return [Date, Time, nil]
|
63
|
+
def pull_date_or_time_field_by_name(task, field_name)
|
64
|
+
if field_name == :due
|
65
|
+
return Time.parse(task.due_at) unless task.due_at.nil?
|
66
|
+
|
67
|
+
return Date.parse(task.due_on) unless task.due_on.nil?
|
68
|
+
|
69
|
+
return nil
|
70
|
+
end
|
71
|
+
|
72
|
+
if field_name == :start
|
73
|
+
return Time.parse(task.start_at) unless task.start_at.nil?
|
74
|
+
|
75
|
+
return Date.parse(task.start_on) unless task.start_on.nil?
|
76
|
+
|
77
|
+
return nil
|
78
|
+
end
|
79
|
+
|
80
|
+
raise "Teach me how to handle field #{field_name}"
|
81
|
+
end
|
82
|
+
|
58
83
|
# @sg-ignore
|
59
84
|
# @param task [Asana::Resources::Task]
|
60
85
|
# @param custom_field_gid [String]
|
@@ -257,9 +282,10 @@ module Checkoff
|
|
257
282
|
end
|
258
283
|
|
259
284
|
# @param task [Asana::Resources::Task]
|
285
|
+
# @param ignore_dependencies [Boolean]
|
260
286
|
# @return [Boolean]
|
261
|
-
def evaluate(task)
|
262
|
-
@tasks.task_ready?(task)
|
287
|
+
def evaluate(task, ignore_dependencies: false)
|
288
|
+
@tasks.task_ready?(task, ignore_dependencies: ignore_dependencies)
|
263
289
|
end
|
264
290
|
end
|
265
291
|
|
@@ -292,6 +318,53 @@ module Checkoff
|
|
292
318
|
end
|
293
319
|
end
|
294
320
|
|
321
|
+
# :due_between_n_days function
|
322
|
+
class DueBetweenRelativePFunctionEvaluator < FunctionEvaluator
|
323
|
+
FUNCTION_NAME = :due_between_relative
|
324
|
+
|
325
|
+
def matches?
|
326
|
+
fn?(task_selector, FUNCTION_NAME)
|
327
|
+
end
|
328
|
+
|
329
|
+
# @param _index [Integer]
|
330
|
+
def evaluate_arg?(_index)
|
331
|
+
false
|
332
|
+
end
|
333
|
+
|
334
|
+
# @param task [Asana::Resources::Task]
|
335
|
+
# @param beginning_num_days_from_now [Integer]
|
336
|
+
# @param end_num_days_from_now [Integer]
|
337
|
+
# @param ignore_dependencies [Boolean]
|
338
|
+
#
|
339
|
+
# @return [Boolean]
|
340
|
+
def evaluate(task, beginning_num_days_from_now, end_num_days_from_now, ignore_dependencies: false)
|
341
|
+
beginning_n_days_from_now_time = (Time.now + (beginning_num_days_from_now * 24 * 60 * 60))
|
342
|
+
end_n_days_from_now_time = (Time.now + (end_num_days_from_now * 24 * 60 * 60))
|
343
|
+
|
344
|
+
# @type [Date, Time, nil]
|
345
|
+
task_date_or_time = pull_date_or_time_field_by_name(task, :start) ||
|
346
|
+
pull_date_or_time_field_by_name(task, :due)
|
347
|
+
|
348
|
+
return false if task_date_or_time.nil?
|
349
|
+
|
350
|
+
# if time
|
351
|
+
in_range = if task_date_or_time.is_a?(Time)
|
352
|
+
task_date_or_time > beginning_n_days_from_now_time &&
|
353
|
+
task_date_or_time <= end_n_days_from_now_time
|
354
|
+
else
|
355
|
+
# if date
|
356
|
+
task_date_or_time > beginning_n_days_from_now_time.to_date &&
|
357
|
+
task_date_or_time <= end_n_days_from_now_time.to_date
|
358
|
+
end
|
359
|
+
|
360
|
+
return false unless in_range
|
361
|
+
|
362
|
+
return false if !ignore_dependencies && @tasks.incomplete_dependencies?(task)
|
363
|
+
|
364
|
+
true
|
365
|
+
end
|
366
|
+
end
|
367
|
+
|
295
368
|
# :custom_field_value function
|
296
369
|
class CustomFieldValueFunctionEvaluator < FunctionEvaluator
|
297
370
|
FUNCTION_NAME = :custom_field_value
|
@@ -387,7 +460,7 @@ module Checkoff
|
|
387
460
|
end
|
388
461
|
|
389
462
|
# :field_less_than_n_days_ago
|
390
|
-
class
|
463
|
+
class FieldLessThanNDaysAgoPFunctionEvaluator < FunctionEvaluator
|
391
464
|
FUNCTION_NAME = :field_less_than_n_days_ago
|
392
465
|
|
393
466
|
def matches?
|
@@ -404,7 +477,7 @@ module Checkoff
|
|
404
477
|
#
|
405
478
|
# @return [Boolean]
|
406
479
|
def evaluate(task, field_name, num_days)
|
407
|
-
date =
|
480
|
+
date = pull_date_field_by_name(task, field_name)
|
408
481
|
|
409
482
|
return false if date.nil?
|
410
483
|
|
@@ -416,7 +489,7 @@ module Checkoff
|
|
416
489
|
end
|
417
490
|
|
418
491
|
# :field_greater_than_or_equal_to_n_days_from_today
|
419
|
-
class
|
492
|
+
class FieldGreaterThanOrEqualToNDaysFromTodayPFunctionEvaluator < FunctionEvaluator
|
420
493
|
FUNCTION_NAME = :field_greater_than_or_equal_to_n_days_from_today
|
421
494
|
|
422
495
|
def matches?
|
@@ -433,7 +506,7 @@ module Checkoff
|
|
433
506
|
#
|
434
507
|
# @return [Boolean]
|
435
508
|
def evaluate(task, field_name, num_days)
|
436
|
-
date =
|
509
|
+
date = pull_date_field_by_name(task, field_name)
|
437
510
|
|
438
511
|
return false if date.nil?
|
439
512
|
|
@@ -614,10 +687,11 @@ module Checkoff
|
|
614
687
|
Checkoff::TaskSelectorClasses::AndFunctionEvaluator,
|
615
688
|
Checkoff::TaskSelectorClasses::OrFunctionEvaluator,
|
616
689
|
Checkoff::TaskSelectorClasses::DuePFunctionEvaluator,
|
690
|
+
Checkoff::TaskSelectorClasses::DueBetweenRelativePFunctionEvaluator,
|
617
691
|
Checkoff::TaskSelectorClasses::UnassignedPFunctionEvaluator,
|
618
692
|
Checkoff::TaskSelectorClasses::DueDateSetPFunctionEvaluator,
|
619
|
-
Checkoff::TaskSelectorClasses::
|
620
|
-
Checkoff::TaskSelectorClasses::
|
693
|
+
Checkoff::TaskSelectorClasses::FieldLessThanNDaysAgoPFunctionEvaluator,
|
694
|
+
Checkoff::TaskSelectorClasses::FieldGreaterThanOrEqualToNDaysFromTodayPFunctionEvaluator,
|
621
695
|
Checkoff::TaskSelectorClasses::CustomFieldLessThanNDaysFromNowFunctionEvaluator,
|
622
696
|
Checkoff::TaskSelectorClasses::CustomFieldGreaterThanOrEqualToNDaysFromNowFunctionEvaluator,
|
623
697
|
Checkoff::TaskSelectorClasses::LastStoryCreatedLessThanNDaysAgoFunctionEvaluator,
|
data/lib/checkoff/tasks.rb
CHANGED
@@ -103,6 +103,29 @@ module Checkoff
|
|
103
103
|
"https://app.asana.com/0/0/#{task.gid}/f"
|
104
104
|
end
|
105
105
|
|
106
|
+
# @param task [Asana::Resources::Task]
|
107
|
+
def incomplete_dependencies?(task)
|
108
|
+
# Avoid a redundant fetch. Unfortunately, Ruby SDK allows
|
109
|
+
# dependencies to be fetched along with other attributes--but
|
110
|
+
# then doesn't use it and does another HTTP GET! At least this
|
111
|
+
# way we can skip the extra HTTP GET in the common case when
|
112
|
+
# there are no dependencies.
|
113
|
+
#
|
114
|
+
# https://github.com/Asana/ruby-asana/issues/125
|
115
|
+
|
116
|
+
# @sg-ignore
|
117
|
+
# @type [Enumerable<Asana::Resources::Task>, nil]
|
118
|
+
dependencies = task.instance_variable_get(:@dependencies)
|
119
|
+
dependencies = task.dependencies.map { |dependency| { 'gid' => dependency.gid } } if dependencies.nil?
|
120
|
+
|
121
|
+
dependencies.any? do |parent_task_info|
|
122
|
+
parent_task_gid = parent_task_info.fetch('gid')
|
123
|
+
parent_task = @asana_task.find_by_id(client, parent_task_gid,
|
124
|
+
options: { fields: ['completed'] })
|
125
|
+
!parent_task.completed
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
106
129
|
private
|
107
130
|
|
108
131
|
# @param workspace_name [String]
|
@@ -158,28 +181,5 @@ module Checkoff
|
|
158
181
|
|
159
182
|
nil
|
160
183
|
end
|
161
|
-
|
162
|
-
# @param task [Asana::Resources::Task]
|
163
|
-
def incomplete_dependencies?(task)
|
164
|
-
# Avoid a redundant fetch. Unfortunately, Ruby SDK allows
|
165
|
-
# dependencies to be fetched along with other attributes--but
|
166
|
-
# then doesn't use it and does another HTTP GET! At least this
|
167
|
-
# way we can skip the extra HTTP GET in the common case when
|
168
|
-
# there are no dependencies.
|
169
|
-
#
|
170
|
-
# https://github.com/Asana/ruby-asana/issues/125
|
171
|
-
|
172
|
-
# @sg-ignore
|
173
|
-
# @type [Enumerable<Asana::Resources::Task>, nil]
|
174
|
-
dependencies = task.instance_variable_get(:@dependencies)
|
175
|
-
dependencies = task.dependencies.map { |task| { 'gid' => task.gid } } if dependencies.nil?
|
176
|
-
|
177
|
-
dependencies.any? do |parent_task_info|
|
178
|
-
parent_task_gid = parent_task_info.fetch('gid')
|
179
|
-
parent_task = @asana_task.find_by_id(client, parent_task_gid,
|
180
|
-
options: { fields: ['completed'] })
|
181
|
-
!parent_task.completed
|
182
|
-
end
|
183
|
-
end
|
184
184
|
end
|
185
185
|
end
|
data/lib/checkoff/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: checkoff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.57.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vince Broz
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-09-
|
11
|
+
date: 2023-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|