checkoff 0.245.0 → 0.247.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: 16837626a210b7327f511b18077cee738a0b4f205daf0f0b045a50724665c046
4
- data.tar.gz: ce43d4671fc73bb78073cf7b80d9b323cd7e0100f114a2af87f0229e11910307
3
+ metadata.gz: 4a4767930eda52d13e8d437d7cd2aa33dd4af3f7e402ce12fb60d3371f955742
4
+ data.tar.gz: c95a95f0a59e48fee37bc6a43a461a2c5a2b60f73314b1e799c23d3e466be6b1
5
5
  SHA512:
6
- metadata.gz: 7386e4bd7e121415a124923913d5e3f6ed9aacb3a7a6f869310874a9e9df0a7882230d99dcf50adba284c713ef13a0fd0d9a931751aa08c3c814aa11b0e0aa3c
7
- data.tar.gz: b6c0987c6301e7a1bc44fbccc2a55e08317f8f868a97a7fa5d62597dae689d19855a5d994a83e7e227444756e51bbff6fbdf7f16d99d8fd0637bbbfcddd4eb8e
6
+ metadata.gz: '098a082874fa5ea130e0fceadad00b1d5f0a6c78e66ee53d351f90bc9b5b014a5958ae440a26472483a0742affd97325e3365cd2780f4afb6f3507654278a910'
7
+ data.tar.gz: 4a2c87a47f0f7767154d9b0ff1474892669832c1e99893d6f28b26d750a2e6a79854076e5b30d0d3daa819ec4d297d11167bea0349038d551f2a5d12211ce5ca
@@ -190,9 +190,12 @@ module Checkoff
190
190
 
191
191
  # @param task [Asana::Resources::Task]
192
192
  # @return [Boolean]
193
+ # CI quality (pipeline 1902): "return type could not be inferred" on modified lines
194
+ # after 7eeb5b1 removed @sg-ignore. Local overcommit may report "Unneeded @sg-ignore";
195
+ # `== true` alone did not satisfy the CI overcommit Solargraph hook.
193
196
  # @sg-ignore
194
197
  def evaluate(task)
195
- task.assignee.nil?
198
+ task.assignee.nil? == true
196
199
  end
197
200
  end
198
201
 
@@ -206,9 +209,10 @@ module Checkoff
206
209
 
207
210
  # @param task [Asana::Resources::Task]
208
211
  # @return [Boolean]
212
+ # Same CI/local Solargraph drift as UnassignedPFunctionEvaluator#evaluate (pipeline 1902).
209
213
  # @sg-ignore
210
214
  def evaluate(task)
211
- !task.due_at.nil? || !task.due_on.nil?
215
+ !(task.due_at.nil? && task.due_on.nil?)
212
216
  end
213
217
  end
214
218
 
@@ -283,12 +283,13 @@ module Checkoff
283
283
  # @return [void]
284
284
  def file_task_by_section(by_section, task, project_gid)
285
285
  membership = task.memberships.find do |m|
286
- # @sg-ignore
287
- T.cast(m['project'], T::Hash[String, T.untyped])['gid'] == project_gid
286
+ membership_hash = T.unsafe(m)
287
+ T.cast(membership_hash['project'], T::Hash[String, T.untyped])['gid'] == project_gid
288
288
  end
289
289
  raise "Could not find task in project_gid #{project_gid}: #{task}" if membership.nil?
290
290
 
291
- section = T.cast(membership['section'], T::Hash[String, T.untyped])
291
+ membership_data = T.unsafe(membership)
292
+ section = T.cast(membership_data['section'], T::Hash[String, T.untyped])
292
293
  section_name = T.cast(section['name'], String)
293
294
 
294
295
  # @type [String, nil]
@@ -165,7 +165,7 @@ module Checkoff
165
165
  all_options = projects.task_options(extra_fields:,
166
166
  only_uncompleted:)
167
167
  # @type [Hash]
168
- options = all_options.fetch(:options, {})
168
+ options = all_options.fetch(:options) { {} }
169
169
  options[:completed_since] = all_options[:completed_since] unless all_options[:completed_since].nil?
170
170
  client.tasks.find_by_id(task_gid, options:)
171
171
  rescue Asana::Errors::NotFound => e
@@ -292,6 +292,7 @@ module Checkoff
292
292
  # @param portfolio_name [String]
293
293
  # @param workspace_name [String]
294
294
  # @return [Boolean]
295
+ # CI quality (pipeline 1902): "in_portfolio_named? return type could not be inferred".
295
296
  # @sg-ignore
296
297
  def in_portfolio_named?(task,
297
298
  portfolio_name,
@@ -300,10 +301,8 @@ module Checkoff
300
301
  task.memberships.any? do |membership|
301
302
  m = T.cast(membership, T::Hash[String, T.untyped])
302
303
  project_gid = T.cast(m.fetch('project'), T::Hash[String, T.untyped]).fetch('gid')
303
- portfolio_projects.any? do |portfolio_project|
304
- portfolio_project.gid == project_gid
305
- end
306
- end
304
+ portfolio_projects.any? { |portfolio_project| portfolio_project.gid == project_gid }
305
+ end == true
307
306
  end
308
307
 
309
308
  # True if the task is in a project which is in the given portfolio
@@ -13,7 +13,7 @@ require_relative 'clients'
13
13
 
14
14
  module Checkoff
15
15
  # Manages timelines of dependent tasks with dates and milestones
16
- class Timelines
16
+ class Timelines # rubocop:disable Metrics/ClassLength
17
17
  # @!parse
18
18
  # extend CacheMethod::ClassMethods
19
19
 
@@ -65,7 +65,6 @@ module Checkoff
65
65
  # @param task [Asana::Resources::Task]
66
66
  # @param limit_to_portfolio_name [String, nil]
67
67
  # @return [Boolean]
68
- # @sg-ignore
69
68
  def last_task_milestone_depends_on_this_task?(task, limit_to_portfolio_name: nil)
70
69
  unless limit_to_portfolio_name.nil?
71
70
  limit_to_projects = @portfolios.projects_in_portfolio(@workspaces.default_workspace.name,
@@ -73,15 +72,19 @@ module Checkoff
73
72
  end
74
73
 
75
74
  all_dependent_task_gids = nil
76
- task.memberships.all? do |membership_data|
75
+ # @type [Array<Hash{String => Object}>]
76
+ memberships = task.memberships
77
+ memberships.all? do |membership_data|
78
+ # @type [Hash{String => Object}]
79
+ md = membership_data
77
80
  unless limit_to_portfolio_name.nil?
78
- # @sg-ignore
79
- project_gid = membership_data.fetch('project').fetch('gid')
81
+ # @type [Hash{String => Object}]
82
+ project_data = md.fetch('project')
83
+ project_gid = project_data.fetch('gid')
80
84
  next true unless limit_to_projects.map(&:gid).include? project_gid
81
85
  end
82
- # @sg-ignore
83
- section_data = membership_data.fetch('section')
84
- # @sg-ignore
86
+ # @type [Hash{String => Object}]
87
+ section_data = md.fetch('section')
85
88
  section_gid = section_data.fetch('gid')
86
89
 
87
90
  last_milestone = last_milestone_in_section(section_gid)
@@ -100,7 +103,6 @@ module Checkoff
100
103
  # @param task [Asana::Resources::Task]
101
104
  # @param limit_to_portfolio_name [String, nil]
102
105
  # @return [Boolean]
103
- # @sg-ignore
104
106
  def any_milestone_depends_on_this_task?(task, limit_to_portfolio_name: nil)
105
107
  unless limit_to_portfolio_name.nil?
106
108
  limit_to_projects = @portfolios.projects_in_portfolio(@workspaces.default_workspace.name,
@@ -108,10 +110,15 @@ module Checkoff
108
110
  end
109
111
 
110
112
  all_dependent_milestones = nil
111
- task.memberships.all? do |membership_data|
113
+ # @type [Array<Hash{String => Object}>]
114
+ memberships = task.memberships
115
+ memberships.all? do |membership_data|
116
+ # @type [Hash{String => Object}]
117
+ md = membership_data
112
118
  unless limit_to_portfolio_name.nil?
113
- # @sg-ignore
114
- project_gid = membership_data.fetch('project').fetch('gid')
119
+ # @type [Hash{String => Object}]
120
+ project_data = md.fetch('project')
121
+ project_gid = project_data.fetch('gid')
115
122
  next true unless limit_to_projects.map(&:gid).include? project_gid
116
123
  end
117
124
 
@@ -6,6 +6,7 @@
6
6
  require 'date'
7
7
  require 'time'
8
8
  require 'active_support'
9
+ require 'active_support/core_ext/integer/time'
9
10
  # require 'active_support/time'
10
11
  require 'forwardable'
11
12
  require 'cache_method'
@@ -169,9 +170,9 @@ module Checkoff
169
170
 
170
171
  # @param num_days [Integer]
171
172
  #
172
- # @return [Time]
173
+ # @return [ActiveSupport::TimeWithZone]
173
174
  def n_days_from_now(num_days)
174
- Time.at(@now_getter.now.to_i + (num_days * 86_400))
175
+ num_days.days.since(@now_getter.now)
175
176
  end
176
177
 
177
178
  # @param num_days [Integer]
@@ -4,5 +4,5 @@
4
4
  # Command-line and gem client for Asana (unofficial)
5
5
  module Checkoff
6
6
  # Version of library
7
- VERSION = '0.245.0'
7
+ VERSION = '0.247.0'
8
8
  end
data/rbi/checkoff.rbi CHANGED
@@ -75,7 +75,7 @@ module Overcommit
75
75
  end
76
76
 
77
77
  module Checkoff
78
- VERSION = '0.245.0'
78
+ VERSION = '0.247.0'
79
79
 
80
80
  class Attachments
81
81
  include Logging
@@ -2442,7 +2442,7 @@ end
2442
2442
  # typed: ignore
2443
2443
  # Command-line and gem client for Asana (unofficial)
2444
2444
  module Checkoff
2445
- VERSION = T.let('0.245.0', T.untyped)
2445
+ VERSION = T.let('0.247.0', T.untyped)
2446
2446
 
2447
2447
  # Move tasks from one place to another
2448
2448
  class MvSubcommand
@@ -3027,6 +3027,7 @@ module Checkoff
3027
3027
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
3028
3028
  # True if the task is in a project which is in the given portfolio
3029
3029
  #
3030
+ # CI quality (pipeline 1902): "in_portfolio_named? return type could not be inferred".
3030
3031
  # @sg-ignore
3031
3032
  #
3032
3033
  # _@param_ `task`
@@ -3314,7 +3315,7 @@ module Checkoff
3314
3315
  def now_or_before?(date_or_time); end
3315
3316
 
3316
3317
  # _@param_ `num_days`
3317
- sig { params(num_days: Integer).returns(Time) }
3318
+ sig { params(num_days: Integer).returns(ActiveSupport::TimeWithZone) }
3318
3319
  def n_days_from_now(num_days); end
3319
3320
 
3320
3321
  # @sg-ignore
@@ -4133,8 +4134,6 @@ module Checkoff
4133
4134
  def task_dependent_on_previous_section_last_milestone?(task, limit_to_portfolio_gid: nil); end
4134
4135
 
4135
4136
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
4136
- # @sg-ignore
4137
- #
4138
4137
  # _@param_ `task`
4139
4138
  #
4140
4139
  # _@param_ `limit_to_portfolio_name`
@@ -4142,8 +4141,6 @@ module Checkoff
4142
4141
  def last_task_milestone_depends_on_this_task?(task, limit_to_portfolio_name: nil); end
4143
4142
 
4144
4143
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
4145
- # @sg-ignore
4146
- #
4147
4144
  # _@param_ `task`
4148
4145
  #
4149
4146
  # _@param_ `limit_to_portfolio_name`
@@ -5965,6 +5962,9 @@ module Checkoff
5965
5962
  def matches?; end
5966
5963
 
5967
5964
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
5965
+ # CI quality (pipeline 1902): "return type could not be inferred" on modified lines
5966
+ # after 7eeb5b1 removed @sg-ignore. Local overcommit may report "Unneeded @sg-ignore";
5967
+ # `== true` alone did not satisfy the CI overcommit Solargraph hook.
5968
5968
  # @sg-ignore
5969
5969
  #
5970
5970
  # _@param_ `task`
@@ -5980,6 +5980,7 @@ module Checkoff
5980
5980
  def matches?; end
5981
5981
 
5982
5982
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
5983
+ # Same CI/local Solargraph drift as UnassignedPFunctionEvaluator#evaluate (pipeline 1902).
5983
5984
  # @sg-ignore
5984
5985
  #
5985
5986
  # _@param_ `task`
@@ -6131,9 +6132,6 @@ module Checkoff
6131
6132
  end
6132
6133
  def initialize(selector:, tasks:, timelines:, custom_fields:, **_kwargs); end
6133
6134
 
6134
- sig { returns([Symbol, T::Array[T.untyped]]) }
6135
- attr_reader :selector
6136
-
6137
6135
  sig { returns(Checkoff::Tasks) }
6138
6136
  attr_reader :tasks
6139
6137
 
@@ -6142,6 +6140,9 @@ module Checkoff
6142
6140
 
6143
6141
  sig { returns(Checkoff::CustomFields) }
6144
6142
  attr_reader :custom_fields
6143
+
6144
+ sig { returns([Symbol, T::Array[T.untyped]]) }
6145
+ attr_reader :selector
6145
6146
  end
6146
6147
  end
6147
6148
 
@@ -7129,6 +7130,15 @@ class TestTasks < BaseAsana
7129
7130
  sig { void }
7130
7131
  def test_in_portfolio_more_than_once; end
7131
7132
 
7133
+ sig { void }
7134
+ def test_in_portfolio_more_than_once_true; end
7135
+
7136
+ sig { void }
7137
+ def test_gid_for_task; end
7138
+
7139
+ sig { void }
7140
+ def test_gid_for_task_not_found; end
7141
+
7132
7142
  sig { returns(T.untyped) }
7133
7143
  def test_task_to_h_delegates; end
7134
7144
 
@@ -7170,15 +7180,6 @@ class TestTasks < BaseAsana
7170
7180
 
7171
7181
  sig { void }
7172
7182
  def class_under_test; end
7173
-
7174
- sig { void }
7175
- def test_in_portfolio_more_than_once_true; end
7176
-
7177
- sig { void }
7178
- def test_gid_for_task; end
7179
-
7180
- sig { void }
7181
- def test_gid_for_task_not_found; end
7182
7183
  end
7183
7184
 
7184
7185
  # Test the Checkoff::CLI class with mv subcommand
@@ -7906,19 +7907,19 @@ class TestTimelines < ClassTest
7906
7907
  def test_init; end
7907
7908
 
7908
7909
  sig { void }
7909
- def class_under_test; end
7910
+ def test_any_milestone_depends_on_this_task_false; end
7910
7911
 
7911
7912
  sig { void }
7912
- def respond_like_instance_of; end
7913
+ def test_any_milestone_depends_on_this_task_true; end
7913
7914
 
7914
7915
  sig { void }
7915
- def respond_like; end
7916
+ def class_under_test; end
7916
7917
 
7917
7918
  sig { void }
7918
- def test_any_milestone_depends_on_this_task_false; end
7919
+ def respond_like_instance_of; end
7919
7920
 
7920
7921
  sig { void }
7921
- def test_any_milestone_depends_on_this_task_true; end
7922
+ def respond_like; end
7922
7923
  end
7923
7924
 
7924
7925
  class TestPortfolios < ClassTest
@@ -8022,15 +8023,6 @@ class TestAttachments < ClassTest
8022
8023
  sig { void }
8023
8024
  def test_create_attachment_from_url; end
8024
8025
 
8025
- sig { void }
8026
- def class_under_test; end
8027
-
8028
- sig { void }
8029
- def respond_like_instance_of; end
8030
-
8031
- sig { void }
8032
- def respond_like; end
8033
-
8034
8026
  # _@param_ `gid`
8035
8027
  #
8036
8028
  # _@param_ `url`
@@ -8042,6 +8034,15 @@ class TestAttachments < ClassTest
8042
8034
 
8043
8035
  sig { void }
8044
8036
  def test_run; end
8037
+
8038
+ sig { void }
8039
+ def class_under_test; end
8040
+
8041
+ sig { void }
8042
+ def respond_like_instance_of; end
8043
+
8044
+ sig { void }
8045
+ def respond_like; end
8045
8046
  end
8046
8047
 
8047
8048
  # double to inject cache_method, pretending to be cache_method gem
@@ -8325,15 +8326,6 @@ class TestTaskSearches < ClassTest
8325
8326
  sig { void }
8326
8327
  def test_as_cache_key; end
8327
8328
 
8328
- sig { void }
8329
- def class_under_test; end
8330
-
8331
- sig { void }
8332
- def respond_like_instance_of; end
8333
-
8334
- sig { void }
8335
- def respond_like; end
8336
-
8337
8329
  sig { void }
8338
8330
  def test_raw_task_search_without_selector; end
8339
8331
 
@@ -8343,6 +8335,15 @@ class TestTaskSearches < ClassTest
8343
8335
 
8344
8336
  sig { void }
8345
8337
  def test_raw_task_search_paginates_when_full_page; end
8338
+
8339
+ sig { void }
8340
+ def class_under_test; end
8341
+
8342
+ sig { void }
8343
+ def respond_like_instance_of; end
8344
+
8345
+ sig { void }
8346
+ def respond_like; end
8346
8347
  end
8347
8348
 
8348
8349
  # rubocop:disable Metrics/ClassLength
@@ -8581,6 +8582,12 @@ class TestTaskSelectors < ClassTest
8581
8582
  sig { returns(T.untyped) }
8582
8583
  def test_filter_via_task_selector_in_project_named_true; end
8583
8584
 
8585
+ sig { returns(T.untyped) }
8586
+ def test_filter_via_task_selector_in_section_named_false; end
8587
+
8588
+ sig { returns(T.untyped) }
8589
+ def test_filter_via_task_selector_in_section_named_true; end
8590
+
8584
8591
  sig { returns(T.untyped) }
8585
8592
  def test_dependent_on_previous_section_last_milestone; end
8586
8593
 
@@ -8596,15 +8603,6 @@ class TestTaskSelectors < ClassTest
8596
8603
  sig { void }
8597
8604
  def test_last_task_milestone_does_not_depend_on_this_task; end
8598
8605
 
8599
- sig { void }
8600
- def respond_like_instance_of; end
8601
-
8602
- sig { void }
8603
- def respond_like; end
8604
-
8605
- sig { returns(T.class_of(Checkoff::TaskSelectors)) }
8606
- def class_under_test; end
8607
-
8608
8606
  sig { void }
8609
8607
  def test_in_a_real_project_true; end
8610
8608
 
@@ -8629,11 +8627,49 @@ class TestTaskSelectors < ClassTest
8629
8627
  sig { void }
8630
8628
  def test_no_milestone_depends_on_this_task_true; end
8631
8629
 
8632
- sig { returns(T.untyped) }
8633
- def test_filter_via_task_selector_in_section_named_false; end
8630
+ sig { void }
8631
+ def respond_like_instance_of; end
8634
8632
 
8635
- sig { returns(T.untyped) }
8636
- def test_filter_via_task_selector_in_section_named_true; end
8633
+ sig { void }
8634
+ def respond_like; end
8635
+
8636
+ sig { returns(T.class_of(Checkoff::TaskSelectors)) }
8637
+ def class_under_test; end
8638
+ end
8639
+
8640
+ # Test the Checkoff::ViewSubcommand class used in CLI processing
8641
+ class TestViewSubcommand < ClassTest
8642
+ extend Forwardable
8643
+
8644
+ sig { returns(String) }
8645
+ def task_name; end
8646
+
8647
+ sig { returns(String) }
8648
+ def due_at_value; end
8649
+
8650
+ sig { void }
8651
+ def expect_task_lookup; end
8652
+
8653
+ sig { void }
8654
+ def stub_task_due_fields; end
8655
+
8656
+ sig { void }
8657
+ def test_run_on_task; end
8658
+
8659
+ sig { void }
8660
+ def test_run_on_task_not_found; end
8661
+
8662
+ sig { params(clazz: T.untyped).returns(Checkoff::ViewSubcommand) }
8663
+ def create_object(clazz = class_under_test); end
8664
+
8665
+ sig { returns(T.class_of(Checkoff::ViewSubcommand)) }
8666
+ def class_under_test; end
8667
+
8668
+ sig { void }
8669
+ def respond_like_instance_of; end
8670
+
8671
+ sig { void }
8672
+ def respond_like; end
8637
8673
  end
8638
8674
 
8639
8675
  class TestLogging < Minitest::Test
@@ -8953,6 +8989,12 @@ class TestSearchUrlParser < ClassTest
8953
8989
  sig { returns(Checkoff::Internal::SearchUrl::Parser) }
8954
8990
  def get_test_object; end
8955
8991
 
8992
+ # Ruby 3.4+ Hash#inspect inserts spaces around =>; normalize for assertions.
8993
+ #
8994
+ # _@param_ `message`
8995
+ sig { params(message: String).returns(String) }
8996
+ def normalize_error_message(message); end
8997
+
8956
8998
  sig { void }
8957
8999
  def test_convert_params_1; end
8958
9000
 
@@ -9099,12 +9141,6 @@ class TestSearchUrlParser < ClassTest
9099
9141
 
9100
9142
  sig { returns(T.class_of(Checkoff::Internal::SearchUrl::Parser)) }
9101
9143
  def class_under_test; end
9102
-
9103
- # Ruby 3.4+ Hash#inspect inserts spaces around =>; normalize for assertions.
9104
- #
9105
- # _@param_ `message`
9106
- sig { params(message: String).returns(String) }
9107
- def normalize_error_message(message); end
9108
9144
  end
9109
9145
 
9110
9146
  class TestAsanaEventFilter < ClassTest
@@ -9247,38 +9283,3 @@ class TestAsanaEventFilter < ClassTest
9247
9283
  sig { void }
9248
9284
  def respond_like; end
9249
9285
  end
9250
-
9251
- # Test the Checkoff::ViewSubcommand class used in CLI processing
9252
- class TestViewSubcommand < ClassTest
9253
- extend Forwardable
9254
-
9255
- sig { returns(String) }
9256
- def task_name; end
9257
-
9258
- sig { returns(String) }
9259
- def due_at_value; end
9260
-
9261
- sig { void }
9262
- def expect_task_lookup; end
9263
-
9264
- sig { void }
9265
- def stub_task_due_fields; end
9266
-
9267
- sig { void }
9268
- def test_run_on_task; end
9269
-
9270
- sig { void }
9271
- def test_run_on_task_not_found; end
9272
-
9273
- sig { params(clazz: T.untyped).returns(Checkoff::ViewSubcommand) }
9274
- def create_object(clazz = class_under_test); end
9275
-
9276
- sig { returns(T.class_of(Checkoff::ViewSubcommand)) }
9277
- def class_under_test; end
9278
-
9279
- sig { void }
9280
- def respond_like_instance_of; end
9281
-
9282
- sig { void }
9283
- def respond_like; end
9284
- end
data/sig/checkoff.rbs CHANGED
@@ -499,6 +499,7 @@ module Checkoff
499
499
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
500
500
  # True if the task is in a project which is in the given portfolio
501
501
  #
502
+ # CI quality (pipeline 1902): "in_portfolio_named? return type could not be inferred".
502
503
  # @sg-ignore
503
504
  #
504
505
  # _@param_ `task`
@@ -727,7 +728,7 @@ module Checkoff
727
728
  def now_or_before?: ((Date | Time)? date_or_time) -> bool
728
729
 
729
730
  # _@param_ `num_days`
730
- def n_days_from_now: (Integer num_days) -> Time
731
+ def n_days_from_now: (Integer num_days) -> ActiveSupport::TimeWithZone
731
732
 
732
733
  # @sg-ignore
733
734
  #
@@ -1424,16 +1425,12 @@ module Checkoff
1424
1425
  def task_dependent_on_previous_section_last_milestone?: (Asana::Resources::Task task, ?limit_to_portfolio_gid: String?) -> bool
1425
1426
 
1426
1427
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
1427
- # @sg-ignore
1428
- #
1429
1428
  # _@param_ `task`
1430
1429
  #
1431
1430
  # _@param_ `limit_to_portfolio_name`
1432
1431
  def last_task_milestone_depends_on_this_task?: (Asana::Resources::Task task, ?limit_to_portfolio_name: String?) -> bool
1433
1432
 
1434
1433
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
1435
- # @sg-ignore
1436
- #
1437
1434
  # _@param_ `task`
1438
1435
  #
1439
1436
  # _@param_ `limit_to_portfolio_name`
@@ -2937,6 +2934,9 @@ module Checkoff
2937
2934
  def matches?: () -> bool
2938
2935
 
2939
2936
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
2937
+ # CI quality (pipeline 1902): "return type could not be inferred" on modified lines
2938
+ # after 7eeb5b1 removed @sg-ignore. Local overcommit may report "Unneeded @sg-ignore";
2939
+ # `== true` alone did not satisfy the CI overcommit Solargraph hook.
2940
2940
  # @sg-ignore
2941
2941
  #
2942
2942
  # _@param_ `task`
@@ -2950,6 +2950,7 @@ module Checkoff
2950
2950
  def matches?: () -> bool
2951
2951
 
2952
2952
  # sord warn - Asana::Resources::Task wasn't able to be resolved to a constant in this project
2953
+ # Same CI/local Solargraph drift as UnassignedPFunctionEvaluator#evaluate (pipeline 1902).
2953
2954
  # @sg-ignore
2954
2955
  #
2955
2956
  # _@param_ `task`
@@ -3078,13 +3079,13 @@ module Checkoff
3078
3079
  **::Hash[untyped, untyped] _kwargs
3079
3080
  ) -> void
3080
3081
 
3081
- attr_reader selector: [Symbol, ::Array[untyped]]
3082
-
3083
3082
  attr_reader tasks: Checkoff::Tasks
3084
3083
 
3085
3084
  attr_reader timelines: Checkoff::Timelines
3086
3085
 
3087
3086
  attr_reader custom_fields: Checkoff::CustomFields
3087
+
3088
+ attr_reader selector: [Symbol, ::Array[untyped]]
3088
3089
  end
3089
3090
  end
3090
3091
 
@@ -3839,6 +3840,12 @@ class TestTasks < BaseAsana
3839
3840
 
3840
3841
  def test_in_portfolio_more_than_once: () -> void
3841
3842
 
3843
+ def test_in_portfolio_more_than_once_true: () -> void
3844
+
3845
+ def test_gid_for_task: () -> void
3846
+
3847
+ def test_gid_for_task_not_found: () -> void
3848
+
3842
3849
  def test_task_to_h_delegates: () -> untyped
3843
3850
 
3844
3851
  def expect_default_workspace_name_pulled: () -> void
@@ -3866,12 +3873,6 @@ class TestTasks < BaseAsana
3866
3873
  def test_as_cache_key: () -> void
3867
3874
 
3868
3875
  def class_under_test: () -> void
3869
-
3870
- def test_in_portfolio_more_than_once_true: () -> void
3871
-
3872
- def test_gid_for_task: () -> void
3873
-
3874
- def test_gid_for_task_not_found: () -> void
3875
3876
  end
3876
3877
 
3877
3878
  # Test the Checkoff::CLI class with mv subcommand
@@ -4351,15 +4352,15 @@ class TestTimelines < ClassTest
4351
4352
 
4352
4353
  def test_init: () -> void
4353
4354
 
4355
+ def test_any_milestone_depends_on_this_task_false: () -> void
4356
+
4357
+ def test_any_milestone_depends_on_this_task_true: () -> void
4358
+
4354
4359
  def class_under_test: () -> void
4355
4360
 
4356
4361
  def respond_like_instance_of: () -> void
4357
4362
 
4358
4363
  def respond_like: () -> void
4359
-
4360
- def test_any_milestone_depends_on_this_task_false: () -> void
4361
-
4362
- def test_any_milestone_depends_on_this_task_true: () -> void
4363
4364
  end
4364
4365
 
4365
4366
  class TestPortfolios < ClassTest
@@ -4421,12 +4422,6 @@ class TestAttachments < ClassTest
4421
4422
 
4422
4423
  def test_create_attachment_from_url: () -> void
4423
4424
 
4424
- def class_under_test: () -> void
4425
-
4426
- def respond_like_instance_of: () -> void
4427
-
4428
- def respond_like: () -> void
4429
-
4430
4425
  # _@param_ `gid`
4431
4426
  #
4432
4427
  # _@param_ `url`
@@ -4435,6 +4430,12 @@ class TestAttachments < ClassTest
4435
4430
  def capture_attachments_run: () -> String
4436
4431
 
4437
4432
  def test_run: () -> void
4433
+
4434
+ def class_under_test: () -> void
4435
+
4436
+ def respond_like_instance_of: () -> void
4437
+
4438
+ def respond_like: () -> void
4438
4439
  end
4439
4440
 
4440
4441
  # double to inject cache_method, pretending to be cache_method gem
@@ -4636,18 +4637,18 @@ class TestTaskSearches < ClassTest
4636
4637
 
4637
4638
  def test_as_cache_key: () -> void
4638
4639
 
4639
- def class_under_test: () -> void
4640
-
4641
- def respond_like_instance_of: () -> void
4642
-
4643
- def respond_like: () -> void
4644
-
4645
4640
  def test_raw_task_search_without_selector: () -> void
4646
4641
 
4647
4642
  # _@param_ `task_searches`
4648
4643
  def mock_full_page_raw_task_search: (Checkoff::TaskSearches task_searches) -> ::Array[untyped]
4649
4644
 
4650
4645
  def test_raw_task_search_paginates_when_full_page: () -> void
4646
+
4647
+ def class_under_test: () -> void
4648
+
4649
+ def respond_like_instance_of: () -> void
4650
+
4651
+ def respond_like: () -> void
4651
4652
  end
4652
4653
 
4653
4654
  # rubocop:disable Metrics/ClassLength
@@ -4809,6 +4810,10 @@ class TestTaskSelectors < ClassTest
4809
4810
 
4810
4811
  def test_filter_via_task_selector_in_project_named_true: () -> untyped
4811
4812
 
4813
+ def test_filter_via_task_selector_in_section_named_false: () -> untyped
4814
+
4815
+ def test_filter_via_task_selector_in_section_named_true: () -> untyped
4816
+
4812
4817
  def test_dependent_on_previous_section_last_milestone: () -> untyped
4813
4818
 
4814
4819
  def test_in_portfolio_named_true: () -> untyped
@@ -4819,12 +4824,6 @@ class TestTaskSelectors < ClassTest
4819
4824
 
4820
4825
  def test_last_task_milestone_does_not_depend_on_this_task: () -> void
4821
4826
 
4822
- def respond_like_instance_of: () -> void
4823
-
4824
- def respond_like: () -> void
4825
-
4826
- def class_under_test: () -> singleton(Checkoff::TaskSelectors)
4827
-
4828
4827
  def test_in_a_real_project_true: () -> void
4829
4828
 
4830
4829
  def test_in_a_real_project_false_only_my_tasks: () -> void
@@ -4841,9 +4840,36 @@ class TestTaskSelectors < ClassTest
4841
4840
 
4842
4841
  def test_no_milestone_depends_on_this_task_true: () -> void
4843
4842
 
4844
- def test_filter_via_task_selector_in_section_named_false: () -> untyped
4843
+ def respond_like_instance_of: () -> void
4845
4844
 
4846
- def test_filter_via_task_selector_in_section_named_true: () -> untyped
4845
+ def respond_like: () -> void
4846
+
4847
+ def class_under_test: () -> singleton(Checkoff::TaskSelectors)
4848
+ end
4849
+
4850
+ # Test the Checkoff::ViewSubcommand class used in CLI processing
4851
+ class TestViewSubcommand < ClassTest
4852
+ extend Forwardable
4853
+
4854
+ def task_name: () -> String
4855
+
4856
+ def due_at_value: () -> String
4857
+
4858
+ def expect_task_lookup: () -> void
4859
+
4860
+ def stub_task_due_fields: () -> void
4861
+
4862
+ def test_run_on_task: () -> void
4863
+
4864
+ def test_run_on_task_not_found: () -> void
4865
+
4866
+ def create_object: (?untyped clazz) -> Checkoff::ViewSubcommand
4867
+
4868
+ def class_under_test: () -> singleton(Checkoff::ViewSubcommand)
4869
+
4870
+ def respond_like_instance_of: () -> void
4871
+
4872
+ def respond_like: () -> void
4847
4873
  end
4848
4874
 
4849
4875
  class TestLogging < Minitest::Test
@@ -4994,6 +5020,11 @@ end
4994
5020
  class TestSearchUrlParser < ClassTest
4995
5021
  def get_test_object: () -> Checkoff::Internal::SearchUrl::Parser
4996
5022
 
5023
+ # Ruby 3.4+ Hash#inspect inserts spaces around =>; normalize for assertions.
5024
+ #
5025
+ # _@param_ `message`
5026
+ def normalize_error_message: (String message) -> String
5027
+
4997
5028
  def test_convert_params_1: () -> void
4998
5029
 
4999
5030
  def test_convert_params_2: () -> void
@@ -5091,11 +5122,6 @@ class TestSearchUrlParser < ClassTest
5091
5122
  def test_convert_params_48: () -> void
5092
5123
 
5093
5124
  def class_under_test: () -> singleton(Checkoff::Internal::SearchUrl::Parser)
5094
-
5095
- # Ruby 3.4+ Hash#inspect inserts spaces around =>; normalize for assertions.
5096
- #
5097
- # _@param_ `message`
5098
- def normalize_error_message: (String message) -> String
5099
5125
  end
5100
5126
 
5101
5127
  class TestAsanaEventFilter < ClassTest
@@ -5134,30 +5160,5 @@ class TestAsanaEventFilter < ClassTest
5134
5160
 
5135
5161
  def respond_like_instance_of: () -> void
5136
5162
 
5137
- def respond_like: () -> void
5138
- end
5139
-
5140
- # Test the Checkoff::ViewSubcommand class used in CLI processing
5141
- class TestViewSubcommand < ClassTest
5142
- extend Forwardable
5143
-
5144
- def task_name: () -> String
5145
-
5146
- def due_at_value: () -> String
5147
-
5148
- def expect_task_lookup: () -> void
5149
-
5150
- def stub_task_due_fields: () -> void
5151
-
5152
- def test_run_on_task: () -> void
5153
-
5154
- def test_run_on_task_not_found: () -> void
5155
-
5156
- def create_object: (?untyped clazz) -> Checkoff::ViewSubcommand
5157
-
5158
- def class_under_test: () -> singleton(Checkoff::ViewSubcommand)
5159
-
5160
- def respond_like_instance_of: () -> void
5161
-
5162
5163
  def respond_like: () -> void
5163
5164
  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.245.0
4
+ version: 0.247.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: 2026-05-24 00:00:00.000000000 Z
11
+ date: 2026-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport