checkoff 0.221.0 → 0.222.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: 852a3ff26e52a45c94de5254c46b9295965f1f666ce46079710ef8dc122f9e41
4
- data.tar.gz: 77522c0a820d2f619f70cfabbe59965c1aa5a125c99ed398a56fca62413fb97a
3
+ metadata.gz: cddefb59c6b268a9501c151a8c5482baedc1626ff56090a02bacd09a34e4f530
4
+ data.tar.gz: 733b5e95bab3a468e4fbe54e8215c70bd4d1094e48464b25e04053d29023653e
5
5
  SHA512:
6
- metadata.gz: 57d780efb0d8189698a948695daf6d3f014331b3133b6f487619d024baa18f5318ce0cf11ee78cdffbd528367093830e48b553bcccd29cfba45ed8679f8325d6
7
- data.tar.gz: 54c25e37cb80b3015c1b92e99740e4b7d00ebad595cb6fa74add99d6d2eff06ffc36933a3b4ae4d207efef96df4cd988a0ca9e1c3fcdea24850e43bb777b655f
6
+ metadata.gz: 21d8c9e39760f92e503efbcd98707a3935dffb077677f92e7165767cd7c305673a27810f75bd8640fe79bd6ffc1cd5f616e4787234d9ac4c84ddf4008be344d9
7
+ data.tar.gz: 2d6aaadfd50a74cccca45efe6ccf866e4da393f2a70bac001e7afbc912acf071a95e765de2f4ee4fb67dbf515e46db61f01c4ddb2ad507dd34e4cb213885b9fc
data/.rubocop_todo.yml CHANGED
@@ -80,12 +80,11 @@ Performance/RedundantEqualityComparisonBlock:
80
80
  Exclude:
81
81
  - 'lib/checkoff/internal/selector_classes/task.rb'
82
82
 
83
- # Offense count: 13
83
+ # Offense count: 10
84
84
  # Configuration parameters: RequireForNonPublicMethods.
85
85
  Style/DocumentationMethod:
86
86
  Exclude:
87
87
  - 'spec/**/*'
88
88
  - 'test/**/*'
89
89
  - 'lib/checkoff/cli.rb'
90
- - 'lib/checkoff/clients.rb'
91
90
  - 'lib/checkoff/tags.rb'
data/Gemfile.lock CHANGED
@@ -43,7 +43,7 @@ GIT
43
43
  PATH
44
44
  remote: .
45
45
  specs:
46
- checkoff (0.221.0)
46
+ checkoff (0.222.0)
47
47
  activesupport
48
48
  asana (> 0.10.0)
49
49
  cache_method
@@ -1,34 +1,8 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
  #
3
4
  # rubocop:disable Layout/LineLength
4
5
  # @!parse
5
- # module OpenSSL
6
- # module SSL
7
- # # @type [Integer]
8
- # VERIFY_PEER = 1
9
- # # @type [Integer]
10
- # VERIFY_NONE = 0
11
- # end
12
- # end
13
- # class Time
14
- # class << self
15
- # # @param time [String]
16
- # # @return [Time]
17
- # def parse(time); end
18
- # end
19
- # # https://ruby-doc.org/3.2.2/exts/date/Time.html#method-i-to_date#
20
- # # @return [Date]
21
- # def to_date; end
22
- # end
23
- # class Date
24
- # class << self
25
- # # @param date [String]
26
- # # @return [Date]
27
- # def parse(date); end
28
- # # @return [Date]
29
- # def today; end
30
- # end
31
- # end
32
6
  # module Asana
33
7
  # class Client
34
8
  # # @return [Asana::ProxiedResourceClasses::Task]
@@ -48,7 +22,6 @@
48
22
  # # @return [Asana::ProxiedResourceClasses::CustomField]
49
23
  # def custom_fields; end
50
24
  # end
51
- # class Collection < Asana::Resources::Collection; end
52
25
  # module Resources
53
26
  # # https://developers.asana.com/reference/gettask
54
27
  # class Task
@@ -69,6 +42,10 @@
69
42
  # # @return [Array<Hash{String => Hash{String => String}}>]
70
43
  # def memberships; end
71
44
  # class << self
45
+ # # @param client [Asana::Client]
46
+ # # @param assignee [String]
47
+ # # @param workspace [String]
48
+ # # @param name [String]
72
49
  # # @return [Asana::Resources::Task]
73
50
  # def create(client, assignee:, workspace:, name:); end
74
51
  # end
@@ -84,18 +61,22 @@
84
61
  # def due_date; end
85
62
  # end
86
63
  # class Portfolio
64
+ # # @param options [Hash] the request I/O options
87
65
  # # @return [Enumerable<Asana::Resources::Project>]
88
66
  # def get_items(options = {}); end
89
67
  # end
90
68
  # end
91
69
  # module Errors
92
- # class NotFound < StandardError; end
70
+ # class NotFound < ::Asana::Errors::APIError; end
93
71
  # end
94
72
  # module Resources
95
73
  # class Workspace
96
74
  # # @return [String, nil]
97
75
  # def html_notes; end
98
76
  # class << self
77
+ # # @param client [Asana::Client]
78
+ # # @param id [String]
79
+ # # @param options [Hash]
99
80
  # # @return [Asana::Resources::Workspace]
100
81
  # def find_by_id(client, id, options: {}); end
101
82
  # end
@@ -136,9 +117,9 @@
136
117
  # # @param assignee [String] The assignee to filter tasks on.
137
118
  # # @param workspace [String] The workspace or organization to filter tasks on.
138
119
  # # @param project [String] The project to filter tasks on.
139
- # # @param section [Gid] The section to filter tasks on.
140
- # # @param tag [Gid] The tag to filter tasks on.
141
- # # @param user_task_list [Gid] The user task list to filter tasks on.
120
+ # # @param section [String] The section to filter tasks on.
121
+ # # @param tag [String] The tag to filter tasks on.
122
+ # # @param user_task_list [String] The user task list to filter tasks on.
142
123
  # # @param completed_since [String] Only return tasks that are either incomplete or that have been
143
124
  # # completed since this time.
144
125
  # #
@@ -164,7 +145,14 @@
164
145
  # def find_all(assignee: nil, workspace: nil, project: nil, section: nil,
165
146
  # tag: nil, user_task_list: nil, completed_since: nil,
166
147
  # modified_since: nil, per_page: 20, options: {}); end
167
- # # @param section [Asana::Resources::section]
148
+ # # @param assignee [String]
149
+ # # @param project [String]
150
+ # # @param section [String]
151
+ # # @param workspace [String]
152
+ # # @param completed_since [Time]
153
+ # # @param per_page [Integer]
154
+ # # @param modified_since [Time]
155
+ # # @param section [Asana::Resources::Section]
168
156
  # # @param options [Hash] the request I/O options.
169
157
  # # @return [Enumerable<Asana::Resources::Task>]
170
158
  # def get_tasks(assignee: nil,
@@ -182,6 +170,7 @@
182
170
  # end
183
171
  # class Section
184
172
  # # @param project_gid [String]
173
+ # # @param options [Hash]
185
174
  # # @return [Enumerable<Asana::Resources::Section>]
186
175
  # def get_sections_for_project(project_gid:, options: {}); end
187
176
  # # Returns the complete record for a single section.
@@ -194,13 +183,14 @@
194
183
  # class Project
195
184
  # # Returns the compact project records for all projects in the workspace.
196
185
  # #
197
- # # @param workspace [Strin] The workspace or organization to find projects in.
186
+ # # @param workspace [String] The workspace or organization to find projects in.
198
187
  # # @param is_template [Boolean] **Note: This parameter can only be included if a team is also defined, or the workspace is not an organization**
199
188
  # # Filters results to include only template projects.
200
189
  # #
201
190
  # # @param archived [Boolean] Only return projects whose `archived` field takes on the value of
202
191
  # # this parameter.
203
192
  # #
193
+ # # @param client [Asana::Client]
204
194
  # # @param per_page [Integer] the number of records to fetch per page.
205
195
  # # @param options [Hash] the request I/O options.
206
196
  # # @return [Enumerable<Asana::Resources::Project>]
@@ -217,14 +207,14 @@
217
207
  # # @param workspace [String] (required) The workspace in which to get the user task list.
218
208
  # # @param options [Hash] the request I/O options
219
209
  # # @return [Asana::Resources::UserTaskList]
220
- # def get_user_task_list_for_user(client, user_gid:,
210
+ # def get_user_task_list_for_user(user_gid:,
221
211
  # workspace: nil, options: {}); end
222
212
  # end
223
213
  # class Portfolio
224
214
  # # Returns a list of the portfolios in compact representation that are owned
225
215
  # # by the current API user.
226
216
  # #
227
- # # @param workspace [Gid] The workspace or organization to filter portfolios on.
217
+ # # @param workspace [String] The workspace or organization to filter portfolios on.
228
218
  # # @param owner [String] The user who owns the portfolio. Currently, API users can only get a
229
219
  # # list of portfolios that they themselves own.
230
220
  # #
@@ -235,11 +225,11 @@
235
225
  # def find_all(workspace: required("workspace"), owner: required("owner"), per_page: 20, options: {}); end
236
226
  # # Returns the complete record for a single portfolio.
237
227
  # #
238
- # # @param id [Gid] The portfolio to get.
228
+ # # @param id [String] The portfolio to get.
239
229
  # # @param options [Hash] the request I/O options.
240
230
  #
241
231
  # # @return [Asana::Resources::Portfolio,nil]
242
- # def find_by_id(client, id, options: {}); end
232
+ # def find_by_id(id, options: {}); end
243
233
  # # Get portfolio items
244
234
  # #
245
235
  # # @param portfolio_gid [String] (required) Globally unique identifier for the portfolio.
@@ -258,4 +248,7 @@
258
248
  # end
259
249
  # end
260
250
  # end
251
+ # module Asana
252
+ # include ::Asana::Resources
253
+ # end
261
254
  # rubocop:enable Layout/LineLength
@@ -1,3 +1,4 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
3
4
  #
@@ -19,7 +20,7 @@
19
20
  # # @param key [String]
20
21
  # # @param default [Object]
21
22
  # #
22
- # # @return [String,Symbol<:none>,nil]
23
+ # # @return [String,:none,nil]
23
24
  # def self.fetch(key, default = :none); end
24
25
  # # @param key [String]
25
26
  # #
@@ -34,3 +35,34 @@
34
35
  # def require(*groups); end
35
36
  # end
36
37
  # end
38
+ # module OpenSSL
39
+ # module SSL
40
+ # # @type [Integer]
41
+ # VERIFY_PEER = 1
42
+ # # @type [Integer]
43
+ # VERIFY_NONE = 0
44
+ # end
45
+ # end
46
+ # class Time
47
+ # class << self
48
+ # # @param time [String]
49
+ # # @param now [nil,Time]
50
+ # # @return [Time]
51
+ # def parse(time, now=nil); end
52
+ # end
53
+ # # https://ruby-doc.org/3.2.2/exts/date/Time.html#method-i-to_date#
54
+ # # @return [Date]
55
+ # def to_date; end
56
+ # end
57
+ # class Date
58
+ # class << self
59
+ # # @param date [String]
60
+ # # @param comp [Boolean]
61
+ # # @param state [Object]
62
+ # # @return [Date]
63
+ # def parse(date='-4712-01-01', comp=true, state=Date::ITALY); end
64
+ # # @param start [Integer]
65
+ # # @return [Date]
66
+ # def today(start=Date::ITALY); end
67
+ # end
68
+ # end
@@ -56,7 +56,7 @@ module Checkoff
56
56
  # @param resource [Asana::Resources::Resource]
57
57
  # @param attachment_name [String,nil]
58
58
  # @param just_the_url [Boolean]
59
- # @param verify_mode [Integer<OpenSSL::SSL::VERIFY_NONE,OpenSSL::SSL::VERIFY_PEER>]
59
+ # @param verify_mode [Integer] - e.g., OpenSSL::SSL::VERIFY_NONE or OpenSSL::SSL::VERIFY_PEER
60
60
  #
61
61
  # @return [Asana::Resources::Attachment]
62
62
  def create_attachment_from_url!(url,
@@ -79,7 +79,7 @@ module Checkoff
79
79
  # not succesful
80
80
  #
81
81
  # @param uri [URI]
82
- # @param verify_mode [OpenSSL::SSL::VERIFY_NONE,OpenSSL::SSL::VERIFY_PEER]
82
+ # @param verify_mode [Integer] - e.g., OpenSSL::SSL::VERIFY_NONE,OpenSSL::SSL::VERIFY_PEER
83
83
  #
84
84
  # @return [Object]
85
85
  # @sg-ignore
@@ -121,7 +121,7 @@ module Checkoff
121
121
  # @param url [String]
122
122
  # @param resource [Asana::Resources::Resource]
123
123
  # @param attachment_name [String,nil]
124
- # @param verify_mode [Integer<OpenSSL::SSL::VERIFY_NONE,OpenSSL::SSL::VERIFY_PEER>]
124
+ # @param verify_mode [Integer] - e.g., OpenSSL::SSL::VERIFY_NONE,OpenSSL::SSL::VERIFY_PEER
125
125
  #
126
126
  # @return [Asana::Resources::Attachment]
127
127
  def create_attachment_from_downloaded_url!(url, resource, attachment_name:,
@@ -141,7 +141,7 @@ module Checkoff
141
141
  # @param resource [Asana::Resources::Resource]
142
142
  # @param attachment_name [String,nil]
143
143
  #
144
- # @return [Asana::Resources::Attachment,nil]
144
+ # @return [Asana::Resources::Attachment]
145
145
  def create_attachment_from_url_alone!(url, resource, attachment_name:)
146
146
  with_params = {
147
147
  'parent' => resource.gid,
data/lib/checkoff/cli.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # typed: ignore
2
3
 
3
4
  # frozen_string_literal: true
4
5
 
@@ -222,7 +223,7 @@ module Checkoff
222
223
 
223
224
  # Provide ability for CLI to pull Asana items
224
225
  class CheckoffGLIApp
225
- extend GLI::App
226
+ extend ::GLI::App
226
227
 
227
228
  program_desc 'Command-line client for Asana (unofficial)'
228
229
 
@@ -18,6 +18,8 @@ module Checkoff
18
18
  LONG_CACHE_TIME = MINUTE * 15
19
19
  SHORT_CACHE_TIME = MINUTE
20
20
 
21
+ # @param config [Hash]
22
+ # @param asana_client_class [Class<Asana::Client>]
21
23
  def initialize(config: Checkoff::Internal::ConfigLoader.load(:asana),
22
24
  asana_client_class: Asana::Client)
23
25
  @config = config
@@ -33,13 +35,10 @@ module Checkoff
33
35
  end
34
36
  end
35
37
 
36
- private
37
-
38
- attr_reader :workspaces
39
-
40
38
  # bundle exec ./clients.rb
41
39
  # :nocov:
42
40
  class << self
41
+ # @return [void]
43
42
  def run
44
43
  clients = Checkoff::Clients.new
45
44
  client = clients.client
@@ -143,15 +143,18 @@ module Checkoff
143
143
 
144
144
  private
145
145
 
146
+ # @param custom_field [Hash{String => [Hash,Array<Hash>]}]
147
+ #
146
148
  # @sg-ignore
147
- # @param custom_field [Hash]
148
- # @return [Array<String>]
149
+ # @return [Array<Hash>]
149
150
  def resource_custom_field_enum_values(custom_field)
150
151
  resource_subtype = custom_field.fetch('resource_subtype')
151
152
  case resource_subtype
152
153
  when 'enum'
154
+ # @type [Array<Hash>]
153
155
  [custom_field.fetch('enum_value')]
154
156
  when 'multi_enum'
157
+ # @type [Array<Hash>]
155
158
  custom_field.fetch('multi_enum_values')
156
159
  else
157
160
  raise "Teach me how to handle resource_subtype #{resource_subtype}"
@@ -159,7 +162,7 @@ module Checkoff
159
162
  end
160
163
 
161
164
  # @param custom_field [Hash]
162
- # @param enum_value [Object, nil]
165
+ # @param enum_value [Hash{String => String}, nil]
163
166
  # @return [Array<String>]
164
167
  def find_gids(custom_field, enum_value)
165
168
  if enum_value.nil?
@@ -9,7 +9,7 @@ module Checkoff
9
9
  def initialize(_deps = {}); end
10
10
 
11
11
  # @param project_obj [Asana::Resources::Project]
12
- # @param project [String, Symbol<:not_specified, :my_tasks>]
12
+ # @param project [String, Symbol] - :not_specified, :my_tasks
13
13
  #
14
14
  # @return [Hash]
15
15
  def project_to_h(project_obj, project: :not_specified)
@@ -30,7 +30,7 @@ module Checkoff
30
30
  end
31
31
 
32
32
  # @param project [Asana::Resources::Project]
33
- # @param period [Symbol<:now_or_before,:this_week>]
33
+ # @param period [Symbol] - :now_or_before or :this_week
34
34
  # @return [Boolean]
35
35
  def evaluate(project, period = :now_or_before)
36
36
  @projects.project_ready?(project, period: period)
@@ -154,7 +154,7 @@ module Checkoff
154
154
  end
155
155
 
156
156
  # @param task [Asana::Resources::Task]
157
- # @param period [Symbol<:now_or_before,:this_week>]
157
+ # @param period [Symbol] - :now_or_before or :this_week
158
158
  # @param ignore_dependencies [Boolean]
159
159
  # @return [Boolean]
160
160
  # rubocop:disable Style/OptionalBooleanParameter
@@ -66,7 +66,7 @@ module Checkoff
66
66
  # @param extra_fields [Array<String>]
67
67
  # @param [Boolean] only_uncompleted
68
68
  #
69
- # @return [Hash<Symbol, Object>]
69
+ # @return [Hash{Symbol => Object}]
70
70
  def task_options(extra_fields: [], only_uncompleted: false)
71
71
  options = {
72
72
  per_page: 100,
@@ -96,7 +96,7 @@ module Checkoff
96
96
 
97
97
  # pulls an Asana API project class given a name
98
98
  # @param [String] workspace_name
99
- # @param [String,Symbol<:my_tasks>] project_name
99
+ # @param [String,Symbol] project_name - :my_tasks or a project name
100
100
  # @param [Array<String>] extra_fields
101
101
  #
102
102
  # @return [Asana::Resources::Project, nil]
@@ -115,7 +115,7 @@ module Checkoff
115
115
  cache_method :project, REALLY_LONG_CACHE_TIME
116
116
 
117
117
  # @param workspace_name [String]
118
- # @param project_name [String,Symbol<:my_tasks>]
118
+ # @param project_name [String,Symbol] - :my_tasks or a project name
119
119
  # @param [Array<String>] extra_fields
120
120
  #
121
121
  # @return [Asana::Resources::Project]
@@ -195,7 +195,7 @@ module Checkoff
195
195
  cache_method :projects_by_workspace_name, REALLY_LONG_CACHE_TIME
196
196
 
197
197
  # @param project_obj [Asana::Resources::Project]
198
- # @param project [String, Symbol<:not_specified, :my_tasks>]
198
+ # @param project [String, Symbol] - :not_specified, :my_tasks or a project name
199
199
  #
200
200
  # @return [Hash]
201
201
  def project_to_h(project_obj, project: :not_specified)
@@ -210,14 +210,14 @@ module Checkoff
210
210
  # date is today or in the past.
211
211
  #
212
212
  # @param project [Asana::Resources::Project]
213
- # @param period [Symbol<:now_or_before,:this_week>]
213
+ # @param period [Symbol,Array] See Checkoff::Timing#in_period? - :now_or_before,:this_week
214
214
  def project_ready?(project, period: :now_or_before)
215
215
  in_period?(project, :ready, period)
216
216
  end
217
217
 
218
218
  # @param project [Asana::Resources::Project]
219
219
  # @param field_name [Symbol,Array]
220
- # @param period [Symbol<:now_or_before,:this_week>,Array] See Checkoff::Timing#in_period?
220
+ # @param period [Symbol,Array] See Checkoff::Timing#in_period? - :now_or_before,:this_week
221
221
  def in_period?(project, field_name, period)
222
222
  # @type [Date,Time,nil]
223
223
  project_date = project_timing.date_or_time_field_by_name(project, field_name)
data/lib/checkoff/tags.rb CHANGED
@@ -41,12 +41,13 @@ module Checkoff
41
41
 
42
42
  params = build_params(options)
43
43
 
44
- Asana::Collection.new(parse(client.get("/tags/#{tag.gid}/tasks",
45
- params: params, options: options[:options])),
46
- type: Asana::Resources::Task,
47
- client: client)
44
+ Asana::Resources::Collection.new(parse(client.get("/tags/#{tag.gid}/tasks",
45
+ params: params, options: options[:options])),
46
+ type: Asana::Resources::Task,
47
+ client: client)
48
48
  end
49
49
 
50
+ # @return [Asana::Resources::Tag]
50
51
  def tag_or_raise(workspace_name, tag_name)
51
52
  tag = tag(workspace_name, tag_name)
52
53
  raise "Could not find tag #{tag_name} under workspace #{workspace_name}." if tag.nil?
@@ -55,6 +56,7 @@ module Checkoff
55
56
  end
56
57
  cache_method :tag_or_raise, LONG_CACHE_TIME
57
58
 
59
+ # @return [Asana::Resources::Tag,nil]
58
60
  def tag(workspace_name, tag_name)
59
61
  workspace = workspaces.workspace_or_raise(workspace_name)
60
62
  tags = client.tags.get_tags_for_workspace(workspace_gid: workspace.gid)
@@ -82,7 +82,7 @@ module Checkoff
82
82
  #
83
83
  # https://developers.asana.com/reference/searchtasksforworkspace
84
84
  #
85
- # @param [Hash<Symbol, Object>] api_params
85
+ # @param [Hash<String, Object>] api_params
86
86
  # @param [String] workspace_gid
87
87
  # @param [Array<String>] extra_fields
88
88
  # @param [Array] task_selector
@@ -120,7 +120,7 @@ module Checkoff
120
120
  #
121
121
  # https://developers.asana.com/reference/searchtasksforworkspace
122
122
  #
123
- # @param [Hash<Symbol, Object>] api_params
123
+ # @param [Hash<String, Object>] api_params
124
124
  # @param [String] workspace_gid
125
125
  # @param [Array<String>] extra_fields
126
126
  #
@@ -146,7 +146,7 @@ module Checkoff
146
146
  # see sort_by field at
147
147
  # https://developers.asana.com/reference/searchtasksforworkspace
148
148
  #
149
- # @param [Hash<Symbol, Object>] api_params
149
+ # @param [Hash<String, Object>] api_params
150
150
  # @param [String] workspace_gid
151
151
  # @param [String] url
152
152
  # @param [Array<String>] extra_fields
@@ -190,7 +190,7 @@ module Checkoff
190
190
  end
191
191
 
192
192
  # @param [Array<String>] extra_fields
193
- # @return [Hash<Symbol, Object>]
193
+ # @return [Hash<String, Object>]
194
194
  def calculate_api_options(extra_fields)
195
195
  # @type [Hash<Symbol, Object>]
196
196
  all_options = projects.task_options(extra_fields: ['custom_fields'] + extra_fields)
@@ -77,7 +77,7 @@ module Checkoff
77
77
  # * start at is before now
78
78
  #
79
79
  # @param task [Asana::Resources::Task]
80
- # @param period [Symbol<:now_or_before,:this_week>]
80
+ # @param period [Symbol] - :now_or_before or :this_week
81
81
  # @param ignore_dependencies [Boolean]
82
82
  def task_ready?(task, period: :now_or_before, ignore_dependencies: false)
83
83
  return false if !ignore_dependencies && incomplete_dependencies?(task)
@@ -87,7 +87,7 @@ module Checkoff
87
87
 
88
88
  # @param task [Asana::Resources::Task]
89
89
  # @param field_name [Symbol,Array]
90
- # @param period [Symbol<:now_or_before,:this_week>,Array] See Checkoff::Timing#in_period?_
90
+ # @param period [Symbol,Array] :now_or_before, :this_week - See Checkoff::Timing#in_period?_
91
91
  def in_period?(task, field_name, period)
92
92
  # @type [Date,Time,nil]
93
93
  task_date_or_time = task_timing.date_or_time_field_by_name(task, field_name)
@@ -123,6 +123,7 @@ module Checkoff
123
123
  only_uncompleted: true,
124
124
  extra_fields: [])
125
125
  thread_local = Checkoff::Internal::ThreadLocal.new
126
+ # @type [String]
126
127
  task_gid = thread_local.with_thread_local_variable(:suppress_asana_webhook_watch_creation,
127
128
  true) do
128
129
  gid_for_task(workspace_name, project_name, section_name, task_name)
@@ -161,7 +162,6 @@ module Checkoff
161
162
  def task_by_gid(task_gid,
162
163
  extra_fields: [],
163
164
  only_uncompleted: true)
164
- # @type [Hash{Symbol => Object}]
165
165
  all_options = projects.task_options(extra_fields: extra_fields,
166
166
  only_uncompleted: only_uncompleted)
167
167
  # @type [Hash]
@@ -223,17 +223,17 @@ module Checkoff
223
223
  parent_task_gid = parent_task_info.fetch('gid')
224
224
 
225
225
  parent_task = task_by_gid(parent_task_gid, only_uncompleted: false)
226
- parent_task.completed_at.nil?
226
+ T.must(parent_task).completed_at.nil?
227
227
  end
228
228
  end
229
229
 
230
230
  # @param task [Asana::Resources::Task]
231
231
  # @param extra_task_fields [Array<String>]
232
232
  #
233
- # @return [Array<Hash>]
233
+ # @return [Array<Asana::Resources::Task>]
234
234
  def all_dependent_tasks(task, extra_task_fields: [])
235
- # @type [Array<Hash>]
236
- dependent_tasks = T.let([], T::Array[Hash])
235
+ # @type [Array<Asana::Resources::Task>]
236
+ dependent_tasks = T.let([], T::Array[Asana::Resources::Task])
237
237
  # See note above - same applies as does in @dependencies
238
238
  #
239
239
  # @type [Array<Hash>]
@@ -249,7 +249,7 @@ module Checkoff
249
249
  dependent_task = task_by_gid(dependent_task_hash.fetch('gid'),
250
250
  only_uncompleted: true,
251
251
  extra_fields: ['dependents'] + extra_task_fields)
252
- debug { "#{task.name} has dependent task #{dependent_task.name}" }
252
+ debug { "#{task.name} has dependent task #{T.must(dependent_task).name}" }
253
253
  next if dependent_task.nil?
254
254
 
255
255
  dependent_tasks << dependent_task
@@ -343,7 +343,7 @@ module Checkoff
343
343
 
344
344
  # @param workspace_name [String]
345
345
  # @param project_name [String, Symbol]
346
- # @param section_name [String, nil, Symbol<:unspecified>]
346
+ # @param section_name [String, nil, Symbol] - :unspecified
347
347
  # @param only_uncompleted [Boolean]
348
348
  # @param extra_fields [Array<String>]
349
349
  #
@@ -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.221.0'
6
+ VERSION = '0.222.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.221.0
4
+ version: 0.222.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: 2024-12-10 00:00:00.000000000 Z
11
+ date: 2024-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -143,8 +143,8 @@ files:
143
143
  - bin/tapioca
144
144
  - bin/yard
145
145
  - checkoff.gemspec
146
+ - config/annotations_asana.rb
146
147
  - config/annotations_misc.rb
147
- - config/definitions.rb
148
148
  - config/env.1p
149
149
  - docs/.gitignore
150
150
  - docs/cookiecutter_input.json