checkoff 0.102.0 → 0.104.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/checkoff/internal/ready_between_relative.rb +63 -0
- data/lib/checkoff/internal/selector_classes/common/function_evaluator.rb +0 -48
- data/lib/checkoff/internal/selector_classes/project/function_evaluator.rb +0 -48
- data/lib/checkoff/internal/selector_classes/task/function_evaluator.rb +0 -25
- data/lib/checkoff/internal/selector_classes/task.rb +11 -47
- data/lib/checkoff/internal/task_timing.rb +9 -0
- data/lib/checkoff/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6d308b4ca05ee88bf3b380772496d9c621cc7b9f521b4cf19eb1351395ed2b2
|
4
|
+
data.tar.gz: eb14bb0c6f4dabd72e083ce67a5c3c821be931ac268f3202445714da9ae713aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28983082df6a4c00e31fb3f458a6bafc0241920d4f1b5657e6ce3613d86127b0df6561defde8669a9ead845e2ef7d77c10ec1d45603c55d17fe735c5d3d5e716
|
7
|
+
data.tar.gz: dc877bc157ed76157327c2e094ff69ff4074275eaa9df93ec9d3fdf8bc67969c4402503ee9435bcf1305f489f0d7ab22f0b43129e69b0abe9e06064b4683f8e7
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Checkoff
|
4
|
+
module Internal
|
5
|
+
# Determine whether a task is due within a relative date range
|
6
|
+
class ReadyBetweenRelative
|
7
|
+
# @param config [Hash<Symbol, Object>]
|
8
|
+
# @param clients [Checkoff::Clients]
|
9
|
+
# @param task_timing [Checkoff::Internal::TaskTiming]
|
10
|
+
# @param tasks [Checkoff::Tasks]
|
11
|
+
def initialize(config: Checkoff::Internal::ConfigLoader.load(:asana),
|
12
|
+
clients: Checkoff::Clients.new(config: config),
|
13
|
+
task_timing: ::Checkoff::Internal::TaskTiming.new,
|
14
|
+
tasks: ::Checkoff::Tasks.new(config: config,
|
15
|
+
client: clients.client))
|
16
|
+
@task_timing = task_timing
|
17
|
+
@tasks = tasks
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param task [Asana::Resources::Task]
|
21
|
+
# @param beginning_num_days_from_now [Integer]
|
22
|
+
# @param end_num_days_from_now [Integer]
|
23
|
+
# @param ignore_dependencies [Boolean]
|
24
|
+
#
|
25
|
+
# @return [Boolean]
|
26
|
+
def ready_between_relative?(task,
|
27
|
+
beginning_num_days_from_now,
|
28
|
+
end_num_days_from_now,
|
29
|
+
ignore_dependencies: false)
|
30
|
+
beginning_n_days_from_now_time = (Time.now + (beginning_num_days_from_now * 24 * 60 * 60))
|
31
|
+
end_n_days_from_now_time = (Time.now + (end_num_days_from_now * 24 * 60 * 60))
|
32
|
+
|
33
|
+
# @type [Date, Time, nil]
|
34
|
+
ready_date_or_time = @task_timing.date_or_time_field_by_name(task, :ready)
|
35
|
+
|
36
|
+
return false if ready_date_or_time.nil?
|
37
|
+
|
38
|
+
in_range = ready_in_range?(ready_date_or_time,
|
39
|
+
beginning_n_days_from_now_time,
|
40
|
+
end_n_days_from_now_time)
|
41
|
+
|
42
|
+
return false unless in_range
|
43
|
+
|
44
|
+
return false if !ignore_dependencies && @tasks.incomplete_dependencies?(task)
|
45
|
+
|
46
|
+
true
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
# @param ready_date_or_time [Date, Time]
|
52
|
+
# @param start_time [Time]
|
53
|
+
# @param end_time [Time]
|
54
|
+
def ready_in_range?(ready_date_or_time, start_time, end_time)
|
55
|
+
if ready_date_or_time.is_a?(Time)
|
56
|
+
ready_date_or_time > start_time && ready_date_or_time <= end_time
|
57
|
+
else
|
58
|
+
ready_date_or_time > start_time.to_date && ready_date_or_time <= end_time.to_date
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -15,54 +15,6 @@ module Checkoff
|
|
15
15
|
|
16
16
|
private
|
17
17
|
|
18
|
-
# @param project [Asana::Resources::Project]
|
19
|
-
# @param field_name [Symbol]
|
20
|
-
#
|
21
|
-
# @sg-ignore
|
22
|
-
# @return [Date, nil]
|
23
|
-
def pull_date_field_by_name(project, field_name)
|
24
|
-
if field_name == :modified
|
25
|
-
return Time.parse(project.modified_at).to_date unless project.modified_at.nil?
|
26
|
-
|
27
|
-
return nil
|
28
|
-
end
|
29
|
-
|
30
|
-
if field_name == :due
|
31
|
-
return Time.parse(project.due_at).to_date unless project.due_at.nil?
|
32
|
-
|
33
|
-
return Date.parse(project.due_on) unless project.due_on.nil?
|
34
|
-
|
35
|
-
return nil
|
36
|
-
end
|
37
|
-
|
38
|
-
raise "Teach me how to handle field #{field_name}"
|
39
|
-
end
|
40
|
-
|
41
|
-
# @param project [Asana::Resources::Project]
|
42
|
-
# @param field_name [Symbol]
|
43
|
-
#
|
44
|
-
# @sg-ignore
|
45
|
-
# @return [Date, Time, nil]
|
46
|
-
def pull_date_or_time_field_by_name(project, field_name)
|
47
|
-
if field_name == :due
|
48
|
-
return Time.parse(project.due_at) unless project.due_at.nil?
|
49
|
-
|
50
|
-
return Date.parse(project.due_on) unless project.due_on.nil?
|
51
|
-
|
52
|
-
return nil
|
53
|
-
end
|
54
|
-
|
55
|
-
if field_name == :start
|
56
|
-
return Time.parse(project.start_at) unless project.start_at.nil?
|
57
|
-
|
58
|
-
return Date.parse(project.start_on) unless project.start_on.nil?
|
59
|
-
|
60
|
-
return nil
|
61
|
-
end
|
62
|
-
|
63
|
-
raise "Teach me how to handle field #{field_name}"
|
64
|
-
end
|
65
|
-
|
66
18
|
# @sg-ignore
|
67
19
|
# @param project [Asana::Resources::Project]
|
68
20
|
# @param custom_field_gid [String]
|
@@ -18,54 +18,6 @@ module Checkoff
|
|
18
18
|
|
19
19
|
private
|
20
20
|
|
21
|
-
# @param project [Asana::Resources::Project]
|
22
|
-
# @param field_name [Symbol]
|
23
|
-
#
|
24
|
-
# @sg-ignore
|
25
|
-
# @return [Date, nil]
|
26
|
-
def pull_date_field_by_name(project, field_name)
|
27
|
-
if field_name == :modified
|
28
|
-
return Time.parse(project.modified_at).to_date unless project.modified_at.nil?
|
29
|
-
|
30
|
-
return nil
|
31
|
-
end
|
32
|
-
|
33
|
-
if field_name == :due
|
34
|
-
return Time.parse(project.due_at).to_date unless project.due_at.nil?
|
35
|
-
|
36
|
-
return Date.parse(project.due_on) unless project.due_on.nil?
|
37
|
-
|
38
|
-
return nil
|
39
|
-
end
|
40
|
-
|
41
|
-
raise "Teach me how to handle field #{field_name}"
|
42
|
-
end
|
43
|
-
|
44
|
-
# @param project [Asana::Resources::Project]
|
45
|
-
# @param field_name [Symbol]
|
46
|
-
#
|
47
|
-
# @sg-ignore
|
48
|
-
# @return [Date, Time, nil]
|
49
|
-
def pull_date_or_time_field_by_name(project, field_name)
|
50
|
-
if field_name == :due
|
51
|
-
return Time.parse(project.due_at) unless project.due_at.nil?
|
52
|
-
|
53
|
-
return Date.parse(project.due_on) unless project.due_on.nil?
|
54
|
-
|
55
|
-
return nil
|
56
|
-
end
|
57
|
-
|
58
|
-
if field_name == :start
|
59
|
-
return Time.parse(project.start_at) unless project.start_at.nil?
|
60
|
-
|
61
|
-
return Date.parse(project.start_on) unless project.start_on.nil?
|
62
|
-
|
63
|
-
return nil
|
64
|
-
end
|
65
|
-
|
66
|
-
raise "Teach me how to handle field #{field_name}"
|
67
|
-
end
|
68
|
-
|
69
21
|
# @sg-ignore
|
70
22
|
# @param project [Asana::Resources::Project]
|
71
23
|
# @param custom_field_gid [String]
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../function_evaluator'
|
4
|
-
require 'checkoff/internal/task_timing'
|
5
4
|
|
6
5
|
module Checkoff
|
7
6
|
module SelectorClasses
|
@@ -17,35 +16,11 @@ module Checkoff
|
|
17
16
|
@selector = selector
|
18
17
|
@tasks = tasks
|
19
18
|
@timelines = timelines
|
20
|
-
@task_timing = ::Checkoff::Internal::TaskTiming.new
|
21
19
|
super()
|
22
20
|
end
|
23
21
|
|
24
22
|
private
|
25
23
|
|
26
|
-
# @param task [Asana::Resources::Task]
|
27
|
-
# @param field_name [Symbol]
|
28
|
-
#
|
29
|
-
# @sg-ignore
|
30
|
-
# @return [Date, nil]
|
31
|
-
def pull_date_field_by_name(task, field_name)
|
32
|
-
if field_name == :modified
|
33
|
-
return Time.parse(task.modified_at).to_date unless task.modified_at.nil?
|
34
|
-
|
35
|
-
return nil
|
36
|
-
end
|
37
|
-
|
38
|
-
if field_name == :due
|
39
|
-
return Time.parse(task.due_at).to_date unless task.due_at.nil?
|
40
|
-
|
41
|
-
return Date.parse(task.due_on) unless task.due_on.nil?
|
42
|
-
|
43
|
-
return nil
|
44
|
-
end
|
45
|
-
|
46
|
-
raise "Teach me how to handle field #{field_name}"
|
47
|
-
end
|
48
|
-
|
49
24
|
# @sg-ignore
|
50
25
|
# @param task [Asana::Resources::Task]
|
51
26
|
# @param custom_field_gid [String]
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'task/function_evaluator'
|
4
|
+
require 'checkoff/internal/ready_between_relative'
|
5
|
+
require 'checkoff/internal/task_timing'
|
4
6
|
|
5
7
|
module Checkoff
|
6
8
|
module SelectorClasses
|
@@ -134,51 +136,10 @@ module Checkoff
|
|
134
136
|
#
|
135
137
|
# @return [Boolean]
|
136
138
|
def evaluate(task, beginning_num_days_from_now, end_num_days_from_now, ignore_dependencies: false)
|
137
|
-
ready_between_relative
|
138
|
-
|
139
|
-
|
140
|
-
|
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)
|
154
|
-
beginning_n_days_from_now_time = (Time.now + (beginning_num_days_from_now * 24 * 60 * 60))
|
155
|
-
end_n_days_from_now_time = (Time.now + (end_num_days_from_now * 24 * 60 * 60))
|
156
|
-
|
157
|
-
# @type [Date, Time, nil]
|
158
|
-
ready_date_or_time = @task_timing.date_or_time_field_by_name(task, :ready)
|
159
|
-
|
160
|
-
return false if ready_date_or_time.nil?
|
161
|
-
|
162
|
-
in_range = ready_in_range?(ready_date_or_time,
|
163
|
-
beginning_n_days_from_now_time,
|
164
|
-
end_n_days_from_now_time)
|
165
|
-
|
166
|
-
return false unless in_range
|
167
|
-
|
168
|
-
return false if !ignore_dependencies && @tasks.incomplete_dependencies?(task)
|
169
|
-
|
170
|
-
true
|
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
|
139
|
+
ready_between_relative = Checkoff::Internal::ReadyBetweenRelative.new(tasks: @tasks)
|
140
|
+
ready_between_relative.ready_between_relative?(task,
|
141
|
+
beginning_num_days_from_now, end_num_days_from_now,
|
142
|
+
ignore_dependencies: ignore_dependencies)
|
182
143
|
end
|
183
144
|
end
|
184
145
|
|
@@ -200,7 +161,9 @@ module Checkoff
|
|
200
161
|
#
|
201
162
|
# @return [Boolean]
|
202
163
|
def evaluate(task, field_name, num_days)
|
203
|
-
|
164
|
+
task_timing = Checkoff::Internal::TaskTiming.new
|
165
|
+
|
166
|
+
date = task_timing.date_or_time_field_by_name(task, field_name)&.to_date
|
204
167
|
|
205
168
|
return false if date.nil?
|
206
169
|
|
@@ -229,7 +192,8 @@ module Checkoff
|
|
229
192
|
#
|
230
193
|
# @return [Boolean]
|
231
194
|
def evaluate(task, field_name, num_days)
|
232
|
-
|
195
|
+
task_timing = Checkoff::Internal::TaskTiming.new
|
196
|
+
date = task_timing.date_or_time_field_by_name(task, field_name)&.to_date
|
233
197
|
|
234
198
|
return false if date.nil?
|
235
199
|
|
@@ -49,6 +49,13 @@ module Checkoff
|
|
49
49
|
nil
|
50
50
|
end
|
51
51
|
|
52
|
+
# @param task [Asana::Resources::Task]
|
53
|
+
#
|
54
|
+
# @return [Time, nil]
|
55
|
+
def modified_time(task)
|
56
|
+
return @time_class.parse(task.modified_at) unless task.modified_at.nil?
|
57
|
+
end
|
58
|
+
|
52
59
|
# @param task [Asana::Resources::Task]
|
53
60
|
# @param field_name [Symbol]
|
54
61
|
#
|
@@ -59,6 +66,8 @@ module Checkoff
|
|
59
66
|
|
60
67
|
return start_date_or_time(task) if field_name == :start
|
61
68
|
|
69
|
+
return modified_time(task) if field_name == :modified
|
70
|
+
|
62
71
|
return start_date_or_time(task) || due_date_or_time(task) if field_name == :ready
|
63
72
|
|
64
73
|
raise "Teach me how to handle field #{field_name}"
|
data/lib/checkoff/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: checkoff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.104.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vince Broz
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- lib/checkoff/internal/config_loader.rb
|
135
135
|
- lib/checkoff/internal/create-class.sh
|
136
136
|
- lib/checkoff/internal/project_selector_evaluator.rb
|
137
|
+
- lib/checkoff/internal/ready_between_relative.rb
|
137
138
|
- lib/checkoff/internal/search_url.rb
|
138
139
|
- lib/checkoff/internal/search_url/custom_field_param_converter.rb
|
139
140
|
- lib/checkoff/internal/search_url/custom_field_variant.rb
|