basecamp-sdk 0.12.0 → 0.14.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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +128 -8
  3. data/lib/basecamp/client.rb +35 -11
  4. data/lib/basecamp/config.rb +69 -0
  5. data/lib/basecamp/error.rb +1 -0
  6. data/lib/basecamp/error_code.rb +1 -0
  7. data/lib/basecamp/exit_code.rb +1 -0
  8. data/lib/basecamp/generated/metadata.json +291 -141
  9. data/lib/basecamp/generated/services/base_service.rb +37 -16
  10. data/lib/basecamp/generated/services/bookmarks_service.rb +5 -4
  11. data/lib/basecamp/generated/services/boosts_service.rb +12 -6
  12. data/lib/basecamp/generated/services/campfires_service.rb +54 -41
  13. data/lib/basecamp/generated/services/cards_service.rb +6 -3
  14. data/lib/basecamp/generated/services/checkins_service.rb +28 -15
  15. data/lib/basecamp/generated/services/client_approvals_service.rb +8 -5
  16. data/lib/basecamp/generated/services/client_correspondences_service.rb +8 -5
  17. data/lib/basecamp/generated/services/client_replies_service.rb +12 -7
  18. data/lib/basecamp/generated/services/cloud_files_service.rb +57 -0
  19. data/lib/basecamp/generated/services/comments_service.rb +6 -3
  20. data/lib/basecamp/generated/services/documents_service.rb +9 -6
  21. data/lib/basecamp/generated/services/drafts_service.rb +5 -4
  22. data/lib/basecamp/generated/services/events_service.rb +6 -3
  23. data/lib/basecamp/generated/services/everything_service.rb +70 -56
  24. data/lib/basecamp/generated/services/folders_service.rb +62 -0
  25. data/lib/basecamp/generated/services/forwards_service.rb +12 -17
  26. data/lib/basecamp/generated/services/gauges_service.rb +12 -7
  27. data/lib/basecamp/generated/services/google_documents_service.rb +61 -0
  28. data/lib/basecamp/generated/services/message_types_service.rb +4 -3
  29. data/lib/basecamp/generated/services/messages_service.rb +6 -4
  30. data/lib/basecamp/generated/services/my_notes_service.rb +1 -1
  31. data/lib/basecamp/generated/services/my_notifications_service.rb +8 -5
  32. data/lib/basecamp/generated/services/people_service.rb +17 -10
  33. data/lib/basecamp/generated/services/projects_service.rb +26 -4
  34. data/lib/basecamp/generated/services/recordings_service.rb +6 -13
  35. data/lib/basecamp/generated/services/reports_service.rb +15 -9
  36. data/lib/basecamp/generated/services/schedules_service.rb +90 -16
  37. data/lib/basecamp/generated/services/search_service.rb +6 -4
  38. data/lib/basecamp/generated/services/templates_service.rb +6 -4
  39. data/lib/basecamp/generated/services/timeline_service.rb +6 -3
  40. data/lib/basecamp/generated/services/timesheets_service.rb +22 -8
  41. data/lib/basecamp/generated/services/todolist_groups_service.rb +7 -4
  42. data/lib/basecamp/generated/services/todolists_service.rb +11 -9
  43. data/lib/basecamp/generated/services/todos_service.rb +6 -14
  44. data/lib/basecamp/generated/services/uploads_service.rb +28 -6
  45. data/lib/basecamp/generated/services/vaults_service.rb +6 -3
  46. data/lib/basecamp/generated/services/webhooks_service.rb +4 -3
  47. data/lib/basecamp/generated/types.rb +603 -139
  48. data/lib/basecamp/http.rb +352 -163
  49. data/lib/basecamp/limit_exceeded_error.rb +22 -0
  50. data/lib/basecamp/list_enumerator.rb +29 -0
  51. data/lib/basecamp/list_meta.rb +44 -0
  52. data/lib/basecamp/services/authorization_service.rb +11 -2
  53. data/lib/basecamp/services/cards_extensions.rb +35 -27
  54. data/lib/basecamp/services/documents_extensions.rb +136 -0
  55. data/lib/basecamp/services/merge_safe.rb +255 -0
  56. data/lib/basecamp/services/schedules_extensions.rb +354 -0
  57. data/lib/basecamp/services/todolists_extensions.rb +274 -0
  58. data/lib/basecamp/services/todos_extensions.rb +22 -6
  59. data/lib/basecamp/validation_error.rb +11 -1
  60. data/lib/basecamp/version.rb +2 -2
  61. data/lib/basecamp.rb +98 -4
  62. data/scripts/generate-metadata.rb +3 -1
  63. data/scripts/generate-services.rb +78 -27
  64. data/scripts/generate-types.rb +4 -2
  65. data/scripts/go_type_spellings.rb +26 -0
  66. metadata +13 -2
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Auto-generated from OpenAPI spec. Do not edit manually.
4
- # Generated: 2026-07-31T15:59:31Z
4
+ # Generated: 2026-08-07T11:12:00Z
5
5
 
6
6
  require "json"
7
7
  require "time"
@@ -217,44 +217,6 @@ module Basecamp
217
217
  end
218
218
  end
219
219
 
220
- # Assignable
221
- class Assignable
222
- include TypeHelpers
223
- attr_accessor :app_url, :assignees, :bucket, :due_on, :id, :parent, :starts_on, :title, :type, :url
224
-
225
- def initialize(data = {})
226
- @app_url = data["app_url"]
227
- @assignees = parse_array(data["assignees"], "Person")
228
- @bucket = parse_type(data["bucket"], "TodoBucket")
229
- @due_on = data["due_on"]
230
- @id = parse_integer(data["id"])
231
- @parent = parse_type(data["parent"], "TodoParent")
232
- @starts_on = data["starts_on"]
233
- @title = data["title"]
234
- @type = data["type"]
235
- @url = data["url"]
236
- end
237
-
238
- def to_h
239
- {
240
- "app_url" => @app_url,
241
- "assignees" => @assignees,
242
- "bucket" => @bucket,
243
- "due_on" => @due_on,
244
- "id" => @id,
245
- "parent" => @parent,
246
- "starts_on" => @starts_on,
247
- "title" => @title,
248
- "type" => @type,
249
- "url" => @url,
250
- }.compact
251
- end
252
-
253
- def to_json(*args)
254
- to_h.to_json(*args)
255
- end
256
- end
257
-
258
220
  # Bookmark
259
221
  class Bookmark
260
222
  include TypeHelpers
@@ -1251,6 +1213,108 @@ module Basecamp
1251
1213
  end
1252
1214
  end
1253
1215
 
1216
+ # CloudFile
1217
+ class CloudFile
1218
+ include TypeHelpers
1219
+ attr_accessor :app_url, :bucket, :created_at, :creator, :description_attachments, :id, :inherits_status, :parent, :service, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :description, :position, :subscription_url
1220
+
1221
+ # @return [Array<Symbol>]
1222
+ def self.required_fields
1223
+ %i[app_url bucket created_at creator description_attachments id inherits_status parent service status title type updated_at url visible_to_clients].freeze
1224
+ end
1225
+
1226
+ def initialize(data = {})
1227
+ @app_url = data["app_url"]
1228
+ @bucket = parse_type(data["bucket"], "TodoBucket")
1229
+ @created_at = parse_datetime(data["created_at"])
1230
+ @creator = parse_type(data["creator"], "Person")
1231
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
1232
+ @id = parse_integer(data["id"])
1233
+ @inherits_status = parse_boolean(data["inherits_status"])
1234
+ @parent = parse_type(data["parent"], "RecordingParent")
1235
+ @service = parse_type(data["service"], "CloudFileService")
1236
+ @status = data["status"]
1237
+ @title = data["title"]
1238
+ @type = data["type"]
1239
+ @updated_at = parse_datetime(data["updated_at"])
1240
+ @url = data["url"]
1241
+ @visible_to_clients = parse_boolean(data["visible_to_clients"])
1242
+ @bookmark_url = data["bookmark_url"]
1243
+ @boosts_count = parse_integer(data["boosts_count"])
1244
+ @boosts_url = data["boosts_url"]
1245
+ @comments_count = parse_integer(data["comments_count"])
1246
+ @comments_url = data["comments_url"]
1247
+ @description = data["description"]
1248
+ @position = parse_integer(data["position"])
1249
+ @subscription_url = data["subscription_url"]
1250
+ end
1251
+
1252
+ def to_h
1253
+ {
1254
+ "app_url" => @app_url,
1255
+ "bucket" => @bucket,
1256
+ "created_at" => @created_at,
1257
+ "creator" => @creator,
1258
+ "description_attachments" => @description_attachments,
1259
+ "id" => @id,
1260
+ "inherits_status" => @inherits_status,
1261
+ "parent" => @parent,
1262
+ "service" => @service,
1263
+ "status" => @status,
1264
+ "title" => @title,
1265
+ "type" => @type,
1266
+ "updated_at" => @updated_at,
1267
+ "url" => @url,
1268
+ "visible_to_clients" => @visible_to_clients,
1269
+ "bookmark_url" => @bookmark_url,
1270
+ "boosts_count" => @boosts_count,
1271
+ "boosts_url" => @boosts_url,
1272
+ "comments_count" => @comments_count,
1273
+ "comments_url" => @comments_url,
1274
+ "description" => @description,
1275
+ "position" => @position,
1276
+ "subscription_url" => @subscription_url,
1277
+ }.compact
1278
+ end
1279
+
1280
+ def to_json(*args)
1281
+ to_h.to_json(*args)
1282
+ end
1283
+ end
1284
+
1285
+ # CloudFileService
1286
+ class CloudFileService
1287
+ include TypeHelpers
1288
+ attr_accessor :code, :example_url, :name, :valid_patterns, :supporting_text
1289
+
1290
+ # @return [Array<Symbol>]
1291
+ def self.required_fields
1292
+ %i[code example_url name valid_patterns].freeze
1293
+ end
1294
+
1295
+ def initialize(data = {})
1296
+ @code = data["code"]
1297
+ @example_url = data["example_url"]
1298
+ @name = data["name"]
1299
+ @valid_patterns = data["valid_patterns"]
1300
+ @supporting_text = data["supporting_text"]
1301
+ end
1302
+
1303
+ def to_h
1304
+ {
1305
+ "code" => @code,
1306
+ "example_url" => @example_url,
1307
+ "name" => @name,
1308
+ "valid_patterns" => @valid_patterns,
1309
+ "supporting_text" => @supporting_text,
1310
+ }.compact
1311
+ end
1312
+
1313
+ def to_json(*args)
1314
+ to_h.to_json(*args)
1315
+ end
1316
+ end
1317
+
1254
1318
  # Comment
1255
1319
  class Comment
1256
1320
  include TypeHelpers
@@ -1490,7 +1554,7 @@ module Basecamp
1490
1554
  @excerpt = data["excerpt"]
1491
1555
  @id = parse_integer(data["id"])
1492
1556
  @parent = data["parent"]
1493
- @scheduled_posting_at = data["scheduled_posting_at"]
1557
+ @scheduled_posting_at = parse_datetime(data["scheduled_posting_at"])
1494
1558
  @title = data["title"]
1495
1559
  @type = data["type"]
1496
1560
  @updated_at = parse_datetime(data["updated_at"])
@@ -1744,6 +1808,102 @@ module Basecamp
1744
1808
  end
1745
1809
  end
1746
1810
 
1811
+ # Folder
1812
+ class Folder
1813
+ include TypeHelpers
1814
+ attr_accessor :bucket_ids, :color, :created_at, :gauges_url, :id, :image_url, :is_emoji_only_name, :name, :star_url, :type, :updated_at, :url
1815
+
1816
+ # @return [Array<Symbol>]
1817
+ def self.required_fields
1818
+ %i[bucket_ids color created_at gauges_url id image_url is_emoji_only_name name star_url type updated_at url].freeze
1819
+ end
1820
+
1821
+ def initialize(data = {})
1822
+ @bucket_ids = data["bucket_ids"]
1823
+ @color = data["color"]
1824
+ @created_at = parse_datetime(data["created_at"])
1825
+ @gauges_url = data["gauges_url"]
1826
+ @id = parse_integer(data["id"])
1827
+ @image_url = data["image_url"]
1828
+ @is_emoji_only_name = parse_boolean(data["is_emoji_only_name"])
1829
+ @name = data["name"]
1830
+ @star_url = data["star_url"]
1831
+ @type = data["type"]
1832
+ @updated_at = parse_datetime(data["updated_at"])
1833
+ @url = data["url"]
1834
+ end
1835
+
1836
+ def to_h
1837
+ {
1838
+ "bucket_ids" => @bucket_ids,
1839
+ "color" => @color,
1840
+ "created_at" => @created_at,
1841
+ "gauges_url" => @gauges_url,
1842
+ "id" => @id,
1843
+ "image_url" => @image_url,
1844
+ "is_emoji_only_name" => @is_emoji_only_name,
1845
+ "name" => @name,
1846
+ "star_url" => @star_url,
1847
+ "type" => @type,
1848
+ "updated_at" => @updated_at,
1849
+ "url" => @url,
1850
+ }.reject { |k, v| v.nil? && !["color", "gauges_url", "image_url"].include?(k) }
1851
+ end
1852
+
1853
+ def to_json(*args)
1854
+ to_h.to_json(*args)
1855
+ end
1856
+ end
1857
+
1858
+ # FolderWithProjects
1859
+ class FolderWithProjects
1860
+ include TypeHelpers
1861
+ attr_accessor :bucket_ids, :color, :created_at, :gauges_url, :id, :image_url, :is_emoji_only_name, :name, :projects, :star_url, :type, :updated_at, :url
1862
+
1863
+ # @return [Array<Symbol>]
1864
+ def self.required_fields
1865
+ %i[bucket_ids color created_at gauges_url id image_url is_emoji_only_name name projects star_url type updated_at url].freeze
1866
+ end
1867
+
1868
+ def initialize(data = {})
1869
+ @bucket_ids = data["bucket_ids"]
1870
+ @color = data["color"]
1871
+ @created_at = parse_datetime(data["created_at"])
1872
+ @gauges_url = data["gauges_url"]
1873
+ @id = parse_integer(data["id"])
1874
+ @image_url = data["image_url"]
1875
+ @is_emoji_only_name = parse_boolean(data["is_emoji_only_name"])
1876
+ @name = data["name"]
1877
+ @projects = parse_array(data["projects"], "Project")
1878
+ @star_url = data["star_url"]
1879
+ @type = data["type"]
1880
+ @updated_at = parse_datetime(data["updated_at"])
1881
+ @url = data["url"]
1882
+ end
1883
+
1884
+ def to_h
1885
+ {
1886
+ "bucket_ids" => @bucket_ids,
1887
+ "color" => @color,
1888
+ "created_at" => @created_at,
1889
+ "gauges_url" => @gauges_url,
1890
+ "id" => @id,
1891
+ "image_url" => @image_url,
1892
+ "is_emoji_only_name" => @is_emoji_only_name,
1893
+ "name" => @name,
1894
+ "projects" => @projects,
1895
+ "star_url" => @star_url,
1896
+ "type" => @type,
1897
+ "updated_at" => @updated_at,
1898
+ "url" => @url,
1899
+ }.reject { |k, v| v.nil? && !["color", "gauges_url", "image_url"].include?(k) }
1900
+ end
1901
+
1902
+ def to_json(*args)
1903
+ to_h.to_json(*args)
1904
+ end
1905
+ end
1906
+
1747
1907
  # Forward
1748
1908
  class Forward
1749
1909
  include TypeHelpers
@@ -2072,33 +2232,67 @@ module Basecamp
2072
2232
  end
2073
2233
  end
2074
2234
 
2075
- # HillChart
2076
- class HillChart
2235
+ # GoogleDocument
2236
+ class GoogleDocument
2077
2237
  include TypeHelpers
2078
- attr_accessor :enabled, :stale, :app_update_url, :app_versions_url, :dots, :updated_at
2238
+ attr_accessor :app_url, :bucket, :created_at, :creator, :description_attachments, :document_type, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :description, :position, :subscription_url
2079
2239
 
2080
2240
  # @return [Array<Symbol>]
2081
2241
  def self.required_fields
2082
- %i[enabled stale].freeze
2242
+ %i[app_url bucket created_at creator description_attachments document_type id inherits_status parent status title type updated_at url visible_to_clients].freeze
2083
2243
  end
2084
2244
 
2085
2245
  def initialize(data = {})
2086
- @enabled = parse_boolean(data["enabled"])
2087
- @stale = parse_boolean(data["stale"])
2088
- @app_update_url = data["app_update_url"]
2089
- @app_versions_url = data["app_versions_url"]
2090
- @dots = parse_array(data["dots"], "HillChartDot")
2246
+ @app_url = data["app_url"]
2247
+ @bucket = parse_type(data["bucket"], "TodoBucket")
2248
+ @created_at = parse_datetime(data["created_at"])
2249
+ @creator = parse_type(data["creator"], "Person")
2250
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
2251
+ @document_type = data["document_type"]
2252
+ @id = parse_integer(data["id"])
2253
+ @inherits_status = parse_boolean(data["inherits_status"])
2254
+ @parent = parse_type(data["parent"], "RecordingParent")
2255
+ @status = data["status"]
2256
+ @title = data["title"]
2257
+ @type = data["type"]
2091
2258
  @updated_at = parse_datetime(data["updated_at"])
2259
+ @url = data["url"]
2260
+ @visible_to_clients = parse_boolean(data["visible_to_clients"])
2261
+ @bookmark_url = data["bookmark_url"]
2262
+ @boosts_count = parse_integer(data["boosts_count"])
2263
+ @boosts_url = data["boosts_url"]
2264
+ @comments_count = parse_integer(data["comments_count"])
2265
+ @comments_url = data["comments_url"]
2266
+ @description = data["description"]
2267
+ @position = parse_integer(data["position"])
2268
+ @subscription_url = data["subscription_url"]
2092
2269
  end
2093
2270
 
2094
2271
  def to_h
2095
2272
  {
2096
- "enabled" => @enabled,
2097
- "stale" => @stale,
2098
- "app_update_url" => @app_update_url,
2099
- "app_versions_url" => @app_versions_url,
2100
- "dots" => @dots,
2273
+ "app_url" => @app_url,
2274
+ "bucket" => @bucket,
2275
+ "created_at" => @created_at,
2276
+ "creator" => @creator,
2277
+ "description_attachments" => @description_attachments,
2278
+ "document_type" => @document_type,
2279
+ "id" => @id,
2280
+ "inherits_status" => @inherits_status,
2281
+ "parent" => @parent,
2282
+ "status" => @status,
2283
+ "title" => @title,
2284
+ "type" => @type,
2101
2285
  "updated_at" => @updated_at,
2286
+ "url" => @url,
2287
+ "visible_to_clients" => @visible_to_clients,
2288
+ "bookmark_url" => @bookmark_url,
2289
+ "boosts_count" => @boosts_count,
2290
+ "boosts_url" => @boosts_url,
2291
+ "comments_count" => @comments_count,
2292
+ "comments_url" => @comments_url,
2293
+ "description" => @description,
2294
+ "position" => @position,
2295
+ "subscription_url" => @subscription_url,
2102
2296
  }.compact
2103
2297
  end
2104
2298
 
@@ -2107,8 +2301,43 @@ module Basecamp
2107
2301
  end
2108
2302
  end
2109
2303
 
2110
- # HillChartDot
2111
- class HillChartDot
2304
+ # HillChart
2305
+ class HillChart
2306
+ include TypeHelpers
2307
+ attr_accessor :enabled, :stale, :app_update_url, :app_versions_url, :dots, :updated_at
2308
+
2309
+ # @return [Array<Symbol>]
2310
+ def self.required_fields
2311
+ %i[enabled stale].freeze
2312
+ end
2313
+
2314
+ def initialize(data = {})
2315
+ @enabled = parse_boolean(data["enabled"])
2316
+ @stale = parse_boolean(data["stale"])
2317
+ @app_update_url = data["app_update_url"]
2318
+ @app_versions_url = data["app_versions_url"]
2319
+ @dots = parse_array(data["dots"], "HillChartDot")
2320
+ @updated_at = parse_datetime(data["updated_at"])
2321
+ end
2322
+
2323
+ def to_h
2324
+ {
2325
+ "enabled" => @enabled,
2326
+ "stale" => @stale,
2327
+ "app_update_url" => @app_update_url,
2328
+ "app_versions_url" => @app_versions_url,
2329
+ "dots" => @dots,
2330
+ "updated_at" => @updated_at,
2331
+ }.compact
2332
+ end
2333
+
2334
+ def to_json(*args)
2335
+ to_h.to_json(*args)
2336
+ end
2337
+ end
2338
+
2339
+ # HillChartDot
2340
+ class HillChartDot
2112
2341
  include TypeHelpers
2113
2342
  attr_accessor :color, :id, :label, :position, :app_url, :url
2114
2343
 
@@ -2541,10 +2770,10 @@ module Basecamp
2541
2770
  @app_url = data["app_url"]
2542
2771
  @content = data["content"]
2543
2772
  @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
2544
- @created_at = data["created_at"]
2773
+ @created_at = parse_datetime(data["created_at"])
2545
2774
  @id = data["id"]
2546
2775
  @type = data["type"]
2547
- @updated_at = data["updated_at"]
2776
+ @updated_at = parse_datetime(data["updated_at"])
2548
2777
  @url = data["url"]
2549
2778
  end
2550
2779
 
@@ -3680,22 +3909,25 @@ module Basecamp
3680
3909
  # ScheduleEntry
3681
3910
  class ScheduleEntry
3682
3911
  include TypeHelpers
3683
- attr_accessor :app_url, :bucket, :created_at, :creator, :description_attachments, :id, :inherits_status, :parent, :status, :summary, :title, :type, :updated_at, :url, :visible_to_clients, :all_day, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :description, :ends_at, :participants, :starts_at, :subscription_url
3912
+ attr_accessor :all_day, :app_url, :bucket, :created_at, :creator, :description_attachments, :ends_at, :id, :inherits_status, :parent, :starts_at, :status, :summary, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :description, :highlighted, :join_url, :participants, :subscription_url
3684
3913
 
3685
3914
  # @return [Array<Symbol>]
3686
3915
  def self.required_fields
3687
- %i[app_url bucket created_at creator description_attachments id inherits_status parent status summary title type updated_at url visible_to_clients].freeze
3916
+ %i[all_day app_url bucket created_at creator description_attachments ends_at id inherits_status parent starts_at status summary title type updated_at url visible_to_clients].freeze
3688
3917
  end
3689
3918
 
3690
3919
  def initialize(data = {})
3920
+ @all_day = parse_boolean(data["all_day"])
3691
3921
  @app_url = data["app_url"]
3692
3922
  @bucket = parse_type(data["bucket"], "TodoBucket")
3693
3923
  @created_at = parse_datetime(data["created_at"])
3694
3924
  @creator = parse_type(data["creator"], "Person")
3695
3925
  @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
3926
+ @ends_at = data["ends_at"]
3696
3927
  @id = parse_integer(data["id"])
3697
3928
  @inherits_status = parse_boolean(data["inherits_status"])
3698
3929
  @parent = parse_type(data["parent"], "RecordingParent")
3930
+ @starts_at = data["starts_at"]
3699
3931
  @status = data["status"]
3700
3932
  @summary = data["summary"]
3701
3933
  @title = data["title"]
@@ -3703,29 +3935,31 @@ module Basecamp
3703
3935
  @updated_at = parse_datetime(data["updated_at"])
3704
3936
  @url = data["url"]
3705
3937
  @visible_to_clients = parse_boolean(data["visible_to_clients"])
3706
- @all_day = parse_boolean(data["all_day"])
3707
3938
  @bookmark_url = data["bookmark_url"]
3708
3939
  @boosts_count = parse_integer(data["boosts_count"])
3709
3940
  @boosts_url = data["boosts_url"]
3710
3941
  @comments_count = parse_integer(data["comments_count"])
3711
3942
  @comments_url = data["comments_url"]
3712
3943
  @description = data["description"]
3713
- @ends_at = data["ends_at"]
3944
+ @highlighted = parse_boolean(data["highlighted"])
3945
+ @join_url = data["join_url"]
3714
3946
  @participants = parse_array(data["participants"], "Person")
3715
- @starts_at = data["starts_at"]
3716
3947
  @subscription_url = data["subscription_url"]
3717
3948
  end
3718
3949
 
3719
3950
  def to_h
3720
3951
  {
3952
+ "all_day" => @all_day,
3721
3953
  "app_url" => @app_url,
3722
3954
  "bucket" => @bucket,
3723
3955
  "created_at" => @created_at,
3724
3956
  "creator" => @creator,
3725
3957
  "description_attachments" => @description_attachments,
3958
+ "ends_at" => @ends_at,
3726
3959
  "id" => @id,
3727
3960
  "inherits_status" => @inherits_status,
3728
3961
  "parent" => @parent,
3962
+ "starts_at" => @starts_at,
3729
3963
  "status" => @status,
3730
3964
  "summary" => @summary,
3731
3965
  "title" => @title,
@@ -3733,16 +3967,15 @@ module Basecamp
3733
3967
  "updated_at" => @updated_at,
3734
3968
  "url" => @url,
3735
3969
  "visible_to_clients" => @visible_to_clients,
3736
- "all_day" => @all_day,
3737
3970
  "bookmark_url" => @bookmark_url,
3738
3971
  "boosts_count" => @boosts_count,
3739
3972
  "boosts_url" => @boosts_url,
3740
3973
  "comments_count" => @comments_count,
3741
3974
  "comments_url" => @comments_url,
3742
3975
  "description" => @description,
3743
- "ends_at" => @ends_at,
3976
+ "highlighted" => @highlighted,
3977
+ "join_url" => @join_url,
3744
3978
  "participants" => @participants,
3745
- "starts_at" => @starts_at,
3746
3979
  "subscription_url" => @subscription_url,
3747
3980
  }.compact
3748
3981
  end
@@ -4331,19 +4564,22 @@ module Basecamp
4331
4564
  # Todolist
4332
4565
  class Todolist
4333
4566
  include TypeHelpers
4334
- attr_accessor :app_url, :bubble_up_url, :bucket, :created_at, :creator, :description_attachments, :id, :inherits_status, :name, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :app_todos_url, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :completed, :completed_ratio, :description, :groups_url, :position, :subscription_url, :todos_url
4567
+ attr_accessor :app_url, :bubble_up_url, :bucket, :color, :comments_app_url, :created_at, :creator, :description, :description_attachments, :id, :inherits_status, :name, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :app_todos_url, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :completed, :completed_ratio, :group_position_url, :groups_url, :position, :subscription_url, :todos_url
4335
4568
 
4336
4569
  # @return [Array<Symbol>]
4337
4570
  def self.required_fields
4338
- %i[app_url bubble_up_url bucket created_at creator description_attachments id inherits_status name parent status title type updated_at url visible_to_clients].freeze
4571
+ %i[app_url bubble_up_url bucket color comments_app_url created_at creator description description_attachments id inherits_status name parent status title type updated_at url visible_to_clients].freeze
4339
4572
  end
4340
4573
 
4341
4574
  def initialize(data = {})
4342
4575
  @app_url = data["app_url"]
4343
4576
  @bubble_up_url = data["bubble_up_url"]
4344
4577
  @bucket = parse_type(data["bucket"], "TodoBucket")
4578
+ @color = data["color"]
4579
+ @comments_app_url = data["comments_app_url"]
4345
4580
  @created_at = parse_datetime(data["created_at"])
4346
4581
  @creator = parse_type(data["creator"], "Person")
4582
+ @description = data["description"]
4347
4583
  @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
4348
4584
  @id = parse_integer(data["id"])
4349
4585
  @inherits_status = parse_boolean(data["inherits_status"])
@@ -4363,7 +4599,7 @@ module Basecamp
4363
4599
  @comments_url = data["comments_url"]
4364
4600
  @completed = parse_boolean(data["completed"])
4365
4601
  @completed_ratio = data["completed_ratio"]
4366
- @description = data["description"]
4602
+ @group_position_url = data["group_position_url"]
4367
4603
  @groups_url = data["groups_url"]
4368
4604
  @position = parse_integer(data["position"])
4369
4605
  @subscription_url = data["subscription_url"]
@@ -4375,8 +4611,11 @@ module Basecamp
4375
4611
  "app_url" => @app_url,
4376
4612
  "bubble_up_url" => @bubble_up_url,
4377
4613
  "bucket" => @bucket,
4614
+ "color" => @color,
4615
+ "comments_app_url" => @comments_app_url,
4378
4616
  "created_at" => @created_at,
4379
4617
  "creator" => @creator,
4618
+ "description" => @description,
4380
4619
  "description_attachments" => @description_attachments,
4381
4620
  "id" => @id,
4382
4621
  "inherits_status" => @inherits_status,
@@ -4396,12 +4635,12 @@ module Basecamp
4396
4635
  "comments_url" => @comments_url,
4397
4636
  "completed" => @completed,
4398
4637
  "completed_ratio" => @completed_ratio,
4399
- "description" => @description,
4638
+ "group_position_url" => @group_position_url,
4400
4639
  "groups_url" => @groups_url,
4401
4640
  "position" => @position,
4402
4641
  "subscription_url" => @subscription_url,
4403
4642
  "todos_url" => @todos_url,
4404
- }.compact
4643
+ }.reject { |k, v| v.nil? && !["color"].include?(k) }
4405
4644
  end
4406
4645
 
4407
4646
  def to_json(*args)
@@ -4409,68 +4648,68 @@ module Basecamp
4409
4648
  end
4410
4649
  end
4411
4650
 
4412
- # TodolistGroup
4413
- class TodolistGroup
4651
+ # Todoset
4652
+ class Todoset
4414
4653
  include TypeHelpers
4415
- attr_accessor :app_url, :bubble_up_url, :bucket, :created_at, :creator, :id, :inherits_status, :name, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :app_todos_url, :bookmark_url, :comments_count, :comments_url, :completed, :completed_ratio, :position, :subscription_url, :todos_url
4654
+ attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :name, :status, :title, :type, :updated_at, :url, :visible_to_clients, :app_todolists_url, :app_todos_url, :bookmark_url, :completed, :completed_loose_todos_count, :completed_ratio, :position, :todolists_count, :todolists_url, :todos_count, :todos_url
4416
4655
 
4417
4656
  # @return [Array<Symbol>]
4418
4657
  def self.required_fields
4419
- %i[app_url bubble_up_url bucket created_at creator id inherits_status name parent status title type updated_at url visible_to_clients].freeze
4658
+ %i[app_url bucket created_at creator id inherits_status name status title type updated_at url visible_to_clients].freeze
4420
4659
  end
4421
4660
 
4422
4661
  def initialize(data = {})
4423
4662
  @app_url = data["app_url"]
4424
- @bubble_up_url = data["bubble_up_url"]
4425
4663
  @bucket = parse_type(data["bucket"], "TodoBucket")
4426
4664
  @created_at = parse_datetime(data["created_at"])
4427
4665
  @creator = parse_type(data["creator"], "Person")
4428
4666
  @id = parse_integer(data["id"])
4429
4667
  @inherits_status = parse_boolean(data["inherits_status"])
4430
4668
  @name = data["name"]
4431
- @parent = parse_type(data["parent"], "TodoParent")
4432
4669
  @status = data["status"]
4433
4670
  @title = data["title"]
4434
4671
  @type = data["type"]
4435
4672
  @updated_at = parse_datetime(data["updated_at"])
4436
4673
  @url = data["url"]
4437
4674
  @visible_to_clients = parse_boolean(data["visible_to_clients"])
4675
+ @app_todolists_url = data["app_todolists_url"]
4438
4676
  @app_todos_url = data["app_todos_url"]
4439
4677
  @bookmark_url = data["bookmark_url"]
4440
- @comments_count = parse_integer(data["comments_count"])
4441
- @comments_url = data["comments_url"]
4442
4678
  @completed = parse_boolean(data["completed"])
4679
+ @completed_loose_todos_count = parse_integer(data["completed_loose_todos_count"])
4443
4680
  @completed_ratio = data["completed_ratio"]
4444
4681
  @position = parse_integer(data["position"])
4445
- @subscription_url = data["subscription_url"]
4682
+ @todolists_count = parse_integer(data["todolists_count"])
4683
+ @todolists_url = data["todolists_url"]
4684
+ @todos_count = parse_integer(data["todos_count"])
4446
4685
  @todos_url = data["todos_url"]
4447
4686
  end
4448
4687
 
4449
4688
  def to_h
4450
4689
  {
4451
4690
  "app_url" => @app_url,
4452
- "bubble_up_url" => @bubble_up_url,
4453
4691
  "bucket" => @bucket,
4454
4692
  "created_at" => @created_at,
4455
4693
  "creator" => @creator,
4456
4694
  "id" => @id,
4457
4695
  "inherits_status" => @inherits_status,
4458
4696
  "name" => @name,
4459
- "parent" => @parent,
4460
4697
  "status" => @status,
4461
4698
  "title" => @title,
4462
4699
  "type" => @type,
4463
4700
  "updated_at" => @updated_at,
4464
4701
  "url" => @url,
4465
4702
  "visible_to_clients" => @visible_to_clients,
4703
+ "app_todolists_url" => @app_todolists_url,
4466
4704
  "app_todos_url" => @app_todos_url,
4467
4705
  "bookmark_url" => @bookmark_url,
4468
- "comments_count" => @comments_count,
4469
- "comments_url" => @comments_url,
4470
4706
  "completed" => @completed,
4707
+ "completed_loose_todos_count" => @completed_loose_todos_count,
4471
4708
  "completed_ratio" => @completed_ratio,
4472
4709
  "position" => @position,
4473
- "subscription_url" => @subscription_url,
4710
+ "todolists_count" => @todolists_count,
4711
+ "todolists_url" => @todolists_url,
4712
+ "todos_count" => @todos_count,
4474
4713
  "todos_url" => @todos_url,
4475
4714
  }.compact
4476
4715
  end
@@ -4480,69 +4719,100 @@ module Basecamp
4480
4719
  end
4481
4720
  end
4482
4721
 
4483
- # Todoset
4484
- class Todoset
4722
+ # Tool
4723
+ class Tool
4485
4724
  include TypeHelpers
4486
- attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :name, :status, :title, :type, :updated_at, :url, :visible_to_clients, :app_todolists_url, :app_todos_url, :bookmark_url, :completed, :completed_loose_todos_count, :completed_ratio, :position, :todolists_count, :todolists_url, :todos_count, :todos_url
4725
+ attr_accessor :created_at, :enabled, :id, :name, :title, :updated_at, :app_url, :bucket, :position, :status, :url
4487
4726
 
4488
4727
  # @return [Array<Symbol>]
4489
4728
  def self.required_fields
4490
- %i[app_url bucket created_at creator id inherits_status name status title type updated_at url visible_to_clients].freeze
4729
+ %i[created_at enabled id name title updated_at].freeze
4491
4730
  end
4492
4731
 
4493
4732
  def initialize(data = {})
4494
- @app_url = data["app_url"]
4495
- @bucket = parse_type(data["bucket"], "TodoBucket")
4496
4733
  @created_at = parse_datetime(data["created_at"])
4497
- @creator = parse_type(data["creator"], "Person")
4734
+ @enabled = parse_boolean(data["enabled"])
4498
4735
  @id = parse_integer(data["id"])
4499
- @inherits_status = parse_boolean(data["inherits_status"])
4500
4736
  @name = data["name"]
4501
- @status = data["status"]
4502
4737
  @title = data["title"]
4503
- @type = data["type"]
4504
4738
  @updated_at = parse_datetime(data["updated_at"])
4739
+ @app_url = data["app_url"]
4740
+ @bucket = parse_type(data["bucket"], "RecordingBucket")
4741
+ @position = parse_integer(data["position"])
4742
+ @status = data["status"]
4505
4743
  @url = data["url"]
4506
- @visible_to_clients = parse_boolean(data["visible_to_clients"])
4507
- @app_todolists_url = data["app_todolists_url"]
4508
- @app_todos_url = data["app_todos_url"]
4509
- @bookmark_url = data["bookmark_url"]
4744
+ end
4745
+
4746
+ def to_h
4747
+ {
4748
+ "created_at" => @created_at,
4749
+ "enabled" => @enabled,
4750
+ "id" => @id,
4751
+ "name" => @name,
4752
+ "title" => @title,
4753
+ "updated_at" => @updated_at,
4754
+ "app_url" => @app_url,
4755
+ "bucket" => @bucket,
4756
+ "position" => @position,
4757
+ "status" => @status,
4758
+ "url" => @url,
4759
+ }.compact
4760
+ end
4761
+
4762
+ def to_json(*args)
4763
+ to_h.to_json(*args)
4764
+ end
4765
+ end
4766
+
4767
+ # UpcomingAssignable
4768
+ class UpcomingAssignable
4769
+ include TypeHelpers
4770
+ attr_accessor :app_url, :assignees, :bucket, :comments_count, :completed, :completion_url, :content, :id, :parent, :repeating, :status, :type, :url, :visible_to_clients, :completion, :due_on, :starts_on
4771
+
4772
+ # @return [Array<Symbol>]
4773
+ def self.required_fields
4774
+ %i[app_url assignees bucket comments_count completed completion_url content id parent repeating status type url visible_to_clients].freeze
4775
+ end
4776
+
4777
+ def initialize(data = {})
4778
+ @app_url = data["app_url"]
4779
+ @assignees = parse_array(data["assignees"], "UpcomingSchedulePerson")
4780
+ @bucket = parse_type(data["bucket"], "UpcomingScheduleBucket")
4781
+ @comments_count = parse_integer(data["comments_count"])
4510
4782
  @completed = parse_boolean(data["completed"])
4511
- @completed_loose_todos_count = parse_integer(data["completed_loose_todos_count"])
4512
- @completed_ratio = data["completed_ratio"]
4513
- @position = parse_integer(data["position"])
4514
- @todolists_count = parse_integer(data["todolists_count"])
4515
- @todolists_url = data["todolists_url"]
4516
- @todos_count = parse_integer(data["todos_count"])
4517
- @todos_url = data["todos_url"]
4783
+ @completion_url = data["completion_url"]
4784
+ @content = data["content"]
4785
+ @id = parse_integer(data["id"])
4786
+ @parent = parse_type(data["parent"], "UpcomingAssignableParent")
4787
+ @repeating = parse_boolean(data["repeating"])
4788
+ @status = data["status"]
4789
+ @type = data["type"]
4790
+ @url = data["url"]
4791
+ @visible_to_clients = parse_boolean(data["visible_to_clients"])
4792
+ @completion = parse_type(data["completion"], "UpcomingAssignableCompletion")
4793
+ @due_on = data["due_on"]
4794
+ @starts_on = data["starts_on"]
4518
4795
  end
4519
4796
 
4520
4797
  def to_h
4521
4798
  {
4522
4799
  "app_url" => @app_url,
4800
+ "assignees" => @assignees,
4523
4801
  "bucket" => @bucket,
4524
- "created_at" => @created_at,
4525
- "creator" => @creator,
4802
+ "comments_count" => @comments_count,
4803
+ "completed" => @completed,
4804
+ "completion_url" => @completion_url,
4805
+ "content" => @content,
4526
4806
  "id" => @id,
4527
- "inherits_status" => @inherits_status,
4528
- "name" => @name,
4807
+ "parent" => @parent,
4808
+ "repeating" => @repeating,
4529
4809
  "status" => @status,
4530
- "title" => @title,
4531
4810
  "type" => @type,
4532
- "updated_at" => @updated_at,
4533
4811
  "url" => @url,
4534
4812
  "visible_to_clients" => @visible_to_clients,
4535
- "app_todolists_url" => @app_todolists_url,
4536
- "app_todos_url" => @app_todos_url,
4537
- "bookmark_url" => @bookmark_url,
4538
- "completed" => @completed,
4539
- "completed_loose_todos_count" => @completed_loose_todos_count,
4540
- "completed_ratio" => @completed_ratio,
4541
- "position" => @position,
4542
- "todolists_count" => @todolists_count,
4543
- "todolists_url" => @todolists_url,
4544
- "todos_count" => @todos_count,
4545
- "todos_url" => @todos_url,
4813
+ "completion" => @completion,
4814
+ "due_on" => @due_on,
4815
+ "starts_on" => @starts_on,
4546
4816
  }.compact
4547
4817
  end
4548
4818
 
@@ -4551,43 +4821,161 @@ module Basecamp
4551
4821
  end
4552
4822
  end
4553
4823
 
4554
- # Tool
4555
- class Tool
4824
+ # UpcomingAssignableCompletion
4825
+ class UpcomingAssignableCompletion
4556
4826
  include TypeHelpers
4557
- attr_accessor :created_at, :enabled, :id, :name, :title, :updated_at, :app_url, :bucket, :position, :status, :url
4827
+ attr_accessor :created_at, :creator
4558
4828
 
4559
4829
  # @return [Array<Symbol>]
4560
4830
  def self.required_fields
4561
- %i[created_at enabled id name title updated_at].freeze
4831
+ %i[created_at creator].freeze
4562
4832
  end
4563
4833
 
4564
4834
  def initialize(data = {})
4565
4835
  @created_at = parse_datetime(data["created_at"])
4566
- @enabled = parse_boolean(data["enabled"])
4836
+ @creator = parse_type(data["creator"], "UpcomingSchedulePerson")
4837
+ end
4838
+
4839
+ def to_h
4840
+ {
4841
+ "created_at" => @created_at,
4842
+ "creator" => @creator,
4843
+ }.compact
4844
+ end
4845
+
4846
+ def to_json(*args)
4847
+ to_h.to_json(*args)
4848
+ end
4849
+ end
4850
+
4851
+ # UpcomingAssignableParent
4852
+ class UpcomingAssignableParent
4853
+ include TypeHelpers
4854
+ attr_accessor :id, :title
4855
+
4856
+ # @return [Array<Symbol>]
4857
+ def self.required_fields
4858
+ %i[id title].freeze
4859
+ end
4860
+
4861
+ def initialize(data = {})
4567
4862
  @id = parse_integer(data["id"])
4568
- @name = data["name"]
4569
4863
  @title = data["title"]
4570
- @updated_at = parse_datetime(data["updated_at"])
4864
+ end
4865
+
4866
+ def to_h
4867
+ {
4868
+ "id" => @id,
4869
+ "title" => @title,
4870
+ }.compact
4871
+ end
4872
+
4873
+ def to_json(*args)
4874
+ to_h.to_json(*args)
4875
+ end
4876
+ end
4877
+
4878
+ # UpcomingScheduleBucket
4879
+ class UpcomingScheduleBucket
4880
+ include TypeHelpers
4881
+ attr_accessor :id, :name
4882
+
4883
+ # @return [Array<Symbol>]
4884
+ def self.required_fields
4885
+ %i[id name].freeze
4886
+ end
4887
+
4888
+ def initialize(data = {})
4889
+ @id = parse_integer(data["id"])
4890
+ @name = data["name"]
4891
+ end
4892
+
4893
+ def to_h
4894
+ {
4895
+ "id" => @id,
4896
+ "name" => @name,
4897
+ }.compact
4898
+ end
4899
+
4900
+ def to_json(*args)
4901
+ to_h.to_json(*args)
4902
+ end
4903
+ end
4904
+
4905
+ # UpcomingScheduleEntry
4906
+ class UpcomingScheduleEntry
4907
+ include TypeHelpers
4908
+ attr_accessor :all_day, :app_url, :bucket, :comments_count, :creator, :ends_at, :id, :participants, :recurring, :starts_at, :status, :summary, :type, :url, :visible_to_clients
4909
+
4910
+ # @return [Array<Symbol>]
4911
+ def self.required_fields
4912
+ %i[all_day app_url bucket comments_count creator ends_at id participants recurring starts_at status summary type url visible_to_clients].freeze
4913
+ end
4914
+
4915
+ def initialize(data = {})
4916
+ @all_day = parse_boolean(data["all_day"])
4571
4917
  @app_url = data["app_url"]
4572
- @bucket = parse_type(data["bucket"], "RecordingBucket")
4573
- @position = parse_integer(data["position"])
4918
+ @bucket = parse_type(data["bucket"], "UpcomingScheduleBucket")
4919
+ @comments_count = parse_integer(data["comments_count"])
4920
+ @creator = parse_type(data["creator"], "UpcomingSchedulePerson")
4921
+ @ends_at = data["ends_at"]
4922
+ @id = parse_integer(data["id"])
4923
+ @participants = parse_array(data["participants"], "UpcomingSchedulePerson")
4924
+ @recurring = parse_boolean(data["recurring"])
4925
+ @starts_at = data["starts_at"]
4574
4926
  @status = data["status"]
4927
+ @summary = data["summary"]
4928
+ @type = data["type"]
4575
4929
  @url = data["url"]
4930
+ @visible_to_clients = parse_boolean(data["visible_to_clients"])
4576
4931
  end
4577
4932
 
4578
4933
  def to_h
4579
4934
  {
4580
- "created_at" => @created_at,
4581
- "enabled" => @enabled,
4582
- "id" => @id,
4583
- "name" => @name,
4584
- "title" => @title,
4585
- "updated_at" => @updated_at,
4935
+ "all_day" => @all_day,
4586
4936
  "app_url" => @app_url,
4587
4937
  "bucket" => @bucket,
4588
- "position" => @position,
4938
+ "comments_count" => @comments_count,
4939
+ "creator" => @creator,
4940
+ "ends_at" => @ends_at,
4941
+ "id" => @id,
4942
+ "participants" => @participants,
4943
+ "recurring" => @recurring,
4944
+ "starts_at" => @starts_at,
4589
4945
  "status" => @status,
4946
+ "summary" => @summary,
4947
+ "type" => @type,
4590
4948
  "url" => @url,
4949
+ "visible_to_clients" => @visible_to_clients,
4950
+ }.compact
4951
+ end
4952
+
4953
+ def to_json(*args)
4954
+ to_h.to_json(*args)
4955
+ end
4956
+ end
4957
+
4958
+ # UpcomingSchedulePerson
4959
+ class UpcomingSchedulePerson
4960
+ include TypeHelpers
4961
+ attr_accessor :avatar_url, :id, :name
4962
+
4963
+ # @return [Array<Symbol>]
4964
+ def self.required_fields
4965
+ %i[avatar_url id name].freeze
4966
+ end
4967
+
4968
+ def initialize(data = {})
4969
+ @avatar_url = data["avatar_url"]
4970
+ @id = parse_integer(data["id"])
4971
+ @name = data["name"]
4972
+ end
4973
+
4974
+ def to_h
4975
+ {
4976
+ "avatar_url" => @avatar_url,
4977
+ "id" => @id,
4978
+ "name" => @name,
4591
4979
  }.compact
4592
4980
  end
4593
4981
 
@@ -4675,6 +5063,82 @@ module Basecamp
4675
5063
  end
4676
5064
  end
4677
5065
 
5066
+ # UploadVersion
5067
+ class UploadVersion
5068
+ include TypeHelpers
5069
+ attr_accessor :action, :created_at, :creator, :id, :recording_id, :boosts_count, :boosts_url, :details, :upload
5070
+
5071
+ # @return [Array<Symbol>]
5072
+ def self.required_fields
5073
+ %i[action created_at creator id recording_id].freeze
5074
+ end
5075
+
5076
+ def initialize(data = {})
5077
+ @action = data["action"]
5078
+ @created_at = parse_datetime(data["created_at"])
5079
+ @creator = parse_type(data["creator"], "Person")
5080
+ @id = parse_integer(data["id"])
5081
+ @recording_id = parse_integer(data["recording_id"])
5082
+ @boosts_count = parse_integer(data["boosts_count"])
5083
+ @boosts_url = data["boosts_url"]
5084
+ @details = parse_type(data["details"], "EventDetails")
5085
+ @upload = parse_type(data["upload"], "UploadVersionFile")
5086
+ end
5087
+
5088
+ def to_h
5089
+ {
5090
+ "action" => @action,
5091
+ "created_at" => @created_at,
5092
+ "creator" => @creator,
5093
+ "id" => @id,
5094
+ "recording_id" => @recording_id,
5095
+ "boosts_count" => @boosts_count,
5096
+ "boosts_url" => @boosts_url,
5097
+ "details" => @details,
5098
+ "upload" => @upload,
5099
+ }.compact
5100
+ end
5101
+
5102
+ def to_json(*args)
5103
+ to_h.to_json(*args)
5104
+ end
5105
+ end
5106
+
5107
+ # UploadVersionFile
5108
+ class UploadVersionFile
5109
+ include TypeHelpers
5110
+ attr_accessor :app_download_url, :current, :download_url, :filename, :byte_size, :content_type
5111
+
5112
+ # @return [Array<Symbol>]
5113
+ def self.required_fields
5114
+ %i[app_download_url current download_url filename].freeze
5115
+ end
5116
+
5117
+ def initialize(data = {})
5118
+ @app_download_url = data["app_download_url"]
5119
+ @current = parse_boolean(data["current"])
5120
+ @download_url = data["download_url"]
5121
+ @filename = data["filename"]
5122
+ @byte_size = parse_integer(data["byte_size"])
5123
+ @content_type = data["content_type"]
5124
+ end
5125
+
5126
+ def to_h
5127
+ {
5128
+ "app_download_url" => @app_download_url,
5129
+ "current" => @current,
5130
+ "download_url" => @download_url,
5131
+ "filename" => @filename,
5132
+ "byte_size" => @byte_size,
5133
+ "content_type" => @content_type,
5134
+ }.compact
5135
+ end
5136
+
5137
+ def to_json(*args)
5138
+ to_h.to_json(*args)
5139
+ end
5140
+ end
5141
+
4678
5142
  # Vault
4679
5143
  class Vault
4680
5144
  include TypeHelpers