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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48f7926e53c17c01d34979e6e179e7de9f9c3f75e4b525ad198c12c774d2187e
4
- data.tar.gz: faba1965ff8947718c5118a30d4271a1ca8445ff43722f3fe0cfc77b0eb25e38
3
+ metadata.gz: '096eda83e243c4db30bcb92480b82f9be93dd9155b5fdb70058c4e364fe35c22'
4
+ data.tar.gz: e2886085e543f652cf99c8f0784d2726a470e41f26434171afa3da3e43d84118
5
5
  SHA512:
6
- metadata.gz: 396211f82f8e9636af8c46ee4049a7a5fae6278df3bd95f41bfb7350ca5cfe12fcc45544dac8800a4a2d7a2a8fd811a787657dad1d9c311c8fa1cdc989ba6d5a
7
- data.tar.gz: 81fa41307abbb32f576411fa147cbbf845eb341e086ab8697b2c715e4dd756b40709e84f471881ef0e192f77fce8f80beecc56586d3abad395a979de9078f2b7
6
+ metadata.gz: 6a119915c86c1124bc61aecb09bad54c3ec274feea2f4f627aadf24a090baae996a200361c4c5bfa52d9b8a65d822ca14b87b36fff4c486a9ee2f3763fc416a3
7
+ data.tar.gz: 3596da35a48094243a44794df858acb0718141b40555c56889b6adf4ad16c47287633e1e5cbcd293385424e13aafc21ef640c6475933551370c9e6142facaee3
data/Gemfile.lock CHANGED
@@ -12,7 +12,7 @@ GIT
12
12
  PATH
13
13
  remote: .
14
14
  specs:
15
- checkoff (0.56.0)
15
+ checkoff (0.57.0)
16
16
  activesupport
17
17
  asana (> 0.10.0)
18
18
  cache_method
@@ -37,7 +37,7 @@ module Checkoff
37
37
  #
38
38
  # @sg-ignore
39
39
  # @return [Date, nil]
40
- def pull_date_field_by_name_or_raise(task, field_name)
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 FieldLessThanNDaysAgoFunctionEvaluator < FunctionEvaluator
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 = pull_date_field_by_name_or_raise(task, field_name)
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 FieldGreaterThanOrEqualToNDaysFromTodayFunctionEvaluator < FunctionEvaluator
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 = pull_date_field_by_name_or_raise(task, field_name)
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::FieldLessThanNDaysAgoFunctionEvaluator,
620
- Checkoff::TaskSelectorClasses::FieldGreaterThanOrEqualToNDaysFromTodayFunctionEvaluator,
693
+ Checkoff::TaskSelectorClasses::FieldLessThanNDaysAgoPFunctionEvaluator,
694
+ Checkoff::TaskSelectorClasses::FieldGreaterThanOrEqualToNDaysFromTodayPFunctionEvaluator,
621
695
  Checkoff::TaskSelectorClasses::CustomFieldLessThanNDaysFromNowFunctionEvaluator,
622
696
  Checkoff::TaskSelectorClasses::CustomFieldGreaterThanOrEqualToNDaysFromNowFunctionEvaluator,
623
697
  Checkoff::TaskSelectorClasses::LastStoryCreatedLessThanNDaysAgoFunctionEvaluator,
@@ -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
@@ -3,5 +3,5 @@
3
3
  # Command-line and gem client for Asana (unofficial)
4
4
  module Checkoff
5
5
  # Version of library
6
- VERSION = '0.56.0'
6
+ VERSION = '0.57.0'
7
7
  end
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.56.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-17 00:00:00.000000000 Z
11
+ date: 2023-09-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport