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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2725cd346d11c05b4742b3dd59d1202064a3a9036ec37c2037332a02f93165eb
4
- data.tar.gz: b02da55d5036d05eee1c3fb58237cf42e68c28b788be66cd0f41a07647b9e6eb
3
+ metadata.gz: c1944705f29ddc4dab95bb2c056b55c3aa6417cab26ca036a5493612663a4614
4
+ data.tar.gz: 299262b20e9331ee86755c8fced359e62889e34f1fb714c694535167356c2793
5
5
  SHA512:
6
- metadata.gz: a8a4286f693c686211aa41db250b7d3825b9a846a923e53f7327ca0d94ba714f7b94ebfa8ec55964506721d4912d419318e8c2e94ef147b0ed586151a5b5d252
7
- data.tar.gz: 1c1d1f4a88a447e27f3bc9beaf10ff6fec97f0b55ced249eb7cdfbcd2e36955bb5230fb3991339eecd19f44f6b5d9c2ef646746a6ee175b5d4db2d1964305f00
6
+ metadata.gz: f84b26f7790beb97d9f2467b00bead09cd59f60c57e448442892304bbbf7acd6c72c299ee2c890762d9682df76efcf203d5ff3b4442d88d8871b117006a18a83
7
+ data.tar.gz: b1478b9ac625f873fa32ab444facf710ac7246b118927fd3347ed0867ca182cb757ec8b12cbb83a29e4d00882647b6df45a93c2758fb2e4c1ebad5983b13b724
data/Gemfile.lock CHANGED
@@ -12,7 +12,7 @@ GIT
12
12
  PATH
13
13
  remote: .
14
14
  specs:
15
- checkoff (0.98.0)
15
+ checkoff (0.100.0)
16
16
  activesupport
17
17
  asana (> 0.10.0)
18
18
  cache_method
@@ -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
- # :ready_between_n_days function
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
- task_date_or_time = pull_date_or_time_field_by_name(task, :start) ||
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 task_date_or_time.nil?
160
+ return false if ready_date_or_time.nil?
145
161
 
146
- # if time
147
- in_range = if task_date_or_time.is_a?(Time)
148
- task_date_or_time > beginning_n_days_from_now_time &&
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
- def initialize(time_class: Time)
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
- return @time_class.parse(task.start_at) if task.start_at
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
- return @time_class.parse(task.due_at) if task.due_at
25
- return @time_class.parse(task.due_on) if task.due_on
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
@@ -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]
@@ -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.98.0'
6
+ VERSION = '0.100.0'
7
7
  end
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.98.0
4
+ version: 0.100.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vince Broz