checkoff 0.56.0 → 0.57.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
  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