checkoff 0.55.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: e441dfbcef11d610f73873858235bd110aa27b730a40eca5c5a38aac3e27ff5c
4
- data.tar.gz: 4810a4c39437830b9dd6a909102328d6f413600a30bf2fe92702d1a59fe4ae61
3
+ metadata.gz: '096eda83e243c4db30bcb92480b82f9be93dd9155b5fdb70058c4e364fe35c22'
4
+ data.tar.gz: e2886085e543f652cf99c8f0784d2726a470e41f26434171afa3da3e43d84118
5
5
  SHA512:
6
- metadata.gz: '08ad245068e7a1278a90943eff26e239175aa2874b9db59b682448f3069f8d3e71bddae0f21cefcddf2f315a95cfc0094800759487953fb519be6af9935886d1'
7
- data.tar.gz: 02c0f071c4d722f26014d2029e13794a26e15ab1396291177e80b8d4506e301bd33b2e3984296314e8a57bf522c589c1a9f4684810564f8f3b387b1e780bbbe3
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.55.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]
@@ -163,6 +188,26 @@ module Checkoff
163
188
  end
164
189
  end
165
190
 
191
+ # :or function
192
+ #
193
+ # Does not yet shortcut, but may in future - be careful with side
194
+ # effects!
195
+ class OrFunctionEvaluator < FunctionEvaluator
196
+ FUNCTION_NAME = :or
197
+
198
+ def matches?
199
+ fn?(task_selector, FUNCTION_NAME)
200
+ end
201
+
202
+ # @param _task [Asana::Resources::Task]
203
+ # @param lhs [Object]
204
+ # @param rhs [Object]
205
+ # @return [Object]
206
+ def evaluate(_task, lhs, rhs)
207
+ lhs || rhs
208
+ end
209
+ end
210
+
166
211
  # :not function
167
212
  class NotFunctionEvaluator < FunctionEvaluator
168
213
  FUNCTION_NAME = :not
@@ -237,9 +282,10 @@ module Checkoff
237
282
  end
238
283
 
239
284
  # @param task [Asana::Resources::Task]
285
+ # @param ignore_dependencies [Boolean]
240
286
  # @return [Boolean]
241
- def evaluate(task)
242
- @tasks.task_ready?(task)
287
+ def evaluate(task, ignore_dependencies: false)
288
+ @tasks.task_ready?(task, ignore_dependencies: ignore_dependencies)
243
289
  end
244
290
  end
245
291
 
@@ -272,6 +318,53 @@ module Checkoff
272
318
  end
273
319
  end
274
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
+
275
368
  # :custom_field_value function
276
369
  class CustomFieldValueFunctionEvaluator < FunctionEvaluator
277
370
  FUNCTION_NAME = :custom_field_value
@@ -367,7 +460,7 @@ module Checkoff
367
460
  end
368
461
 
369
462
  # :field_less_than_n_days_ago
370
- class FieldLessThanNDaysAgoFunctionEvaluator < FunctionEvaluator
463
+ class FieldLessThanNDaysAgoPFunctionEvaluator < FunctionEvaluator
371
464
  FUNCTION_NAME = :field_less_than_n_days_ago
372
465
 
373
466
  def matches?
@@ -384,7 +477,7 @@ module Checkoff
384
477
  #
385
478
  # @return [Boolean]
386
479
  def evaluate(task, field_name, num_days)
387
- date = pull_date_field_by_name_or_raise(task, field_name)
480
+ date = pull_date_field_by_name(task, field_name)
388
481
 
389
482
  return false if date.nil?
390
483
 
@@ -396,7 +489,7 @@ module Checkoff
396
489
  end
397
490
 
398
491
  # :field_greater_than_or_equal_to_n_days_from_today
399
- class FieldGreaterThanOrEqualToNDaysFromTodayFunctionEvaluator < FunctionEvaluator
492
+ class FieldGreaterThanOrEqualToNDaysFromTodayPFunctionEvaluator < FunctionEvaluator
400
493
  FUNCTION_NAME = :field_greater_than_or_equal_to_n_days_from_today
401
494
 
402
495
  def matches?
@@ -413,7 +506,7 @@ module Checkoff
413
506
  #
414
507
  # @return [Boolean]
415
508
  def evaluate(task, field_name, num_days)
416
- date = pull_date_field_by_name_or_raise(task, field_name)
509
+ date = pull_date_field_by_name(task, field_name)
417
510
 
418
511
  return false if date.nil?
419
512
 
@@ -504,7 +597,7 @@ module Checkoff
504
597
  # for whatever reason, .last on the enumerable does not impose ordering; .to_a does!
505
598
 
506
599
  # @type [Array<Asana::Resources::Story>]
507
- stories = task.stories.to_a.reject do |story|
600
+ stories = task.stories(per_page: 100).to_a.reject do |story|
508
601
  excluding_resource_subtypes.include? story.resource_subtype
509
602
  end
510
603
  return true if stories.empty? # no stories == infinitely old!
@@ -592,11 +685,13 @@ module Checkoff
592
685
  Checkoff::TaskSelectorClasses::CustomFieldGidValueContainsAnyGidFunctionEvaluator,
593
686
  Checkoff::TaskSelectorClasses::CustomFieldGidValueContainsAllGidsFunctionEvaluator,
594
687
  Checkoff::TaskSelectorClasses::AndFunctionEvaluator,
688
+ Checkoff::TaskSelectorClasses::OrFunctionEvaluator,
595
689
  Checkoff::TaskSelectorClasses::DuePFunctionEvaluator,
690
+ Checkoff::TaskSelectorClasses::DueBetweenRelativePFunctionEvaluator,
596
691
  Checkoff::TaskSelectorClasses::UnassignedPFunctionEvaluator,
597
692
  Checkoff::TaskSelectorClasses::DueDateSetPFunctionEvaluator,
598
- Checkoff::TaskSelectorClasses::FieldLessThanNDaysAgoFunctionEvaluator,
599
- Checkoff::TaskSelectorClasses::FieldGreaterThanOrEqualToNDaysFromTodayFunctionEvaluator,
693
+ Checkoff::TaskSelectorClasses::FieldLessThanNDaysAgoPFunctionEvaluator,
694
+ Checkoff::TaskSelectorClasses::FieldGreaterThanOrEqualToNDaysFromTodayPFunctionEvaluator,
600
695
  Checkoff::TaskSelectorClasses::CustomFieldLessThanNDaysFromNowFunctionEvaluator,
601
696
  Checkoff::TaskSelectorClasses::CustomFieldGreaterThanOrEqualToNDaysFromNowFunctionEvaluator,
602
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.55.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.55.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