checkoff 0.98.0 → 0.100.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/selector_classes/task/function_evaluator.rb +2 -25
- data/lib/checkoff/internal/selector_classes/task.rb +34 -13
- data/lib/checkoff/internal/task_timing.rb +44 -7
- data/lib/checkoff/tasks.rb +4 -1
- data/lib/checkoff/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1944705f29ddc4dab95bb2c056b55c3aa6417cab26ca036a5493612663a4614
|
4
|
+
data.tar.gz: 299262b20e9331ee86755c8fced359e62889e34f1fb714c694535167356c2793
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f84b26f7790beb97d9f2467b00bead09cd59f60c57e448442892304bbbf7acd6c72c299ee2c890762d9682df76efcf203d5ff3b4442d88d8871b117006a18a83
|
7
|
+
data.tar.gz: b1478b9ac625f873fa32ab444facf710ac7246b118927fd3347ed0867ca182cb757ec8b12cbb83a29e4d00882647b6df45a93c2758fb2e4c1ebad5983b13b724
|
data/Gemfile.lock
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../function_evaluator'
|
4
|
+
require 'checkoff/internal/task_timing'
|
4
5
|
|
5
6
|
module Checkoff
|
6
7
|
module SelectorClasses
|
@@ -16,6 +17,7 @@ module Checkoff
|
|
16
17
|
@selector = selector
|
17
18
|
@tasks = tasks
|
18
19
|
@timelines = timelines
|
20
|
+
@task_timing = ::Checkoff::Internal::TaskTiming.new
|
19
21
|
super()
|
20
22
|
end
|
21
23
|
|
@@ -44,31 +46,6 @@ module Checkoff
|
|
44
46
|
raise "Teach me how to handle field #{field_name}"
|
45
47
|
end
|
46
48
|
|
47
|
-
# @param task [Asana::Resources::Task]
|
48
|
-
# @param field_name [Symbol]
|
49
|
-
#
|
50
|
-
# @sg-ignore
|
51
|
-
# @return [Date, Time, nil]
|
52
|
-
def pull_date_or_time_field_by_name(task, field_name)
|
53
|
-
if field_name == :due
|
54
|
-
return Time.parse(task.due_at) unless task.due_at.nil?
|
55
|
-
|
56
|
-
return Date.parse(task.due_on) unless task.due_on.nil?
|
57
|
-
|
58
|
-
return nil
|
59
|
-
end
|
60
|
-
|
61
|
-
if field_name == :start
|
62
|
-
return Time.parse(task.start_at) unless task.start_at.nil?
|
63
|
-
|
64
|
-
return Date.parse(task.start_on) unless task.start_on.nil?
|
65
|
-
|
66
|
-
return nil
|
67
|
-
end
|
68
|
-
|
69
|
-
raise "Teach me how to handle field #{field_name}"
|
70
|
-
end
|
71
|
-
|
72
49
|
# @sg-ignore
|
73
50
|
# @param task [Asana::Resources::Task]
|
74
51
|
# @param custom_field_gid [String]
|
@@ -114,7 +114,7 @@ module Checkoff
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
-
# :
|
117
|
+
# :ready_between_relative function
|
118
118
|
class ReadyBetweenRelativePFunctionEvaluator < FunctionEvaluator
|
119
119
|
FUNCTION_NAME = :ready_between_relative
|
120
120
|
|
@@ -134,24 +134,34 @@ module Checkoff
|
|
134
134
|
#
|
135
135
|
# @return [Boolean]
|
136
136
|
def evaluate(task, beginning_num_days_from_now, end_num_days_from_now, ignore_dependencies: false)
|
137
|
+
ready_between_relative?(task,
|
138
|
+
beginning_num_days_from_now, end_num_days_from_now,
|
139
|
+
ignore_dependencies: ignore_dependencies)
|
140
|
+
end
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
# @param task [Asana::Resources::Task]
|
145
|
+
# @param beginning_num_days_from_now [Integer]
|
146
|
+
# @param end_num_days_from_now [Integer]
|
147
|
+
# @param ignore_dependencies [Boolean]
|
148
|
+
#
|
149
|
+
# @return [Boolean]
|
150
|
+
def ready_between_relative?(task,
|
151
|
+
beginning_num_days_from_now,
|
152
|
+
end_num_days_from_now,
|
153
|
+
ignore_dependencies: false)
|
137
154
|
beginning_n_days_from_now_time = (Time.now + (beginning_num_days_from_now * 24 * 60 * 60))
|
138
155
|
end_n_days_from_now_time = (Time.now + (end_num_days_from_now * 24 * 60 * 60))
|
139
156
|
|
140
157
|
# @type [Date, Time, nil]
|
141
|
-
|
142
|
-
pull_date_or_time_field_by_name(task, :due)
|
158
|
+
ready_date_or_time = @task_timing.date_or_time_field_by_name(task, :ready)
|
143
159
|
|
144
|
-
return false if
|
160
|
+
return false if ready_date_or_time.nil?
|
145
161
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
task_date_or_time <= end_n_days_from_now_time
|
150
|
-
else
|
151
|
-
# if date
|
152
|
-
task_date_or_time > beginning_n_days_from_now_time.to_date &&
|
153
|
-
task_date_or_time <= end_n_days_from_now_time.to_date
|
154
|
-
end
|
162
|
+
in_range = ready_in_range?(ready_date_or_time,
|
163
|
+
beginning_n_days_from_now_time,
|
164
|
+
end_n_days_from_now_time)
|
155
165
|
|
156
166
|
return false unless in_range
|
157
167
|
|
@@ -159,6 +169,17 @@ module Checkoff
|
|
159
169
|
|
160
170
|
true
|
161
171
|
end
|
172
|
+
|
173
|
+
# @param ready_date_or_time [Date, Time]
|
174
|
+
# @param start_time [Time]
|
175
|
+
# @param end_time [Time]
|
176
|
+
def ready_in_range?(ready_date_or_time, start_time, end_time)
|
177
|
+
if ready_date_or_time.is_a?(Time)
|
178
|
+
ready_date_or_time > start_time && ready_date_or_time <= end_time
|
179
|
+
else
|
180
|
+
ready_date_or_time > start_time.to_date && ready_date_or_time <= end_time.to_date
|
181
|
+
end
|
182
|
+
end
|
162
183
|
end
|
163
184
|
|
164
185
|
# :field_less_than_n_days_ago
|
@@ -5,27 +5,64 @@ module Checkoff
|
|
5
5
|
# Utility methods for working with task dates and times
|
6
6
|
class TaskTiming
|
7
7
|
# @param time_class [Class<Time>]
|
8
|
-
|
8
|
+
# @param date_class [Class<Date>]
|
9
|
+
def initialize(time_class: Time, date_class: Date)
|
9
10
|
@time_class = time_class
|
11
|
+
@date_class = date_class
|
10
12
|
end
|
11
13
|
|
12
14
|
# @param task [Asana::Resources::Task]
|
13
15
|
# @return [Time, nil]
|
14
16
|
def start_time(task)
|
15
|
-
|
16
|
-
return @time_class.parse(task.start_on) if task.start_on
|
17
|
-
|
18
|
-
nil
|
17
|
+
date_or_time_field_by_name(task, :start)&.to_time
|
19
18
|
end
|
20
19
|
|
21
20
|
# @param task [Asana::Resources::Task]
|
22
21
|
# @return [Time, nil]
|
23
22
|
def due_time(task)
|
24
|
-
|
25
|
-
|
23
|
+
date_or_time_field_by_name(task, :due)&.to_time
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param task [Asana::Resources::Task]
|
27
|
+
# @param field_name [Symbol]
|
28
|
+
#
|
29
|
+
# @sg-ignore
|
30
|
+
# @return [Date, Time, nil]
|
31
|
+
def start_date_or_time(task)
|
32
|
+
return @time_class.parse(task.start_at) unless task.start_at.nil?
|
33
|
+
|
34
|
+
return @date_class.parse(task.start_on) unless task.start_on.nil?
|
35
|
+
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
# @param task [Asana::Resources::Task]
|
40
|
+
# @param field_name [Symbol]
|
41
|
+
#
|
42
|
+
# @sg-ignore
|
43
|
+
# @return [Date, Time, nil]
|
44
|
+
def due_date_or_time(task)
|
45
|
+
return @time_class.parse(task.due_at) unless task.due_at.nil?
|
46
|
+
|
47
|
+
return @date_class.parse(task.due_on) unless task.due_on.nil?
|
26
48
|
|
27
49
|
nil
|
28
50
|
end
|
51
|
+
|
52
|
+
# @param task [Asana::Resources::Task]
|
53
|
+
# @param field_name [Symbol]
|
54
|
+
#
|
55
|
+
# @sg-ignore
|
56
|
+
# @return [Date, Time, nil]
|
57
|
+
def date_or_time_field_by_name(task, field_name)
|
58
|
+
return due_date_or_time(task) if field_name == :due
|
59
|
+
|
60
|
+
return start_date_or_time(task) if field_name == :start
|
61
|
+
|
62
|
+
return start_date_or_time(task) || due_date_or_time(task) if field_name == :ready
|
63
|
+
|
64
|
+
raise "Teach me how to handle field #{field_name}"
|
65
|
+
end
|
29
66
|
end
|
30
67
|
end
|
31
68
|
end
|
data/lib/checkoff/tasks.rb
CHANGED
@@ -27,6 +27,7 @@ module Checkoff
|
|
27
27
|
# @param workspaces [Checkoff::Workspaces]
|
28
28
|
# @param sections [Checkoff::Sections]
|
29
29
|
# @param time_class [Class<Time>]
|
30
|
+
# @param date_class [Class<Date>]
|
30
31
|
# @param asana_task [Class<Asana::Resources::Task>]
|
31
32
|
def initialize(config: Checkoff::Internal::ConfigLoader.load(:asana),
|
32
33
|
client: Checkoff::Clients.new(config: config).client,
|
@@ -35,10 +36,12 @@ module Checkoff
|
|
35
36
|
sections: Checkoff::Sections.new(config: config,
|
36
37
|
client: client),
|
37
38
|
time_class: Time,
|
39
|
+
date_class: Date,
|
38
40
|
asana_task: Asana::Resources::Task)
|
39
41
|
@config = config
|
40
42
|
@sections = sections
|
41
43
|
@time_class = time_class
|
44
|
+
@date_class = date_class
|
42
45
|
@asana_task = asana_task
|
43
46
|
@client = client
|
44
47
|
@workspaces = workspaces
|
@@ -167,7 +170,7 @@ module Checkoff
|
|
167
170
|
|
168
171
|
# @return [Checkoff::Internal::TaskTiming]
|
169
172
|
def task_timing
|
170
|
-
@task_timing ||= Checkoff::Internal::TaskTiming.new(time_class: @time_class)
|
173
|
+
@task_timing ||= Checkoff::Internal::TaskTiming.new(time_class: @time_class, date_class: @date_class)
|
171
174
|
end
|
172
175
|
|
173
176
|
# @return [Checkoff::Internal::TaskHashes]
|
data/lib/checkoff/version.rb
CHANGED