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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 50a6f193dfed4631d675333812b23a9d586b5f78d2a060bbd15222855c93f62c
4
- data.tar.gz: 2a9ce91aff3ae13f3262701feaa2d7706f100c1d217714896bfad94006563daf
3
+ metadata.gz: 06b1a1a19b501f386b63739724bb50b0f1d778660d2765f04d2c6a0d2214ef14
4
+ data.tar.gz: 3c2b5c8409d5a334eabb01b668e430510ad79b93cefc5ead3c5475f4b8f5d661
5
5
  SHA512:
6
- metadata.gz: a594aada84cb34e591e3ec6747095d799626fb37763531c14c3d7a0fdc05360e61572e6e3e9748c405c73e4c603ca30c503b22b73c24273cfc13de84891a8f9b
7
- data.tar.gz: 60a1d05afbe172cd92b4ee5c75871e57df33cb52f3f664e4c0dfa2823259f7ef5593cb32e022e41cc73ee30b255b214c16c4e2d1901ceef3f48eed6e11075f3b
6
+ metadata.gz: 0d9134c7b9996490c035fccc0c949acd1c05faff5c52b40aa5f30ab913456c10701a8742b74df33aea35539d197dd8c4932df3a1305d73db3efe2ac3de7bfa34
7
+ data.tar.gz: 3a4c47cb7196bd642f1c0863d25ff02fcf8ec607e102a6ce16cafe54aa5a74ef6290561c1897e365ff848e77911bdf8d7b3d31d85395adc4ba0b0753ba21d641
data/README.md CHANGED
@@ -179,7 +179,7 @@ aborts before an oversized body is buffered.
179
179
 
180
180
  ## Services
181
181
 
182
- The SDK provides 37 services covering the complete Basecamp API:
182
+ The SDK provides 45 account-scoped services. The table below covers the common ones; see `lib/basecamp/generated/services/` for the authoritative, complete set:
183
183
 
184
184
  | Service | Description |
185
185
  |---------|-------------|
@@ -210,6 +210,7 @@ The SDK provides 37 services covering the complete Basecamp API:
210
210
  | `card_tables` | Card tables (kanban) |
211
211
  | `card_columns` | Card table columns |
212
212
  | `card_steps` | Card workflow steps |
213
+ | `wormholes` | Card table wormholes (cross-project moves) |
213
214
  | `lineup` | Card lineup view |
214
215
  | `tools` | Project dock tools |
215
216
  | `search` | Full-text search |
@@ -431,6 +431,11 @@ module Basecamp
431
431
  service(:card_steps) { Services::CardStepsService.new(self) }
432
432
  end
433
433
 
434
+ # @return [Services::WormholesService]
435
+ def wormholes
436
+ service(:wormholes) { Services::WormholesService.new(self) }
437
+ end
438
+
434
439
  # @return [Services::TemplatesService]
435
440
  def templates
436
441
  service(:templates) { Services::TemplatesService.new(self) }
@@ -496,6 +501,11 @@ module Basecamp
496
501
  service(:timeline) { Services::TimelineService.new(self) }
497
502
  end
498
503
 
504
+ # @return [Services::EverythingService]
505
+ def everything
506
+ service(:everything) { Services::EverythingService.new(self) }
507
+ end
508
+
499
509
  # @return [Services::TimesheetsService]
500
510
  def timesheets
501
511
  service(:timesheets) { Services::TimesheetsService.new(self) }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://basecamp.com/schemas/sdk-metadata.json",
3
3
  "version": "1.0.0",
4
- "generated": "2026-07-22T08:33:01Z",
4
+ "generated": "2026-07-28T21:34:14Z",
5
5
  "operations": {
6
6
  "GetAccount": {
7
7
  "retry": {
@@ -67,6 +67,22 @@
67
67
  ]
68
68
  }
69
69
  },
70
+ "GetEverythingBoosts": {
71
+ "retry": {
72
+ "maxAttempts": 3,
73
+ "baseDelayMs": 1000,
74
+ "backoff": "exponential",
75
+ "retryOn": [
76
+ 429,
77
+ 503
78
+ ]
79
+ },
80
+ "pagination": {
81
+ "style": "link",
82
+ "totalCountHeader": "X-Total-Count",
83
+ "maxPageSize": 50
84
+ }
85
+ },
70
86
  "GetBoost": {
71
87
  "retry": {
72
88
  "maxAttempts": 3,
@@ -131,6 +147,111 @@
131
147
  "natural": true
132
148
  }
133
149
  },
150
+ "UpdateWormhole": {
151
+ "retry": {
152
+ "maxAttempts": 3,
153
+ "baseDelayMs": 1000,
154
+ "backoff": "exponential",
155
+ "retryOn": [
156
+ 429,
157
+ 503
158
+ ]
159
+ },
160
+ "idempotent": {
161
+ "natural": true
162
+ }
163
+ },
164
+ "DeleteWormhole": {
165
+ "retry": {
166
+ "maxAttempts": 3,
167
+ "baseDelayMs": 1000,
168
+ "backoff": "exponential",
169
+ "retryOn": [
170
+ 429,
171
+ 503
172
+ ]
173
+ },
174
+ "idempotent": {
175
+ "natural": true
176
+ }
177
+ },
178
+ "CreateWormhole": {
179
+ "retry": {
180
+ "maxAttempts": 2,
181
+ "baseDelayMs": 1000,
182
+ "backoff": "exponential",
183
+ "retryOn": [
184
+ 429,
185
+ 503
186
+ ]
187
+ }
188
+ },
189
+ "ListMessageTypes": {
190
+ "retry": {
191
+ "maxAttempts": 3,
192
+ "baseDelayMs": 1000,
193
+ "backoff": "exponential",
194
+ "retryOn": [
195
+ 429,
196
+ 503
197
+ ]
198
+ },
199
+ "pagination": {
200
+ "style": "link",
201
+ "totalCountHeader": "X-Total-Count",
202
+ "maxPageSize": 50
203
+ }
204
+ },
205
+ "CreateMessageType": {
206
+ "retry": {
207
+ "maxAttempts": 2,
208
+ "baseDelayMs": 1000,
209
+ "backoff": "exponential",
210
+ "retryOn": [
211
+ 429,
212
+ 503
213
+ ]
214
+ }
215
+ },
216
+ "GetMessageType": {
217
+ "retry": {
218
+ "maxAttempts": 3,
219
+ "baseDelayMs": 1000,
220
+ "backoff": "exponential",
221
+ "retryOn": [
222
+ 429,
223
+ 503
224
+ ]
225
+ }
226
+ },
227
+ "UpdateMessageType": {
228
+ "retry": {
229
+ "maxAttempts": 3,
230
+ "baseDelayMs": 1000,
231
+ "backoff": "exponential",
232
+ "retryOn": [
233
+ 429,
234
+ 503
235
+ ]
236
+ },
237
+ "idempotent": {
238
+ "natural": true
239
+ }
240
+ },
241
+ "DeleteMessageType": {
242
+ "retry": {
243
+ "maxAttempts": 3,
244
+ "baseDelayMs": 1000,
245
+ "backoff": "exponential",
246
+ "retryOn": [
247
+ 429,
248
+ 503
249
+ ]
250
+ },
251
+ "idempotent": {
252
+ "natural": true
253
+ }
254
+ },
134
255
  "CreateTool": {
135
256
  "retry": {
136
257
  "maxAttempts": 2,
@@ -379,7 +500,7 @@
379
500
  ]
380
501
  }
381
502
  },
382
- "ListMessageTypes": {
503
+ "GetEverythingCompletedCards": {
383
504
  "retry": {
384
505
  "maxAttempts": 3,
385
506
  "baseDelayMs": 1000,
@@ -392,21 +513,26 @@
392
513
  "pagination": {
393
514
  "style": "link",
394
515
  "totalCountHeader": "X-Total-Count",
395
- "maxPageSize": 50
516
+ "maxPageSize": 5
396
517
  }
397
518
  },
398
- "CreateMessageType": {
519
+ "GetEverythingNoDueDateCards": {
399
520
  "retry": {
400
- "maxAttempts": 2,
521
+ "maxAttempts": 3,
401
522
  "baseDelayMs": 1000,
402
523
  "backoff": "exponential",
403
524
  "retryOn": [
404
525
  429,
405
526
  503
406
527
  ]
528
+ },
529
+ "pagination": {
530
+ "style": "link",
531
+ "totalCountHeader": "X-Total-Count",
532
+ "maxPageSize": 5
407
533
  }
408
534
  },
409
- "GetMessageType": {
535
+ "GetEverythingNotNowCards": {
410
536
  "retry": {
411
537
  "maxAttempts": 3,
412
538
  "baseDelayMs": 1000,
@@ -415,9 +541,14 @@
415
541
  429,
416
542
  503
417
543
  ]
544
+ },
545
+ "pagination": {
546
+ "style": "link",
547
+ "totalCountHeader": "X-Total-Count",
548
+ "maxPageSize": 5
418
549
  }
419
550
  },
420
- "UpdateMessageType": {
551
+ "GetEverythingOpenCards": {
421
552
  "retry": {
422
553
  "maxAttempts": 3,
423
554
  "baseDelayMs": 1000,
@@ -427,11 +558,24 @@
427
558
  503
428
559
  ]
429
560
  },
430
- "idempotent": {
431
- "natural": true
561
+ "pagination": {
562
+ "style": "link",
563
+ "totalCountHeader": "X-Total-Count",
564
+ "maxPageSize": 5
432
565
  }
433
566
  },
434
- "DeleteMessageType": {
567
+ "GetEverythingOverdueCards": {
568
+ "retry": {
569
+ "maxAttempts": 3,
570
+ "baseDelayMs": 1000,
571
+ "backoff": "exponential",
572
+ "retryOn": [
573
+ 429,
574
+ 503
575
+ ]
576
+ }
577
+ },
578
+ "GetEverythingUnassignedCards": {
435
579
  "retry": {
436
580
  "maxAttempts": 3,
437
581
  "baseDelayMs": 1000,
@@ -441,8 +585,10 @@
441
585
  503
442
586
  ]
443
587
  },
444
- "idempotent": {
445
- "natural": true
588
+ "pagination": {
589
+ "style": "link",
590
+ "totalCountHeader": "X-Total-Count",
591
+ "maxPageSize": 5
446
592
  }
447
593
  },
448
594
  "ListCampfires": {
@@ -631,6 +777,22 @@
631
777
  ]
632
778
  }
633
779
  },
780
+ "GetEverythingCheckins": {
781
+ "retry": {
782
+ "maxAttempts": 3,
783
+ "baseDelayMs": 1000,
784
+ "backoff": "exponential",
785
+ "retryOn": [
786
+ 429,
787
+ 503
788
+ ]
789
+ },
790
+ "pagination": {
791
+ "style": "link",
792
+ "totalCountHeader": "X-Total-Count",
793
+ "maxPageSize": 50
794
+ }
795
+ },
634
796
  "ListPingablePeople": {
635
797
  "retry": {
636
798
  "maxAttempts": 3,
@@ -728,6 +890,22 @@
728
890
  ]
729
891
  }
730
892
  },
893
+ "GetEverythingComments": {
894
+ "retry": {
895
+ "maxAttempts": 3,
896
+ "baseDelayMs": 1000,
897
+ "backoff": "exponential",
898
+ "retryOn": [
899
+ 429,
900
+ 503
901
+ ]
902
+ },
903
+ "pagination": {
904
+ "style": "link",
905
+ "totalCountHeader": "X-Total-Count",
906
+ "maxPageSize": 50
907
+ }
908
+ },
731
909
  "GetComment": {
732
910
  "retry": {
733
911
  "maxAttempts": 3,
@@ -817,6 +995,38 @@
817
995
  "natural": true
818
996
  }
819
997
  },
998
+ "GetEverythingFiles": {
999
+ "retry": {
1000
+ "maxAttempts": 3,
1001
+ "baseDelayMs": 1000,
1002
+ "backoff": "exponential",
1003
+ "retryOn": [
1004
+ 429,
1005
+ 503
1006
+ ]
1007
+ },
1008
+ "pagination": {
1009
+ "style": "link",
1010
+ "totalCountHeader": "X-Total-Count",
1011
+ "maxPageSize": 50
1012
+ }
1013
+ },
1014
+ "GetEverythingForwards": {
1015
+ "retry": {
1016
+ "maxAttempts": 3,
1017
+ "baseDelayMs": 1000,
1018
+ "backoff": "exponential",
1019
+ "retryOn": [
1020
+ 429,
1021
+ 503
1022
+ ]
1023
+ },
1024
+ "pagination": {
1025
+ "style": "link",
1026
+ "totalCountHeader": "X-Total-Count",
1027
+ "maxPageSize": 50
1028
+ }
1029
+ },
820
1030
  "GetGaugeNeedle": {
821
1031
  "retry": {
822
1032
  "maxAttempts": 3,
@@ -1020,6 +1230,22 @@
1020
1230
  ]
1021
1231
  }
1022
1232
  },
1233
+ "GetEverythingMessages": {
1234
+ "retry": {
1235
+ "maxAttempts": 3,
1236
+ "baseDelayMs": 1000,
1237
+ "backoff": "exponential",
1238
+ "retryOn": [
1239
+ 429,
1240
+ 503
1241
+ ]
1242
+ },
1243
+ "pagination": {
1244
+ "style": "link",
1245
+ "totalCountHeader": "X-Total-Count",
1246
+ "maxPageSize": 50
1247
+ }
1248
+ },
1023
1249
  "GetMessage": {
1024
1250
  "retry": {
1025
1251
  "maxAttempts": 3,
@@ -1154,6 +1380,22 @@
1154
1380
  ]
1155
1381
  }
1156
1382
  },
1383
+ "GetBubbleUps": {
1384
+ "retry": {
1385
+ "maxAttempts": 3,
1386
+ "baseDelayMs": 1000,
1387
+ "backoff": "exponential",
1388
+ "retryOn": [
1389
+ 429,
1390
+ 503
1391
+ ]
1392
+ },
1393
+ "pagination": {
1394
+ "style": "link",
1395
+ "totalCountHeader": "X-Total-Count",
1396
+ "maxPageSize": 50
1397
+ }
1398
+ },
1157
1399
  "MarkAsRead": {
1158
1400
  "retry": {
1159
1401
  "maxAttempts": 2,
@@ -2332,6 +2574,81 @@
2332
2574
  ]
2333
2575
  }
2334
2576
  },
2577
+ "GetEverythingCompletedTodos": {
2578
+ "retry": {
2579
+ "maxAttempts": 3,
2580
+ "baseDelayMs": 1000,
2581
+ "backoff": "exponential",
2582
+ "retryOn": [
2583
+ 429,
2584
+ 503
2585
+ ]
2586
+ },
2587
+ "pagination": {
2588
+ "style": "link",
2589
+ "totalCountHeader": "X-Total-Count",
2590
+ "maxPageSize": 5
2591
+ }
2592
+ },
2593
+ "GetEverythingNoDueDateTodos": {
2594
+ "retry": {
2595
+ "maxAttempts": 3,
2596
+ "baseDelayMs": 1000,
2597
+ "backoff": "exponential",
2598
+ "retryOn": [
2599
+ 429,
2600
+ 503
2601
+ ]
2602
+ },
2603
+ "pagination": {
2604
+ "style": "link",
2605
+ "totalCountHeader": "X-Total-Count",
2606
+ "maxPageSize": 5
2607
+ }
2608
+ },
2609
+ "GetEverythingOpenTodos": {
2610
+ "retry": {
2611
+ "maxAttempts": 3,
2612
+ "baseDelayMs": 1000,
2613
+ "backoff": "exponential",
2614
+ "retryOn": [
2615
+ 429,
2616
+ 503
2617
+ ]
2618
+ },
2619
+ "pagination": {
2620
+ "style": "link",
2621
+ "totalCountHeader": "X-Total-Count",
2622
+ "maxPageSize": 5
2623
+ }
2624
+ },
2625
+ "GetEverythingOverdueTodos": {
2626
+ "retry": {
2627
+ "maxAttempts": 3,
2628
+ "baseDelayMs": 1000,
2629
+ "backoff": "exponential",
2630
+ "retryOn": [
2631
+ 429,
2632
+ 503
2633
+ ]
2634
+ }
2635
+ },
2636
+ "GetEverythingUnassignedTodos": {
2637
+ "retry": {
2638
+ "maxAttempts": 3,
2639
+ "baseDelayMs": 1000,
2640
+ "backoff": "exponential",
2641
+ "retryOn": [
2642
+ 429,
2643
+ 503
2644
+ ]
2645
+ },
2646
+ "pagination": {
2647
+ "style": "link",
2648
+ "totalCountHeader": "X-Total-Count",
2649
+ "maxPageSize": 5
2650
+ }
2651
+ },
2335
2652
  "GetTodo": {
2336
2653
  "retry": {
2337
2654
  "maxAttempts": 3,
@@ -2413,6 +2730,20 @@
2413
2730
  "natural": true
2414
2731
  }
2415
2732
  },
2733
+ "RepositionTodolist": {
2734
+ "retry": {
2735
+ "maxAttempts": 3,
2736
+ "baseDelayMs": 1000,
2737
+ "backoff": "exponential",
2738
+ "retryOn": [
2739
+ 429,
2740
+ 503
2741
+ ]
2742
+ },
2743
+ "idempotent": {
2744
+ "natural": true
2745
+ }
2746
+ },
2416
2747
  "GetTodoset": {
2417
2748
  "retry": {
2418
2749
  "maxAttempts": 3,
@@ -8,7 +8,7 @@ module Basecamp
8
8
  class AutomationService < BaseService
9
9
 
10
10
  # List all lineup markers for the account
11
- # @return [Hash] response data
11
+ # @return [Array<Hash>] response data
12
12
  def list_lineup_markers()
13
13
  with_operation(service: "automation", operation: "list_lineup_markers", is_mutation: false) do
14
14
  http_get("/lineup/markers.json").json
@@ -141,6 +141,19 @@ module Basecamp
141
141
  kwargs.compact
142
142
  end
143
143
 
144
+ # Like compact_params, but also drops empty arrays. For query filters an
145
+ # empty array means "no filter" and must be omitted entirely: Faraday's
146
+ # nested encoder would otherwise emit a bare `bucket_ids[]`, which Rails
147
+ # normalizes into a bogus `[0]` filter instead of the unfiltered request
148
+ # the caller intended. Not used for request bodies, where an explicit
149
+ # empty array (e.g. clearing a list) can be meaningful.
150
+ #
151
+ # @param hash [Hash] the input hash
152
+ # @return [Hash] hash with nil values and empty arrays removed
153
+ def compact_query_params(**kwargs)
154
+ kwargs.reject { |_, value| value.nil? || value == [] }
155
+ end
156
+
144
157
  # Build a bucket (project) path.
145
158
  # @param project_id [Integer, String] the project/bucket ID
146
159
  # @param path [String] the path suffix
@@ -86,7 +86,7 @@ module Basecamp
86
86
  # @return [Enumerator<Hash>] paginated results
87
87
  def list_lines(campfire_id:, sort: nil, direction: nil)
88
88
  wrap_paginated(service: "campfires", operation: "list_lines", is_mutation: false, resource_id: campfire_id) do
89
- params = compact_params(sort: sort, direction: direction)
89
+ params = compact_query_params(sort: sort, direction: direction)
90
90
  paginate("/chats/#{campfire_id}/lines.json", params: params)
91
91
  end
92
92
  end
@@ -142,7 +142,7 @@ module Basecamp
142
142
  # @return [Enumerator<Hash>] paginated results
143
143
  def list_uploads(campfire_id:, sort: nil, direction: nil)
144
144
  wrap_paginated(service: "campfires", operation: "list_uploads", is_mutation: false, resource_id: campfire_id) do
145
- params = compact_params(sort: sort, direction: direction)
145
+ params = compact_query_params(sort: sort, direction: direction)
146
146
  paginate("/chats/#{campfire_id}/uploads.json", params: params)
147
147
  end
148
148
  end
@@ -13,7 +13,7 @@ module Basecamp
13
13
  # @param color [String] Valid colors: white, red, orange, yellow, green, blue, aqua, purple, gray, pink, brown
14
14
  # @return [Hash] response data
15
15
  def set_color(bucket_id:, column_id:, color:)
16
- with_operation(service: "cardcolumns", operation: "set_color", is_mutation: true, resource_id: column_id) do
16
+ with_operation(service: "cardcolumns", operation: "set_color", is_mutation: true, project_id: bucket_id, resource_id: column_id) do
17
17
  http_put("/buckets/#{bucket_id}/card_tables/columns/#{column_id}/color.json", body: compact_params(color: color)).json
18
18
  end
19
19
  end
@@ -23,7 +23,7 @@ module Basecamp
23
23
  # @param column_id [Integer] column id ID
24
24
  # @return [Hash] response data
25
25
  def enable_on_hold(bucket_id:, column_id:)
26
- with_operation(service: "cardcolumns", operation: "enable_on_hold", is_mutation: true, resource_id: column_id) do
26
+ with_operation(service: "cardcolumns", operation: "enable_on_hold", is_mutation: true, project_id: bucket_id, resource_id: column_id) do
27
27
  http_post("/buckets/#{bucket_id}/card_tables/columns/#{column_id}/on_hold.json").json
28
28
  end
29
29
  end
@@ -33,7 +33,7 @@ module Basecamp
33
33
  # @param column_id [Integer] column id ID
34
34
  # @return [Hash] response data
35
35
  def disable_on_hold(bucket_id:, column_id:)
36
- with_operation(service: "cardcolumns", operation: "disable_on_hold", is_mutation: true, resource_id: column_id) do
36
+ with_operation(service: "cardcolumns", operation: "disable_on_hold", is_mutation: true, project_id: bucket_id, resource_id: column_id) do
37
37
  http_delete("/buckets/#{bucket_id}/card_tables/columns/#{column_id}/on_hold.json").json
38
38
  end
39
39
  end
@@ -23,8 +23,8 @@ module Basecamp
23
23
  # @param due_on [String, nil] due on (YYYY-MM-DD)
24
24
  # @param assignee_ids [Array, nil] assignee ids
25
25
  # @return [Hash] response data
26
- def update(card_id:, title: nil, content: nil, due_on: nil, assignee_ids: nil)
27
- with_operation(service: "cards", operation: "update", is_mutation: true, resource_id: card_id) do
26
+ def update_verbatim(card_id:, title: nil, content: nil, due_on: nil, assignee_ids: nil)
27
+ with_operation(service: "cards", operation: "update_verbatim", is_mutation: true, resource_id: card_id) do
28
28
  http_put("/card_tables/cards/#{card_id}", body: compact_params(title: title, content: content, due_on: due_on, assignee_ids: assignee_ids)).json
29
29
  end
30
30
  end
@@ -57,11 +57,12 @@ module Basecamp
57
57
  # Create a new question in a questionnaire
58
58
  # @param questionnaire_id [Integer] questionnaire id ID
59
59
  # @param title [String] title
60
- # @param schedule [String] schedule
60
+ # @param schedule [Hash] schedule
61
+ # @param visible_to_clients [Boolean, nil] visible to clients
61
62
  # @return [Hash] response data
62
- def create_question(questionnaire_id:, title:, schedule:)
63
+ def create_question(questionnaire_id:, title:, schedule:, visible_to_clients: nil)
63
64
  with_operation(service: "checkins", operation: "create_question", is_mutation: true, resource_id: questionnaire_id) do
64
- http_post("/questionnaires/#{questionnaire_id}/questions.json", body: compact_params(title: title, schedule: schedule)).json
65
+ http_post("/questionnaires/#{questionnaire_id}/questions.json", body: compact_params(title: title, schedule: schedule, visible_to_clients: visible_to_clients)).json
65
66
  end
66
67
  end
67
68
 
@@ -77,7 +78,7 @@ module Basecamp
77
78
  # Update an existing question
78
79
  # @param question_id [Integer] question id ID
79
80
  # @param title [String, nil] title
80
- # @param schedule [String, nil] schedule
81
+ # @param schedule [Hash, nil] schedule
81
82
  # @param paused [Boolean, nil] paused
82
83
  # @return [Hash] response data
83
84
  def update_question(question_id:, title: nil, schedule: nil, paused: nil)
@@ -13,7 +13,7 @@ module Basecamp
13
13
  # @return [Enumerator<Hash>] paginated results
14
14
  def list(sort: nil, direction: nil)
15
15
  wrap_paginated(service: "clientapprovals", operation: "list", is_mutation: false) do
16
- params = compact_params(sort: sort, direction: direction)
16
+ params = compact_query_params(sort: sort, direction: direction)
17
17
  paginate("/client/approvals.json", params: params)
18
18
  end
19
19
  end
@@ -13,7 +13,7 @@ module Basecamp
13
13
  # @return [Enumerator<Hash>] paginated results
14
14
  def list(sort: nil, direction: nil)
15
15
  wrap_paginated(service: "clientcorrespondences", operation: "list", is_mutation: false) do
16
- params = compact_params(sort: sort, direction: direction)
16
+ params = compact_query_params(sort: sort, direction: direction)
17
17
  paginate("/client/correspondences.json", params: params)
18
18
  end
19
19
  end
@@ -42,10 +42,11 @@ module Basecamp
42
42
  # @param content [String, nil] content
43
43
  # @param status [String, nil] active|drafted
44
44
  # @param subscriptions [Array, nil] subscriptions
45
+ # @param visible_to_clients [Boolean, nil] visible to clients
45
46
  # @return [Hash] response data
46
- def create(vault_id:, title:, content: nil, status: nil, subscriptions: nil)
47
+ def create(vault_id:, title:, content: nil, status: nil, subscriptions: nil, visible_to_clients: nil)
47
48
  with_operation(service: "documents", operation: "create", is_mutation: true, resource_id: vault_id) do
48
- http_post("/vaults/#{vault_id}/documents.json", body: compact_params(title: title, content: content, status: status, subscriptions: subscriptions)).json
49
+ http_post("/vaults/#{vault_id}/documents.json", body: compact_params(title: title, content: content, status: status, subscriptions: subscriptions, visible_to_clients: visible_to_clients)).json
49
50
  end
50
51
  end
51
52
  end