basecamp-sdk 0.8.0 → 0.10.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/lib/basecamp/client.rb +10 -0
  4. data/lib/basecamp/generated/metadata.json +343 -12
  5. data/lib/basecamp/generated/services/automation_service.rb +1 -1
  6. data/lib/basecamp/generated/services/base_service.rb +13 -0
  7. data/lib/basecamp/generated/services/campfires_service.rb +2 -2
  8. data/lib/basecamp/generated/services/card_columns_service.rb +3 -3
  9. data/lib/basecamp/generated/services/cards_service.rb +2 -2
  10. data/lib/basecamp/generated/services/checkins_service.rb +5 -4
  11. data/lib/basecamp/generated/services/client_approvals_service.rb +1 -1
  12. data/lib/basecamp/generated/services/client_correspondences_service.rb +1 -1
  13. data/lib/basecamp/generated/services/documents_service.rb +3 -2
  14. data/lib/basecamp/generated/services/everything_service.rb +179 -0
  15. data/lib/basecamp/generated/services/forwards_service.rb +1 -1
  16. data/lib/basecamp/generated/services/gauges_service.rb +4 -4
  17. data/lib/basecamp/generated/services/message_types_service.rb +20 -15
  18. data/lib/basecamp/generated/services/messages_service.rb +4 -3
  19. data/lib/basecamp/generated/services/my_assignments_service.rb +3 -3
  20. data/lib/basecamp/generated/services/my_notifications_service.rb +16 -2
  21. data/lib/basecamp/generated/services/people_service.rb +3 -3
  22. data/lib/basecamp/generated/services/projects_service.rb +2 -2
  23. data/lib/basecamp/generated/services/recordings_service.rb +2 -2
  24. data/lib/basecamp/generated/services/reports_service.rb +2 -2
  25. data/lib/basecamp/generated/services/schedules_service.rb +14 -5
  26. data/lib/basecamp/generated/services/search_service.rb +14 -3
  27. data/lib/basecamp/generated/services/templates_service.rb +4 -5
  28. data/lib/basecamp/generated/services/timesheets_service.rb +4 -4
  29. data/lib/basecamp/generated/services/todolists_service.rb +15 -3
  30. data/lib/basecamp/generated/services/todos_service.rb +1 -1
  31. data/lib/basecamp/generated/services/tools_service.rb +4 -3
  32. data/lib/basecamp/generated/services/uploads_service.rb +3 -2
  33. data/lib/basecamp/generated/services/webhooks_service.rb +2 -2
  34. data/lib/basecamp/generated/services/wormholes_service.rb +44 -0
  35. data/lib/basecamp/generated/types.rb +656 -71
  36. data/lib/basecamp/http.rb +2 -1
  37. data/lib/basecamp/services/cards_extensions.rb +67 -0
  38. data/lib/basecamp/version.rb +2 -2
  39. data/lib/basecamp.rb +5 -0
  40. data/scripts/generate-services.rb +39 -10
  41. data/scripts/generate-types.rb +60 -1
  42. metadata +5 -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-22T08:33:01Z
4
+ # Generated: 2026-07-28T21:34:14Z
5
5
 
6
6
  require "json"
7
7
  require "time"
@@ -288,6 +288,60 @@ module Basecamp
288
288
  end
289
289
  end
290
290
 
291
+ # BucketCardsGroup
292
+ class BucketCardsGroup
293
+ include TypeHelpers
294
+ attr_accessor :bucket, :cards
295
+
296
+ # @return [Array<Symbol>]
297
+ def self.required_fields
298
+ %i[bucket cards].freeze
299
+ end
300
+
301
+ def initialize(data = {})
302
+ @bucket = parse_type(data["bucket"], "RecordingBucket")
303
+ @cards = parse_array(data["cards"], "Card")
304
+ end
305
+
306
+ def to_h
307
+ {
308
+ "bucket" => @bucket,
309
+ "cards" => @cards,
310
+ }.compact
311
+ end
312
+
313
+ def to_json(*args)
314
+ to_h.to_json(*args)
315
+ end
316
+ end
317
+
318
+ # BucketTodosGroup
319
+ class BucketTodosGroup
320
+ include TypeHelpers
321
+ attr_accessor :bucket, :todos
322
+
323
+ # @return [Array<Symbol>]
324
+ def self.required_fields
325
+ %i[bucket todos].freeze
326
+ end
327
+
328
+ def initialize(data = {})
329
+ @bucket = parse_type(data["bucket"], "RecordingBucket")
330
+ @todos = parse_array(data["todos"], "Todo")
331
+ end
332
+
333
+ def to_h
334
+ {
335
+ "bucket" => @bucket,
336
+ "todos" => @todos,
337
+ }.compact
338
+ end
339
+
340
+ def to_json(*args)
341
+ to_h.to_json(*args)
342
+ end
343
+ end
344
+
291
345
  # Campfire
292
346
  class Campfire
293
347
  include TypeHelpers
@@ -439,11 +493,11 @@ module Basecamp
439
493
  # Card
440
494
  class Card
441
495
  include TypeHelpers
442
- attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :assignees, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :completed, :completed_at, :completer, :completion_subscribers, :completion_url, :content, :description, :due_on, :position, :steps, :subscription_url
496
+ attr_accessor :app_url, :bucket, :created_at, :creator, :description_attachments, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :assignees, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :completed, :completed_at, :completer, :completion_subscribers, :completion_url, :content, :description, :due_on, :position, :steps, :subscription_url
443
497
 
444
498
  # @return [Array<Symbol>]
445
499
  def self.required_fields
446
- %i[app_url bucket created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
500
+ %i[app_url bucket created_at creator description_attachments id inherits_status parent status title type updated_at url visible_to_clients].freeze
447
501
  end
448
502
 
449
503
  def initialize(data = {})
@@ -451,6 +505,7 @@ module Basecamp
451
505
  @bucket = parse_type(data["bucket"], "TodoBucket")
452
506
  @created_at = parse_datetime(data["created_at"])
453
507
  @creator = parse_type(data["creator"], "Person")
508
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
454
509
  @id = parse_integer(data["id"])
455
510
  @inherits_status = parse_boolean(data["inherits_status"])
456
511
  @parent = parse_type(data["parent"], "RecordingParent")
@@ -485,6 +540,7 @@ module Basecamp
485
540
  "bucket" => @bucket,
486
541
  "created_at" => @created_at,
487
542
  "creator" => @creator,
543
+ "description_attachments" => @description_attachments,
488
544
  "id" => @id,
489
545
  "inherits_status" => @inherits_status,
490
546
  "parent" => @parent,
@@ -693,7 +749,7 @@ module Basecamp
693
749
  # CardTable
694
750
  class CardTable
695
751
  include TypeHelpers
696
- attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :lists, :subscribers, :subscription_url
752
+ attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :lists, :subscribers, :subscription_url, :wormholes
697
753
 
698
754
  # @return [Array<Symbol>]
699
755
  def self.required_fields
@@ -717,6 +773,7 @@ module Basecamp
717
773
  @lists = parse_array(data["lists"], "CardColumn")
718
774
  @subscribers = parse_array(data["subscribers"], "Person")
719
775
  @subscription_url = data["subscription_url"]
776
+ @wormholes = parse_array(data["wormholes"], "Wormhole")
720
777
  end
721
778
 
722
779
  def to_h
@@ -737,6 +794,7 @@ module Basecamp
737
794
  "lists" => @lists,
738
795
  "subscribers" => @subscribers,
739
796
  "subscription_url" => @subscription_url,
797
+ "wormholes" => @wormholes,
740
798
  }.compact
741
799
  end
742
800
 
@@ -787,16 +845,17 @@ module Basecamp
787
845
  # ClientApproval
788
846
  class ClientApproval
789
847
  include TypeHelpers
790
- attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :approval_status, :approver, :bookmark_url, :content, :due_on, :replies_count, :replies_url, :responses, :subject, :subscription_url
848
+ attr_accessor :app_url, :bucket, :content_attachments, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :approval_status, :approver, :bookmark_url, :content, :due_on, :replies_count, :replies_url, :responses, :subject, :subscription_url
791
849
 
792
850
  # @return [Array<Symbol>]
793
851
  def self.required_fields
794
- %i[app_url bucket created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
852
+ %i[app_url bucket content_attachments created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
795
853
  end
796
854
 
797
855
  def initialize(data = {})
798
856
  @app_url = data["app_url"]
799
857
  @bucket = parse_type(data["bucket"], "RecordingBucket")
858
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
800
859
  @created_at = parse_datetime(data["created_at"])
801
860
  @creator = parse_type(data["creator"], "Person")
802
861
  @id = parse_integer(data["id"])
@@ -824,6 +883,7 @@ module Basecamp
824
883
  {
825
884
  "app_url" => @app_url,
826
885
  "bucket" => @bucket,
886
+ "content_attachments" => @content_attachments,
827
887
  "created_at" => @created_at,
828
888
  "creator" => @creator,
829
889
  "id" => @id,
@@ -931,16 +991,17 @@ module Basecamp
931
991
  # ClientCorrespondence
932
992
  class ClientCorrespondence
933
993
  include TypeHelpers
934
- attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :parent, :status, :subject, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :content, :replies_count, :replies_url, :subscription_url
994
+ attr_accessor :app_url, :bucket, :content_attachments, :created_at, :creator, :id, :inherits_status, :parent, :status, :subject, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :content, :replies_count, :replies_url, :subscription_url
935
995
 
936
996
  # @return [Array<Symbol>]
937
997
  def self.required_fields
938
- %i[app_url bucket created_at creator id inherits_status parent status subject title type updated_at url visible_to_clients].freeze
998
+ %i[app_url bucket content_attachments created_at creator id inherits_status parent status subject title type updated_at url visible_to_clients].freeze
939
999
  end
940
1000
 
941
1001
  def initialize(data = {})
942
1002
  @app_url = data["app_url"]
943
1003
  @bucket = parse_type(data["bucket"], "RecordingBucket")
1004
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
944
1005
  @created_at = parse_datetime(data["created_at"])
945
1006
  @creator = parse_type(data["creator"], "Person")
946
1007
  @id = parse_integer(data["id"])
@@ -964,6 +1025,7 @@ module Basecamp
964
1025
  {
965
1026
  "app_url" => @app_url,
966
1027
  "bucket" => @bucket,
1028
+ "content_attachments" => @content_attachments,
967
1029
  "created_at" => @created_at,
968
1030
  "creator" => @creator,
969
1031
  "id" => @id,
@@ -992,17 +1054,18 @@ module Basecamp
992
1054
  # ClientReply
993
1055
  class ClientReply
994
1056
  include TypeHelpers
995
- attr_accessor :app_url, :bucket, :content, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url
1057
+ attr_accessor :app_url, :bucket, :content, :content_attachments, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url
996
1058
 
997
1059
  # @return [Array<Symbol>]
998
1060
  def self.required_fields
999
- %i[app_url bucket content created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
1061
+ %i[app_url bucket content content_attachments created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
1000
1062
  end
1001
1063
 
1002
1064
  def initialize(data = {})
1003
1065
  @app_url = data["app_url"]
1004
1066
  @bucket = parse_type(data["bucket"], "RecordingBucket")
1005
1067
  @content = data["content"]
1068
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
1006
1069
  @created_at = parse_datetime(data["created_at"])
1007
1070
  @creator = parse_type(data["creator"], "Person")
1008
1071
  @id = parse_integer(data["id"])
@@ -1022,6 +1085,7 @@ module Basecamp
1022
1085
  "app_url" => @app_url,
1023
1086
  "bucket" => @bucket,
1024
1087
  "content" => @content,
1088
+ "content_attachments" => @content_attachments,
1025
1089
  "created_at" => @created_at,
1026
1090
  "creator" => @creator,
1027
1091
  "id" => @id,
@@ -1043,6 +1107,7 @@ module Basecamp
1043
1107
  end
1044
1108
 
1045
1109
  # ClientSide
1110
+ # @deprecated This shape is deprecated since 2024-01: Use Client Visibility feature instead
1046
1111
  class ClientSide
1047
1112
  include TypeHelpers
1048
1113
  attr_accessor :app_url, :url
@@ -1067,17 +1132,18 @@ module Basecamp
1067
1132
  # Comment
1068
1133
  class Comment
1069
1134
  include TypeHelpers
1070
- attr_accessor :app_url, :bucket, :content, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url
1135
+ attr_accessor :app_url, :bucket, :content, :content_attachments, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url
1071
1136
 
1072
1137
  # @return [Array<Symbol>]
1073
1138
  def self.required_fields
1074
- %i[app_url bucket content created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
1139
+ %i[app_url bucket content content_attachments created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
1075
1140
  end
1076
1141
 
1077
1142
  def initialize(data = {})
1078
1143
  @app_url = data["app_url"]
1079
1144
  @bucket = parse_type(data["bucket"], "TodoBucket")
1080
1145
  @content = data["content"]
1146
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
1081
1147
  @created_at = parse_datetime(data["created_at"])
1082
1148
  @creator = parse_type(data["creator"], "Person")
1083
1149
  @id = parse_integer(data["id"])
@@ -1099,6 +1165,7 @@ module Basecamp
1099
1165
  "app_url" => @app_url,
1100
1166
  "bucket" => @bucket,
1101
1167
  "content" => @content,
1168
+ "content_attachments" => @content_attachments,
1102
1169
  "created_at" => @created_at,
1103
1170
  "creator" => @creator,
1104
1171
  "id" => @id,
@@ -1192,16 +1259,17 @@ module Basecamp
1192
1259
  # Document
1193
1260
  class Document
1194
1261
  include TypeHelpers
1195
- attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :content, :position, :subscription_url
1262
+ attr_accessor :app_url, :bucket, :content_attachments, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :content, :position, :subscription_url
1196
1263
 
1197
1264
  # @return [Array<Symbol>]
1198
1265
  def self.required_fields
1199
- %i[app_url bucket created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
1266
+ %i[app_url bucket content_attachments created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
1200
1267
  end
1201
1268
 
1202
1269
  def initialize(data = {})
1203
1270
  @app_url = data["app_url"]
1204
1271
  @bucket = parse_type(data["bucket"], "TodoBucket")
1272
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
1205
1273
  @created_at = parse_datetime(data["created_at"])
1206
1274
  @creator = parse_type(data["creator"], "Person")
1207
1275
  @id = parse_integer(data["id"])
@@ -1227,6 +1295,7 @@ module Basecamp
1227
1295
  {
1228
1296
  "app_url" => @app_url,
1229
1297
  "bucket" => @bucket,
1298
+ "content_attachments" => @content_attachments,
1230
1299
  "created_at" => @created_at,
1231
1300
  "creator" => @creator,
1232
1301
  "id" => @id,
@@ -1254,6 +1323,34 @@ module Basecamp
1254
1323
  end
1255
1324
  end
1256
1325
 
1326
+ # DoorService
1327
+ class DoorService
1328
+ include TypeHelpers
1329
+ attr_accessor :code, :example_url, :name, :supporting_text, :valid_patterns
1330
+
1331
+ def initialize(data = {})
1332
+ @code = data["code"]
1333
+ @example_url = data["example_url"]
1334
+ @name = data["name"]
1335
+ @supporting_text = data["supporting_text"]
1336
+ @valid_patterns = data["valid_patterns"]
1337
+ end
1338
+
1339
+ def to_h
1340
+ {
1341
+ "code" => @code,
1342
+ "example_url" => @example_url,
1343
+ "name" => @name,
1344
+ "supporting_text" => @supporting_text,
1345
+ "valid_patterns" => @valid_patterns,
1346
+ }.compact
1347
+ end
1348
+
1349
+ def to_json(*args)
1350
+ to_h.to_json(*args)
1351
+ end
1352
+ end
1353
+
1257
1354
  # Event
1258
1355
  class Event
1259
1356
  include TypeHelpers
@@ -1317,19 +1414,135 @@ module Basecamp
1317
1414
  end
1318
1415
  end
1319
1416
 
1417
+ # EverythingBoost
1418
+ class EverythingBoost
1419
+ include TypeHelpers
1420
+ attr_accessor :booster, :content, :created_at, :id, :recording
1421
+
1422
+ # @return [Array<Symbol>]
1423
+ def self.required_fields
1424
+ %i[booster content created_at id recording].freeze
1425
+ end
1426
+
1427
+ def initialize(data = {})
1428
+ @booster = parse_type(data["booster"], "Person")
1429
+ @content = data["content"]
1430
+ @created_at = parse_datetime(data["created_at"])
1431
+ @id = parse_integer(data["id"])
1432
+ @recording = parse_type(data["recording"], "Recording")
1433
+ end
1434
+
1435
+ def to_h
1436
+ {
1437
+ "booster" => @booster,
1438
+ "content" => @content,
1439
+ "created_at" => @created_at,
1440
+ "id" => @id,
1441
+ "recording" => @recording,
1442
+ }.compact
1443
+ end
1444
+
1445
+ def to_json(*args)
1446
+ to_h.to_json(*args)
1447
+ end
1448
+ end
1449
+
1450
+ # EverythingFile
1451
+ class EverythingFile
1452
+ include TypeHelpers
1453
+ attr_accessor :app_download_url, :app_url, :attachable_sgid, :bookmark_url, :boosts_count, :boosts_url, :bucket, :byte_size, :comments_count, :comments_url, :content, :content_attachments, :content_type, :created_at, :creator, :description, :description_attachments, :download_url, :filename, :height, :id, :inherits_status, :parent, :position, :status, :subscription_url, :title, :type, :updated_at, :url, :visible_to_clients, :width
1454
+
1455
+ def initialize(data = {})
1456
+ @app_download_url = data["app_download_url"]
1457
+ @app_url = data["app_url"]
1458
+ @attachable_sgid = data["attachable_sgid"]
1459
+ @bookmark_url = data["bookmark_url"]
1460
+ @boosts_count = parse_integer(data["boosts_count"])
1461
+ @boosts_url = data["boosts_url"]
1462
+ @bucket = parse_type(data["bucket"], "RecordingBucket")
1463
+ @byte_size = parse_integer(data["byte_size"])
1464
+ @comments_count = parse_integer(data["comments_count"])
1465
+ @comments_url = data["comments_url"]
1466
+ @content = data["content"]
1467
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
1468
+ @content_type = data["content_type"]
1469
+ @created_at = parse_datetime(data["created_at"])
1470
+ @creator = parse_type(data["creator"], "Person")
1471
+ @description = data["description"]
1472
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
1473
+ @download_url = data["download_url"]
1474
+ @filename = data["filename"]
1475
+ @height = parse_integer(data["height"])
1476
+ @id = parse_integer(data["id"])
1477
+ @inherits_status = parse_boolean(data["inherits_status"])
1478
+ @parent = parse_type(data["parent"], "RecordingParent")
1479
+ @position = parse_integer(data["position"])
1480
+ @status = data["status"]
1481
+ @subscription_url = data["subscription_url"]
1482
+ @title = data["title"]
1483
+ @type = data["type"]
1484
+ @updated_at = parse_datetime(data["updated_at"])
1485
+ @url = data["url"]
1486
+ @visible_to_clients = parse_boolean(data["visible_to_clients"])
1487
+ @width = parse_integer(data["width"])
1488
+ end
1489
+
1490
+ def to_h
1491
+ {
1492
+ "app_download_url" => @app_download_url,
1493
+ "app_url" => @app_url,
1494
+ "attachable_sgid" => @attachable_sgid,
1495
+ "bookmark_url" => @bookmark_url,
1496
+ "boosts_count" => @boosts_count,
1497
+ "boosts_url" => @boosts_url,
1498
+ "bucket" => @bucket,
1499
+ "byte_size" => @byte_size,
1500
+ "comments_count" => @comments_count,
1501
+ "comments_url" => @comments_url,
1502
+ "content" => @content,
1503
+ "content_attachments" => @content_attachments,
1504
+ "content_type" => @content_type,
1505
+ "created_at" => @created_at,
1506
+ "creator" => @creator,
1507
+ "description" => @description,
1508
+ "description_attachments" => @description_attachments,
1509
+ "download_url" => @download_url,
1510
+ "filename" => @filename,
1511
+ "height" => @height,
1512
+ "id" => @id,
1513
+ "inherits_status" => @inherits_status,
1514
+ "parent" => @parent,
1515
+ "position" => @position,
1516
+ "status" => @status,
1517
+ "subscription_url" => @subscription_url,
1518
+ "title" => @title,
1519
+ "type" => @type,
1520
+ "updated_at" => @updated_at,
1521
+ "url" => @url,
1522
+ "visible_to_clients" => @visible_to_clients,
1523
+ "width" => @width,
1524
+ }.compact
1525
+ end
1526
+
1527
+ def to_json(*args)
1528
+ to_h.to_json(*args)
1529
+ end
1530
+ end
1531
+
1320
1532
  # Forward
1321
1533
  class Forward
1322
1534
  include TypeHelpers
1323
- attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :parent, :status, :subject, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :content, :from, :replies_count, :replies_url, :subscription_url
1535
+ attr_accessor :app_url, :bucket, :content_attachments, :created_at, :creator, :id, :inherits_status, :parent, :status, :subject, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :content, :from, :replies_count, :replies_url, :subscription_url
1324
1536
 
1325
1537
  # @return [Array<Symbol>]
1326
1538
  def self.required_fields
1327
- %i[app_url bucket created_at creator id inherits_status parent status subject title type updated_at url visible_to_clients].freeze
1539
+ %i[app_url bucket content_attachments created_at creator id inherits_status parent status subject title type updated_at url visible_to_clients].freeze
1328
1540
  end
1329
1541
 
1330
1542
  def initialize(data = {})
1331
1543
  @app_url = data["app_url"]
1332
1544
  @bucket = parse_type(data["bucket"], "TodoBucket")
1545
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
1333
1546
  @created_at = parse_datetime(data["created_at"])
1334
1547
  @creator = parse_type(data["creator"], "Person")
1335
1548
  @id = parse_integer(data["id"])
@@ -1354,6 +1567,7 @@ module Basecamp
1354
1567
  {
1355
1568
  "app_url" => @app_url,
1356
1569
  "bucket" => @bucket,
1570
+ "content_attachments" => @content_attachments,
1357
1571
  "created_at" => @created_at,
1358
1572
  "creator" => @creator,
1359
1573
  "id" => @id,
@@ -1383,17 +1597,18 @@ module Basecamp
1383
1597
  # ForwardReply
1384
1598
  class ForwardReply
1385
1599
  include TypeHelpers
1386
- attr_accessor :app_url, :bucket, :content, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url
1600
+ attr_accessor :app_url, :bucket, :content, :content_attachments, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url
1387
1601
 
1388
1602
  # @return [Array<Symbol>]
1389
1603
  def self.required_fields
1390
- %i[app_url bucket content created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
1604
+ %i[app_url bucket content content_attachments created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
1391
1605
  end
1392
1606
 
1393
1607
  def initialize(data = {})
1394
1608
  @app_url = data["app_url"]
1395
1609
  @bucket = parse_type(data["bucket"], "TodoBucket")
1396
1610
  @content = data["content"]
1611
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
1397
1612
  @created_at = parse_datetime(data["created_at"])
1398
1613
  @creator = parse_type(data["creator"], "Person")
1399
1614
  @id = parse_integer(data["id"])
@@ -1415,6 +1630,7 @@ module Basecamp
1415
1630
  "app_url" => @app_url,
1416
1631
  "bucket" => @bucket,
1417
1632
  "content" => @content,
1633
+ "content_attachments" => @content_attachments,
1418
1634
  "created_at" => @created_at,
1419
1635
  "creator" => @creator,
1420
1636
  "id" => @id,
@@ -1440,7 +1656,7 @@ module Basecamp
1440
1656
  # Gauge
1441
1657
  class Gauge
1442
1658
  include TypeHelpers
1443
- attr_accessor :created_at, :id, :updated_at, :app_url, :bookmark_url, :bucket, :creator, :description, :enabled, :inherits_status, :last_needle_color, :last_needle_position, :previous_needle_position, :status, :title, :type, :url, :visible_to_clients
1659
+ attr_accessor :created_at, :id, :updated_at, :app_url, :bookmark_url, :bucket, :creator, :description, :description_attachments, :enabled, :inherits_status, :last_needle_color, :last_needle_position, :previous_needle_position, :status, :title, :type, :url, :visible_to_clients
1444
1660
 
1445
1661
  # @return [Array<Symbol>]
1446
1662
  def self.required_fields
@@ -1456,6 +1672,7 @@ module Basecamp
1456
1672
  @bucket = parse_type(data["bucket"], "RecordingBucket")
1457
1673
  @creator = parse_type(data["creator"], "Person")
1458
1674
  @description = data["description"]
1675
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
1459
1676
  @enabled = parse_boolean(data["enabled"])
1460
1677
  @inherits_status = parse_boolean(data["inherits_status"])
1461
1678
  @last_needle_color = data["last_needle_color"]
@@ -1478,6 +1695,7 @@ module Basecamp
1478
1695
  "bucket" => @bucket,
1479
1696
  "creator" => @creator,
1480
1697
  "description" => @description,
1698
+ "description_attachments" => @description_attachments,
1481
1699
  "enabled" => @enabled,
1482
1700
  "inherits_status" => @inherits_status,
1483
1701
  "last_needle_color" => @last_needle_color,
@@ -1499,15 +1717,16 @@ module Basecamp
1499
1717
  # GaugeNeedle
1500
1718
  class GaugeNeedle
1501
1719
  include TypeHelpers
1502
- attr_accessor :created_at, :id, :updated_at, :app_url, :bookmark_url, :boosts_count, :boosts_url, :bucket, :color, :comments_count, :comments_url, :creator, :description, :inherits_status, :parent, :position, :status, :subscription_url, :title, :type, :url, :visible_to_clients
1720
+ attr_accessor :created_at, :description_attachments, :id, :updated_at, :app_url, :bookmark_url, :boosts_count, :boosts_url, :bucket, :color, :comments_count, :comments_url, :creator, :description, :inherits_status, :parent, :position, :status, :subscription_url, :title, :type, :url, :visible_to_clients
1503
1721
 
1504
1722
  # @return [Array<Symbol>]
1505
1723
  def self.required_fields
1506
- %i[created_at id updated_at].freeze
1724
+ %i[created_at description_attachments id updated_at].freeze
1507
1725
  end
1508
1726
 
1509
1727
  def initialize(data = {})
1510
1728
  @created_at = parse_datetime(data["created_at"])
1729
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
1511
1730
  @id = parse_integer(data["id"])
1512
1731
  @updated_at = parse_datetime(data["updated_at"])
1513
1732
  @app_url = data["app_url"]
@@ -1534,6 +1753,7 @@ module Basecamp
1534
1753
  def to_h
1535
1754
  {
1536
1755
  "created_at" => @created_at,
1756
+ "description_attachments" => @description_attachments,
1537
1757
  "id" => @id,
1538
1758
  "updated_at" => @updated_at,
1539
1759
  "app_url" => @app_url,
@@ -1798,17 +2018,18 @@ module Basecamp
1798
2018
  # Message
1799
2019
  class Message
1800
2020
  include TypeHelpers
1801
- attr_accessor :app_url, :bucket, :content, :created_at, :creator, :id, :inherits_status, :parent, :status, :subject, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :category, :comments_count, :comments_url, :subscription_url
2021
+ attr_accessor :app_url, :bucket, :content, :content_attachments, :created_at, :creator, :id, :inherits_status, :parent, :status, :subject, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :category, :comments_count, :comments_url, :subscription_url
1802
2022
 
1803
2023
  # @return [Array<Symbol>]
1804
2024
  def self.required_fields
1805
- %i[app_url bucket content created_at creator id inherits_status parent status subject title type updated_at url visible_to_clients].freeze
2025
+ %i[app_url bucket content content_attachments created_at creator id inherits_status parent status subject title type updated_at url visible_to_clients].freeze
1806
2026
  end
1807
2027
 
1808
2028
  def initialize(data = {})
1809
2029
  @app_url = data["app_url"]
1810
2030
  @bucket = parse_type(data["bucket"], "TodoBucket")
1811
2031
  @content = data["content"]
2032
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
1812
2033
  @created_at = parse_datetime(data["created_at"])
1813
2034
  @creator = parse_type(data["creator"], "Person")
1814
2035
  @id = parse_integer(data["id"])
@@ -1835,6 +2056,7 @@ module Basecamp
1835
2056
  "app_url" => @app_url,
1836
2057
  "bucket" => @bucket,
1837
2058
  "content" => @content,
2059
+ "content_attachments" => @content_attachments,
1838
2060
  "created_at" => @created_at,
1839
2061
  "creator" => @creator,
1840
2062
  "id" => @id,
@@ -2437,6 +2659,8 @@ module Basecamp
2437
2659
  # Project
2438
2660
  class Project
2439
2661
  include TypeHelpers
2662
+ # @!attribute [rw] clientside
2663
+ # @deprecated This shape is deprecated since 2024-01: Use Client Visibility feature instead
2440
2664
  attr_accessor :app_url, :created_at, :id, :name, :status, :updated_at, :url, :bookmark_url, :bookmarked, :client_company, :clients_enabled, :clientside, :description, :dock, :end_date, :purpose, :start_date
2441
2665
 
2442
2666
  # @return [Array<Symbol>]
@@ -2544,6 +2768,33 @@ module Basecamp
2544
2768
  end
2545
2769
  end
2546
2770
 
2771
+ # ProjectConstructionAttributes
2772
+ class ProjectConstructionAttributes
2773
+ include TypeHelpers
2774
+ attr_accessor :name, :description
2775
+
2776
+ # @return [Array<Symbol>]
2777
+ def self.required_fields
2778
+ %i[name].freeze
2779
+ end
2780
+
2781
+ def initialize(data = {})
2782
+ @name = data["name"]
2783
+ @description = data["description"]
2784
+ end
2785
+
2786
+ def to_h
2787
+ {
2788
+ "name" => @name,
2789
+ "description" => @description,
2790
+ }.compact
2791
+ end
2792
+
2793
+ def to_json(*args)
2794
+ to_h.to_json(*args)
2795
+ end
2796
+ end
2797
+
2547
2798
  # Question
2548
2799
  class Question
2549
2800
  include TypeHelpers
@@ -2608,17 +2859,18 @@ module Basecamp
2608
2859
  # QuestionAnswer
2609
2860
  class QuestionAnswer
2610
2861
  include TypeHelpers
2611
- attr_accessor :app_url, :bucket, :content, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :group_on, :subscription_url
2862
+ attr_accessor :app_url, :bucket, :content, :content_attachments, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :group_on, :subscription_url
2612
2863
 
2613
2864
  # @return [Array<Symbol>]
2614
2865
  def self.required_fields
2615
- %i[app_url bucket content created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
2866
+ %i[app_url bucket content content_attachments created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
2616
2867
  end
2617
2868
 
2618
2869
  def initialize(data = {})
2619
2870
  @app_url = data["app_url"]
2620
2871
  @bucket = parse_type(data["bucket"], "RecordingBucket")
2621
2872
  @content = data["content"]
2873
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
2622
2874
  @created_at = parse_datetime(data["created_at"])
2623
2875
  @creator = parse_type(data["creator"], "Person")
2624
2876
  @id = parse_integer(data["id"])
@@ -2644,6 +2896,7 @@ module Basecamp
2644
2896
  "app_url" => @app_url,
2645
2897
  "bucket" => @bucket,
2646
2898
  "content" => @content,
2899
+ "content_attachments" => @content_attachments,
2647
2900
  "created_at" => @created_at,
2648
2901
  "creator" => @creator,
2649
2902
  "id" => @id,
@@ -2844,11 +3097,11 @@ module Basecamp
2844
3097
  # Recording
2845
3098
  class Recording
2846
3099
  include TypeHelpers
2847
- attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :comments_count, :comments_url, :content, :subscription_url
3100
+ attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :bubble_up_url, :category, :comments_count, :comments_url, :content, :content_attachments, :description, :description_attachments, :from, :group_on, :parent, :position, :replies_count, :replies_url, :service, :subject, :subscription_url
2848
3101
 
2849
3102
  # @return [Array<Symbol>]
2850
3103
  def self.required_fields
2851
- %i[app_url bucket created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
3104
+ %i[app_url bucket created_at creator id inherits_status status title type updated_at url visible_to_clients].freeze
2852
3105
  end
2853
3106
 
2854
3107
  def initialize(data = {})
@@ -2858,7 +3111,6 @@ module Basecamp
2858
3111
  @creator = parse_type(data["creator"], "Person")
2859
3112
  @id = parse_integer(data["id"])
2860
3113
  @inherits_status = parse_boolean(data["inherits_status"])
2861
- @parent = parse_type(data["parent"], "RecordingParent")
2862
3114
  @status = data["status"]
2863
3115
  @title = data["title"]
2864
3116
  @type = data["type"]
@@ -2866,9 +3118,24 @@ module Basecamp
2866
3118
  @url = data["url"]
2867
3119
  @visible_to_clients = parse_boolean(data["visible_to_clients"])
2868
3120
  @bookmark_url = data["bookmark_url"]
3121
+ @boosts_count = parse_integer(data["boosts_count"])
3122
+ @boosts_url = data["boosts_url"]
3123
+ @bubble_up_url = data["bubble_up_url"]
3124
+ @category = parse_type(data["category"], "RecordingCategory")
2869
3125
  @comments_count = parse_integer(data["comments_count"])
2870
3126
  @comments_url = data["comments_url"]
2871
3127
  @content = data["content"]
3128
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
3129
+ @description = data["description"]
3130
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
3131
+ @from = data["from"]
3132
+ @group_on = data["group_on"]
3133
+ @parent = parse_type(data["parent"], "RecordingParent")
3134
+ @position = parse_integer(data["position"])
3135
+ @replies_count = parse_integer(data["replies_count"])
3136
+ @replies_url = data["replies_url"]
3137
+ @service = parse_type(data["service"], "DoorService")
3138
+ @subject = data["subject"]
2872
3139
  @subscription_url = data["subscription_url"]
2873
3140
  end
2874
3141
 
@@ -2880,7 +3147,6 @@ module Basecamp
2880
3147
  "creator" => @creator,
2881
3148
  "id" => @id,
2882
3149
  "inherits_status" => @inherits_status,
2883
- "parent" => @parent,
2884
3150
  "status" => @status,
2885
3151
  "title" => @title,
2886
3152
  "type" => @type,
@@ -2888,9 +3154,24 @@ module Basecamp
2888
3154
  "url" => @url,
2889
3155
  "visible_to_clients" => @visible_to_clients,
2890
3156
  "bookmark_url" => @bookmark_url,
3157
+ "boosts_count" => @boosts_count,
3158
+ "boosts_url" => @boosts_url,
3159
+ "bubble_up_url" => @bubble_up_url,
3160
+ "category" => @category,
2891
3161
  "comments_count" => @comments_count,
2892
3162
  "comments_url" => @comments_url,
2893
3163
  "content" => @content,
3164
+ "content_attachments" => @content_attachments,
3165
+ "description" => @description,
3166
+ "description_attachments" => @description_attachments,
3167
+ "from" => @from,
3168
+ "group_on" => @group_on,
3169
+ "parent" => @parent,
3170
+ "position" => @position,
3171
+ "replies_count" => @replies_count,
3172
+ "replies_url" => @replies_url,
3173
+ "service" => @service,
3174
+ "subject" => @subject,
2894
3175
  "subscription_url" => @subscription_url,
2895
3176
  }.compact
2896
3177
  end
@@ -2929,10 +3210,39 @@ module Basecamp
2929
3210
  end
2930
3211
  end
2931
3212
 
3213
+ # RecordingCategory
3214
+ class RecordingCategory
3215
+ include TypeHelpers
3216
+ attr_accessor :id, :name, :icon
3217
+
3218
+ # @return [Array<Symbol>]
3219
+ def self.required_fields
3220
+ %i[id name].freeze
3221
+ end
3222
+
3223
+ def initialize(data = {})
3224
+ @id = parse_integer(data["id"])
3225
+ @name = data["name"]
3226
+ @icon = data["icon"]
3227
+ end
3228
+
3229
+ def to_h
3230
+ {
3231
+ "id" => @id,
3232
+ "name" => @name,
3233
+ "icon" => @icon,
3234
+ }.compact
3235
+ end
3236
+
3237
+ def to_json(*args)
3238
+ to_h.to_json(*args)
3239
+ end
3240
+ end
3241
+
2932
3242
  # RecordingParent
2933
3243
  class RecordingParent
2934
3244
  include TypeHelpers
2935
- attr_accessor :app_url, :id, :title, :type, :url
3245
+ attr_accessor :app_url, :id, :title, :type, :url, :bucket
2936
3246
 
2937
3247
  # @return [Array<Symbol>]
2938
3248
  def self.required_fields
@@ -2945,6 +3255,7 @@ module Basecamp
2945
3255
  @title = data["title"]
2946
3256
  @type = data["type"]
2947
3257
  @url = data["url"]
3258
+ @bucket = parse_type(data["bucket"], "RecordingBucket")
2948
3259
  end
2949
3260
 
2950
3261
  def to_h
@@ -2954,6 +3265,52 @@ module Basecamp
2954
3265
  "title" => @title,
2955
3266
  "type" => @type,
2956
3267
  "url" => @url,
3268
+ "bucket" => @bucket,
3269
+ }.compact
3270
+ end
3271
+
3272
+ def to_json(*args)
3273
+ to_h.to_json(*args)
3274
+ end
3275
+ end
3276
+
3277
+ # RichTextAttachment
3278
+ class RichTextAttachment
3279
+ include TypeHelpers
3280
+ attr_accessor :byte_size, :content_type, :download_url, :filename, :id, :preview_url, :previewable, :sgid, :thumbnail_url, :height, :width
3281
+
3282
+ # @return [Array<Symbol>]
3283
+ def self.required_fields
3284
+ %i[byte_size content_type download_url filename id preview_url previewable sgid thumbnail_url].freeze
3285
+ end
3286
+
3287
+ def initialize(data = {})
3288
+ @byte_size = parse_integer(data["byte_size"])
3289
+ @content_type = data["content_type"]
3290
+ @download_url = data["download_url"]
3291
+ @filename = data["filename"]
3292
+ @id = parse_integer(data["id"])
3293
+ @preview_url = data["preview_url"]
3294
+ @previewable = parse_boolean(data["previewable"])
3295
+ @sgid = data["sgid"]
3296
+ @thumbnail_url = data["thumbnail_url"]
3297
+ @height = parse_integer(data["height"])
3298
+ @width = parse_integer(data["width"])
3299
+ end
3300
+
3301
+ def to_h
3302
+ {
3303
+ "byte_size" => @byte_size,
3304
+ "content_type" => @content_type,
3305
+ "download_url" => @download_url,
3306
+ "filename" => @filename,
3307
+ "id" => @id,
3308
+ "preview_url" => @preview_url,
3309
+ "previewable" => @previewable,
3310
+ "sgid" => @sgid,
3311
+ "thumbnail_url" => @thumbnail_url,
3312
+ "height" => @height,
3313
+ "width" => @width,
2957
3314
  }.compact
2958
3315
  end
2959
3316
 
@@ -3044,11 +3401,11 @@ module Basecamp
3044
3401
  # ScheduleEntry
3045
3402
  class ScheduleEntry
3046
3403
  include TypeHelpers
3047
- attr_accessor :app_url, :bucket, :created_at, :creator, :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
3404
+ 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
3048
3405
 
3049
3406
  # @return [Array<Symbol>]
3050
3407
  def self.required_fields
3051
- %i[app_url bucket created_at creator id inherits_status parent status summary title type updated_at url visible_to_clients].freeze
3408
+ %i[app_url bucket created_at creator description_attachments id inherits_status parent status summary title type updated_at url visible_to_clients].freeze
3052
3409
  end
3053
3410
 
3054
3411
  def initialize(data = {})
@@ -3056,6 +3413,7 @@ module Basecamp
3056
3413
  @bucket = parse_type(data["bucket"], "TodoBucket")
3057
3414
  @created_at = parse_datetime(data["created_at"])
3058
3415
  @creator = parse_type(data["creator"], "Person")
3416
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
3059
3417
  @id = parse_integer(data["id"])
3060
3418
  @inherits_status = parse_boolean(data["inherits_status"])
3061
3419
  @parent = parse_type(data["parent"], "RecordingParent")
@@ -3085,6 +3443,7 @@ module Basecamp
3085
3443
  "bucket" => @bucket,
3086
3444
  "created_at" => @created_at,
3087
3445
  "creator" => @creator,
3446
+ "description_attachments" => @description_attachments,
3088
3447
  "id" => @id,
3089
3448
  "inherits_status" => @inherits_status,
3090
3449
  "parent" => @parent,
@@ -3117,37 +3476,32 @@ module Basecamp
3117
3476
  # SearchMetadata
3118
3477
  class SearchMetadata
3119
3478
  include TypeHelpers
3120
- attr_accessor :projects
3121
-
3122
- def initialize(data = {})
3123
- @projects = parse_array(data["projects"], "SearchProject")
3124
- end
3125
-
3126
- def to_h
3127
- {
3128
- "projects" => @projects,
3129
- }.compact
3130
- end
3479
+ attr_accessor :default_bucket_label, :default_circle_label, :default_creator_label, :default_file_type_label, :default_type_label, :file_search_types, :recording_search_types
3131
3480
 
3132
- def to_json(*args)
3133
- to_h.to_json(*args)
3481
+ # @return [Array<Symbol>]
3482
+ def self.required_fields
3483
+ %i[default_bucket_label default_circle_label default_creator_label default_file_type_label default_type_label file_search_types recording_search_types].freeze
3134
3484
  end
3135
- end
3136
-
3137
- # SearchProject
3138
- class SearchProject
3139
- include TypeHelpers
3140
- attr_accessor :id, :name
3141
3485
 
3142
3486
  def initialize(data = {})
3143
- @id = parse_integer(data["id"])
3144
- @name = data["name"]
3487
+ @default_bucket_label = data["default_bucket_label"]
3488
+ @default_circle_label = data["default_circle_label"]
3489
+ @default_creator_label = data["default_creator_label"]
3490
+ @default_file_type_label = data["default_file_type_label"]
3491
+ @default_type_label = data["default_type_label"]
3492
+ @file_search_types = parse_array(data["file_search_types"], "SearchType")
3493
+ @recording_search_types = parse_array(data["recording_search_types"], "SearchType")
3145
3494
  end
3146
3495
 
3147
3496
  def to_h
3148
3497
  {
3149
- "id" => @id,
3150
- "name" => @name,
3498
+ "default_bucket_label" => @default_bucket_label,
3499
+ "default_circle_label" => @default_circle_label,
3500
+ "default_creator_label" => @default_creator_label,
3501
+ "default_file_type_label" => @default_file_type_label,
3502
+ "default_type_label" => @default_type_label,
3503
+ "file_search_types" => @file_search_types,
3504
+ "recording_search_types" => @recording_search_types,
3151
3505
  }.compact
3152
3506
  end
3153
3507
 
@@ -3159,27 +3513,32 @@ module Basecamp
3159
3513
  # SearchResult
3160
3514
  class SearchResult
3161
3515
  include TypeHelpers
3162
- attr_accessor :app_url, :id, :title, :type, :url, :bookmark_url, :bucket, :content, :created_at, :creator, :description, :inherits_status, :parent, :status, :subject, :updated_at, :visible_to_clients
3516
+ attr_accessor :app_url, :content, :description, :id, :title, :type, :url, :bookmark_url, :bubble_up_url, :bucket, :content_attachments, :created_at, :creator, :description_attachments, :inherits_status, :parent, :plain_text_content, :plain_text_description, :status, :subject, :updated_at, :visible_to_clients
3163
3517
 
3164
3518
  # @return [Array<Symbol>]
3165
3519
  def self.required_fields
3166
- %i[app_url id title type url].freeze
3520
+ %i[app_url content description id title type url].freeze
3167
3521
  end
3168
3522
 
3169
3523
  def initialize(data = {})
3170
3524
  @app_url = data["app_url"]
3525
+ @content = data["content"]
3526
+ @description = data["description"]
3171
3527
  @id = parse_integer(data["id"])
3172
3528
  @title = data["title"]
3173
3529
  @type = data["type"]
3174
3530
  @url = data["url"]
3175
3531
  @bookmark_url = data["bookmark_url"]
3532
+ @bubble_up_url = data["bubble_up_url"]
3176
3533
  @bucket = parse_type(data["bucket"], "RecordingBucket")
3177
- @content = data["content"]
3534
+ @content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
3178
3535
  @created_at = parse_datetime(data["created_at"])
3179
3536
  @creator = parse_type(data["creator"], "Person")
3180
- @description = data["description"]
3537
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
3181
3538
  @inherits_status = parse_boolean(data["inherits_status"])
3182
3539
  @parent = parse_type(data["parent"], "RecordingParent")
3540
+ @plain_text_content = data["plain_text_content"]
3541
+ @plain_text_description = data["plain_text_description"]
3183
3542
  @status = data["status"]
3184
3543
  @subject = data["subject"]
3185
3544
  @updated_at = parse_datetime(data["updated_at"])
@@ -3189,23 +3548,55 @@ module Basecamp
3189
3548
  def to_h
3190
3549
  {
3191
3550
  "app_url" => @app_url,
3551
+ "content" => @content,
3552
+ "description" => @description,
3192
3553
  "id" => @id,
3193
3554
  "title" => @title,
3194
3555
  "type" => @type,
3195
3556
  "url" => @url,
3196
3557
  "bookmark_url" => @bookmark_url,
3558
+ "bubble_up_url" => @bubble_up_url,
3197
3559
  "bucket" => @bucket,
3198
- "content" => @content,
3560
+ "content_attachments" => @content_attachments,
3199
3561
  "created_at" => @created_at,
3200
3562
  "creator" => @creator,
3201
- "description" => @description,
3563
+ "description_attachments" => @description_attachments,
3202
3564
  "inherits_status" => @inherits_status,
3203
3565
  "parent" => @parent,
3566
+ "plain_text_content" => @plain_text_content,
3567
+ "plain_text_description" => @plain_text_description,
3204
3568
  "status" => @status,
3205
3569
  "subject" => @subject,
3206
3570
  "updated_at" => @updated_at,
3207
3571
  "visible_to_clients" => @visible_to_clients,
3208
- }.compact
3572
+ }.reject { |k, v| v.nil? && !["content", "description"].include?(k) }
3573
+ end
3574
+
3575
+ def to_json(*args)
3576
+ to_h.to_json(*args)
3577
+ end
3578
+ end
3579
+
3580
+ # SearchType
3581
+ class SearchType
3582
+ include TypeHelpers
3583
+ attr_accessor :key, :value
3584
+
3585
+ # @return [Array<Symbol>]
3586
+ def self.required_fields
3587
+ %i[key value].freeze
3588
+ end
3589
+
3590
+ def initialize(data = {})
3591
+ @key = data["key"]
3592
+ @value = data["value"]
3593
+ end
3594
+
3595
+ def to_h
3596
+ {
3597
+ "key" => @key,
3598
+ "value" => @value,
3599
+ }.reject { |k, v| v.nil? && !["key"].include?(k) }
3209
3600
  end
3210
3601
 
3211
3602
  def to_json(*args)
@@ -3285,17 +3676,112 @@ module Basecamp
3285
3676
  end
3286
3677
  end
3287
3678
 
3679
+ # TimelineAttachment
3680
+ class TimelineAttachment
3681
+ include TypeHelpers
3682
+ attr_accessor :app_download_url, :app_url, :attachable_sgid, :bookmark_url, :boosts_count, :boosts_url, :bucket, :byte_size, :caption, :comments_count, :comments_url, :content_type, :created_at, :creator, :description, :description_attachments, :download_url, :filename, :height, :id, :inherits_status, :key, :parent, :position, :preview_url, :previewable, :sgid, :status, :status_url, :subscription_url, :thumbnail_url, :title, :type, :updated_at, :url, :visible_to_clients, :width
3683
+
3684
+ def initialize(data = {})
3685
+ @app_download_url = data["app_download_url"]
3686
+ @app_url = data["app_url"]
3687
+ @attachable_sgid = data["attachable_sgid"]
3688
+ @bookmark_url = data["bookmark_url"]
3689
+ @boosts_count = parse_integer(data["boosts_count"])
3690
+ @boosts_url = data["boosts_url"]
3691
+ @bucket = parse_type(data["bucket"], "TodoBucket")
3692
+ @byte_size = parse_integer(data["byte_size"])
3693
+ @caption = data["caption"]
3694
+ @comments_count = parse_integer(data["comments_count"])
3695
+ @comments_url = data["comments_url"]
3696
+ @content_type = data["content_type"]
3697
+ @created_at = parse_datetime(data["created_at"])
3698
+ @creator = parse_type(data["creator"], "Person")
3699
+ @description = data["description"]
3700
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
3701
+ @download_url = data["download_url"]
3702
+ @filename = data["filename"]
3703
+ @height = parse_integer(data["height"])
3704
+ @id = parse_integer(data["id"])
3705
+ @inherits_status = parse_boolean(data["inherits_status"])
3706
+ @key = data["key"]
3707
+ @parent = parse_type(data["parent"], "RecordingParent")
3708
+ @position = parse_integer(data["position"])
3709
+ @preview_url = data["preview_url"]
3710
+ @previewable = parse_boolean(data["previewable"])
3711
+ @sgid = data["sgid"]
3712
+ @status = data["status"]
3713
+ @status_url = data["status_url"]
3714
+ @subscription_url = data["subscription_url"]
3715
+ @thumbnail_url = data["thumbnail_url"]
3716
+ @title = data["title"]
3717
+ @type = data["type"]
3718
+ @updated_at = parse_datetime(data["updated_at"])
3719
+ @url = data["url"]
3720
+ @visible_to_clients = parse_boolean(data["visible_to_clients"])
3721
+ @width = parse_integer(data["width"])
3722
+ end
3723
+
3724
+ def to_h
3725
+ {
3726
+ "app_download_url" => @app_download_url,
3727
+ "app_url" => @app_url,
3728
+ "attachable_sgid" => @attachable_sgid,
3729
+ "bookmark_url" => @bookmark_url,
3730
+ "boosts_count" => @boosts_count,
3731
+ "boosts_url" => @boosts_url,
3732
+ "bucket" => @bucket,
3733
+ "byte_size" => @byte_size,
3734
+ "caption" => @caption,
3735
+ "comments_count" => @comments_count,
3736
+ "comments_url" => @comments_url,
3737
+ "content_type" => @content_type,
3738
+ "created_at" => @created_at,
3739
+ "creator" => @creator,
3740
+ "description" => @description,
3741
+ "description_attachments" => @description_attachments,
3742
+ "download_url" => @download_url,
3743
+ "filename" => @filename,
3744
+ "height" => @height,
3745
+ "id" => @id,
3746
+ "inherits_status" => @inherits_status,
3747
+ "key" => @key,
3748
+ "parent" => @parent,
3749
+ "position" => @position,
3750
+ "preview_url" => @preview_url,
3751
+ "previewable" => @previewable,
3752
+ "sgid" => @sgid,
3753
+ "status" => @status,
3754
+ "status_url" => @status_url,
3755
+ "subscription_url" => @subscription_url,
3756
+ "thumbnail_url" => @thumbnail_url,
3757
+ "title" => @title,
3758
+ "type" => @type,
3759
+ "updated_at" => @updated_at,
3760
+ "url" => @url,
3761
+ "visible_to_clients" => @visible_to_clients,
3762
+ "width" => @width,
3763
+ }.compact
3764
+ end
3765
+
3766
+ def to_json(*args)
3767
+ to_h.to_json(*args)
3768
+ end
3769
+ end
3770
+
3288
3771
  # TimelineEvent
3289
3772
  class TimelineEvent
3290
3773
  include TypeHelpers
3291
- attr_accessor :action, :app_url, :bucket, :created_at, :creator, :id, :kind, :parent_recording_id, :summary_excerpt, :target, :title, :url
3774
+ attr_accessor :action, :app_url, :attachments, :avatars_sample, :bucket, :created_at, :creator, :data, :id, :kind, :parent_recording_id, :summary_excerpt, :target, :title, :url
3292
3775
 
3293
3776
  def initialize(data = {})
3294
3777
  @action = data["action"]
3295
3778
  @app_url = data["app_url"]
3779
+ @attachments = parse_array(data["attachments"], "TimelineAttachment")
3780
+ @avatars_sample = data["avatars_sample"]
3296
3781
  @bucket = parse_type(data["bucket"], "TodoBucket")
3297
3782
  @created_at = parse_datetime(data["created_at"])
3298
3783
  @creator = parse_type(data["creator"], "Person")
3784
+ @data = parse_type(data["data"], "TimelineEventData")
3299
3785
  @id = parse_integer(data["id"])
3300
3786
  @kind = data["kind"]
3301
3787
  @parent_recording_id = parse_integer(data["parent_recording_id"])
@@ -3309,9 +3795,12 @@ module Basecamp
3309
3795
  {
3310
3796
  "action" => @action,
3311
3797
  "app_url" => @app_url,
3798
+ "attachments" => @attachments,
3799
+ "avatars_sample" => @avatars_sample,
3312
3800
  "bucket" => @bucket,
3313
3801
  "created_at" => @created_at,
3314
3802
  "creator" => @creator,
3803
+ "data" => @data,
3315
3804
  "id" => @id,
3316
3805
  "kind" => @kind,
3317
3806
  "parent_recording_id" => @parent_recording_id,
@@ -3327,6 +3816,35 @@ module Basecamp
3327
3816
  end
3328
3817
  end
3329
3818
 
3819
+ # TimelineEventData
3820
+ class TimelineEventData
3821
+ include TypeHelpers
3822
+ attr_accessor :all_day, :ends_at, :starts_at
3823
+
3824
+ # @return [Array<Symbol>]
3825
+ def self.required_fields
3826
+ %i[all_day ends_at starts_at].freeze
3827
+ end
3828
+
3829
+ def initialize(data = {})
3830
+ @all_day = parse_boolean(data["all_day"])
3831
+ @ends_at = data["ends_at"]
3832
+ @starts_at = data["starts_at"]
3833
+ end
3834
+
3835
+ def to_h
3836
+ {
3837
+ "all_day" => @all_day,
3838
+ "ends_at" => @ends_at,
3839
+ "starts_at" => @starts_at,
3840
+ }.reject { |k, v| v.nil? && !["ends_at", "starts_at"].include?(k) }
3841
+ end
3842
+
3843
+ def to_json(*args)
3844
+ to_h.to_json(*args)
3845
+ end
3846
+ end
3847
+
3330
3848
  # TimesheetEntry
3331
3849
  class TimesheetEntry
3332
3850
  include TypeHelpers
@@ -3389,11 +3907,11 @@ module Basecamp
3389
3907
  # Todo
3390
3908
  class Todo
3391
3909
  include TypeHelpers
3392
- attr_accessor :app_url, :bucket, :content, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :assignees, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :completed, :completion_subscribers, :completion_url, :description, :due_on, :position, :starts_on, :steps, :subscription_url
3910
+ attr_accessor :app_url, :bucket, :content, :created_at, :creator, :description_attachments, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :assignees, :bookmark_url, :boosts_count, :boosts_url, :comments_count, :comments_url, :completed, :completion_subscribers, :completion_url, :description, :due_on, :position, :starts_on, :steps, :subscription_url
3393
3911
 
3394
3912
  # @return [Array<Symbol>]
3395
3913
  def self.required_fields
3396
- %i[app_url bucket content created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
3914
+ %i[app_url bucket content created_at creator description_attachments id inherits_status parent status title type updated_at url visible_to_clients].freeze
3397
3915
  end
3398
3916
 
3399
3917
  def initialize(data = {})
@@ -3402,6 +3920,7 @@ module Basecamp
3402
3920
  @content = data["content"]
3403
3921
  @created_at = parse_datetime(data["created_at"])
3404
3922
  @creator = parse_type(data["creator"], "Person")
3923
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
3405
3924
  @id = parse_integer(data["id"])
3406
3925
  @inherits_status = parse_boolean(data["inherits_status"])
3407
3926
  @parent = parse_type(data["parent"], "TodoParent")
@@ -3435,6 +3954,7 @@ module Basecamp
3435
3954
  "content" => @content,
3436
3955
  "created_at" => @created_at,
3437
3956
  "creator" => @creator,
3957
+ "description_attachments" => @description_attachments,
3438
3958
  "id" => @id,
3439
3959
  "inherits_status" => @inherits_status,
3440
3960
  "parent" => @parent,
@@ -3532,18 +4052,20 @@ module Basecamp
3532
4052
  # Todolist
3533
4053
  class Todolist
3534
4054
  include TypeHelpers
3535
- attr_accessor :app_url, :bucket, :created_at, :creator, :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
4055
+ 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
3536
4056
 
3537
4057
  # @return [Array<Symbol>]
3538
4058
  def self.required_fields
3539
- %i[app_url bucket created_at creator id inherits_status name parent status title type updated_at url visible_to_clients].freeze
4059
+ %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
3540
4060
  end
3541
4061
 
3542
4062
  def initialize(data = {})
3543
4063
  @app_url = data["app_url"]
4064
+ @bubble_up_url = data["bubble_up_url"]
3544
4065
  @bucket = parse_type(data["bucket"], "TodoBucket")
3545
4066
  @created_at = parse_datetime(data["created_at"])
3546
4067
  @creator = parse_type(data["creator"], "Person")
4068
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
3547
4069
  @id = parse_integer(data["id"])
3548
4070
  @inherits_status = parse_boolean(data["inherits_status"])
3549
4071
  @name = data["name"]
@@ -3572,9 +4094,11 @@ module Basecamp
3572
4094
  def to_h
3573
4095
  {
3574
4096
  "app_url" => @app_url,
4097
+ "bubble_up_url" => @bubble_up_url,
3575
4098
  "bucket" => @bucket,
3576
4099
  "created_at" => @created_at,
3577
4100
  "creator" => @creator,
4101
+ "description_attachments" => @description_attachments,
3578
4102
  "id" => @id,
3579
4103
  "inherits_status" => @inherits_status,
3580
4104
  "name" => @name,
@@ -3609,15 +4133,16 @@ module Basecamp
3609
4133
  # TodolistGroup
3610
4134
  class TodolistGroup
3611
4135
  include TypeHelpers
3612
- attr_accessor :app_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
4136
+ 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
3613
4137
 
3614
4138
  # @return [Array<Symbol>]
3615
4139
  def self.required_fields
3616
- %i[app_url bucket created_at creator id inherits_status name parent status title type updated_at url visible_to_clients].freeze
4140
+ %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
3617
4141
  end
3618
4142
 
3619
4143
  def initialize(data = {})
3620
4144
  @app_url = data["app_url"]
4145
+ @bubble_up_url = data["bubble_up_url"]
3621
4146
  @bucket = parse_type(data["bucket"], "TodoBucket")
3622
4147
  @created_at = parse_datetime(data["created_at"])
3623
4148
  @creator = parse_type(data["creator"], "Person")
@@ -3645,6 +4170,7 @@ module Basecamp
3645
4170
  def to_h
3646
4171
  {
3647
4172
  "app_url" => @app_url,
4173
+ "bubble_up_url" => @bubble_up_url,
3648
4174
  "bucket" => @bucket,
3649
4175
  "created_at" => @created_at,
3650
4176
  "creator" => @creator,
@@ -3794,11 +4320,11 @@ module Basecamp
3794
4320
  # Upload
3795
4321
  class Upload
3796
4322
  include TypeHelpers
3797
- attr_accessor :app_url, :bucket, :created_at, :creator, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :byte_size, :comments_count, :comments_url, :content_type, :description, :download_url, :filename, :height, :position, :subscription_url, :width
4323
+ attr_accessor :app_url, :bucket, :created_at, :creator, :description_attachments, :id, :inherits_status, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url, :boosts_count, :boosts_url, :byte_size, :comments_count, :comments_url, :content_type, :description, :download_url, :filename, :height, :position, :subscription_url, :width
3798
4324
 
3799
4325
  # @return [Array<Symbol>]
3800
4326
  def self.required_fields
3801
- %i[app_url bucket created_at creator id inherits_status parent status title type updated_at url visible_to_clients].freeze
4327
+ %i[app_url bucket created_at creator description_attachments id inherits_status parent status title type updated_at url visible_to_clients].freeze
3802
4328
  end
3803
4329
 
3804
4330
  def initialize(data = {})
@@ -3806,6 +4332,7 @@ module Basecamp
3806
4332
  @bucket = parse_type(data["bucket"], "TodoBucket")
3807
4333
  @created_at = parse_datetime(data["created_at"])
3808
4334
  @creator = parse_type(data["creator"], "Person")
4335
+ @description_attachments = parse_array(data["description_attachments"], "RichTextAttachment")
3809
4336
  @id = parse_integer(data["id"])
3810
4337
  @inherits_status = parse_boolean(data["inherits_status"])
3811
4338
  @parent = parse_type(data["parent"], "RecordingParent")
@@ -3837,6 +4364,7 @@ module Basecamp
3837
4364
  "bucket" => @bucket,
3838
4365
  "created_at" => @created_at,
3839
4366
  "creator" => @creator,
4367
+ "description_attachments" => @description_attachments,
3840
4368
  "id" => @id,
3841
4369
  "inherits_status" => @inherits_status,
3842
4370
  "parent" => @parent,
@@ -4123,5 +4651,62 @@ module Basecamp
4123
4651
  to_h.to_json(*args)
4124
4652
  end
4125
4653
  end
4654
+
4655
+ # Wormhole
4656
+ class Wormhole
4657
+ include TypeHelpers
4658
+ attr_accessor :app_url, :bucket, :color, :created_at, :creator, :destination_url, :id, :inherits_status, :linked, :parent, :status, :title, :type, :updated_at, :url, :visible_to_clients, :bookmark_url
4659
+
4660
+ # @return [Array<Symbol>]
4661
+ def self.required_fields
4662
+ %i[app_url bucket color created_at creator destination_url id inherits_status linked parent status title type updated_at url visible_to_clients].freeze
4663
+ end
4664
+
4665
+ def initialize(data = {})
4666
+ @app_url = data["app_url"]
4667
+ @bucket = parse_type(data["bucket"], "TodoBucket")
4668
+ @color = data["color"]
4669
+ @created_at = parse_datetime(data["created_at"])
4670
+ @creator = parse_type(data["creator"], "Person")
4671
+ @destination_url = data["destination_url"]
4672
+ @id = parse_integer(data["id"])
4673
+ @inherits_status = parse_boolean(data["inherits_status"])
4674
+ @linked = parse_boolean(data["linked"])
4675
+ @parent = parse_type(data["parent"], "RecordingParent")
4676
+ @status = data["status"]
4677
+ @title = data["title"]
4678
+ @type = data["type"]
4679
+ @updated_at = parse_datetime(data["updated_at"])
4680
+ @url = data["url"]
4681
+ @visible_to_clients = parse_boolean(data["visible_to_clients"])
4682
+ @bookmark_url = data["bookmark_url"]
4683
+ end
4684
+
4685
+ def to_h
4686
+ {
4687
+ "app_url" => @app_url,
4688
+ "bucket" => @bucket,
4689
+ "color" => @color,
4690
+ "created_at" => @created_at,
4691
+ "creator" => @creator,
4692
+ "destination_url" => @destination_url,
4693
+ "id" => @id,
4694
+ "inherits_status" => @inherits_status,
4695
+ "linked" => @linked,
4696
+ "parent" => @parent,
4697
+ "status" => @status,
4698
+ "title" => @title,
4699
+ "type" => @type,
4700
+ "updated_at" => @updated_at,
4701
+ "url" => @url,
4702
+ "visible_to_clients" => @visible_to_clients,
4703
+ "bookmark_url" => @bookmark_url,
4704
+ }.reject { |k, v| v.nil? && !["color", "destination_url"].include?(k) }
4705
+ end
4706
+
4707
+ def to_json(*args)
4708
+ to_h.to_json(*args)
4709
+ end
4710
+ end
4126
4711
  end
4127
4712
  end