basecamp-sdk 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/basecamp/client.rb +20 -0
- data/lib/basecamp/generated/metadata.json +172 -1
- data/lib/basecamp/generated/services/bookmarks_service.rb +49 -0
- data/lib/basecamp/generated/services/calendars_service.rb +30 -0
- data/lib/basecamp/generated/services/drafts_service.rb +21 -0
- data/lib/basecamp/generated/services/everything_service.rb +55 -22
- data/lib/basecamp/generated/services/my_assignments_service.rb +31 -0
- data/lib/basecamp/generated/services/my_notes_service.rb +28 -0
- data/lib/basecamp/generated/services/todos_service.rb +17 -0
- data/lib/basecamp/generated/types.rb +313 -1
- data/lib/basecamp/version.rb +2 -2
- data/scripts/generate-services.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 99e64617bcf9bcf031f03ea1ae0311f37f46c5da4ac4fba9caeca9a768e44a22
|
|
4
|
+
data.tar.gz: 83dd4b5a6d15ffc7909121dc742e2ccbaf9d1159d2b743a8482bb5a1cd17241f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1e5ce39f93f07dad1c1b79b2da9ac39db5ac70e8871eba73af86a92eb986d56f5b4002af55c40eb16a8f4bed14d2407ead7c1be3b5c817664dcf5033397db7eb
|
|
7
|
+
data.tar.gz: 5263d6241a9de95303c8a546efe7f412db59def57207a0e0f8c22c45ab06d0b40b4d2c05e7b4d7ab05e02d7cb451246a5ccb5c4992afb52127541b464dbeeb3e
|
data/lib/basecamp/client.rb
CHANGED
|
@@ -481,6 +481,26 @@ module Basecamp
|
|
|
481
481
|
service(:tools) { Services::ToolsService.new(self) }
|
|
482
482
|
end
|
|
483
483
|
|
|
484
|
+
# @return [Services::BookmarksService]
|
|
485
|
+
def bookmarks
|
|
486
|
+
service(:bookmarks) { Services::BookmarksService.new(self) }
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
# @return [Services::DraftsService]
|
|
490
|
+
def drafts
|
|
491
|
+
service(:drafts) { Services::DraftsService.new(self) }
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
# @return [Services::CalendarsService]
|
|
495
|
+
def calendars
|
|
496
|
+
service(:calendars) { Services::CalendarsService.new(self) }
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
# @return [Services::MyNotesService]
|
|
500
|
+
def my_notes
|
|
501
|
+
service(:my_notes) { Services::MyNotesService.new(self) }
|
|
502
|
+
end
|
|
503
|
+
|
|
484
504
|
# @return [Services::SubscriptionsService]
|
|
485
505
|
def subscriptions
|
|
486
506
|
service(:subscriptions) { Services::SubscriptionsService.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-
|
|
4
|
+
"generated": "2026-07-31T15:59:31Z",
|
|
5
5
|
"operations": {
|
|
6
6
|
"GetAccount": {
|
|
7
7
|
"retry": {
|
|
@@ -250,6 +250,17 @@
|
|
|
250
250
|
]
|
|
251
251
|
}
|
|
252
252
|
},
|
|
253
|
+
"CreateTodosetTodo": {
|
|
254
|
+
"retry": {
|
|
255
|
+
"maxAttempts": 3,
|
|
256
|
+
"baseDelayMs": 1000,
|
|
257
|
+
"backoff": "exponential",
|
|
258
|
+
"retryOn": [
|
|
259
|
+
429,
|
|
260
|
+
503
|
|
261
|
+
]
|
|
262
|
+
}
|
|
263
|
+
},
|
|
253
264
|
"ListWebhooks": {
|
|
254
265
|
"retry": {
|
|
255
266
|
"maxAttempts": 3,
|
|
@@ -277,6 +288,31 @@
|
|
|
277
288
|
]
|
|
278
289
|
}
|
|
279
290
|
},
|
|
291
|
+
"GetCalendar": {
|
|
292
|
+
"retry": {
|
|
293
|
+
"maxAttempts": 3,
|
|
294
|
+
"baseDelayMs": 1000,
|
|
295
|
+
"backoff": "exponential",
|
|
296
|
+
"retryOn": [
|
|
297
|
+
429,
|
|
298
|
+
503
|
|
299
|
+
]
|
|
300
|
+
}
|
|
301
|
+
},
|
|
302
|
+
"UpdateCalendar": {
|
|
303
|
+
"retry": {
|
|
304
|
+
"maxAttempts": 3,
|
|
305
|
+
"baseDelayMs": 1000,
|
|
306
|
+
"backoff": "exponential",
|
|
307
|
+
"retryOn": [
|
|
308
|
+
429,
|
|
309
|
+
503
|
|
310
|
+
]
|
|
311
|
+
},
|
|
312
|
+
"idempotent": {
|
|
313
|
+
"natural": true
|
|
314
|
+
}
|
|
315
|
+
},
|
|
280
316
|
"GetCard": {
|
|
281
317
|
"retry": {
|
|
282
318
|
"maxAttempts": 3,
|
|
@@ -1291,6 +1327,63 @@
|
|
|
1291
1327
|
]
|
|
1292
1328
|
}
|
|
1293
1329
|
},
|
|
1330
|
+
"ListMyBookmarks": {
|
|
1331
|
+
"retry": {
|
|
1332
|
+
"maxAttempts": 3,
|
|
1333
|
+
"baseDelayMs": 1000,
|
|
1334
|
+
"backoff": "exponential",
|
|
1335
|
+
"retryOn": [
|
|
1336
|
+
429,
|
|
1337
|
+
503
|
|
1338
|
+
]
|
|
1339
|
+
},
|
|
1340
|
+
"pagination": {
|
|
1341
|
+
"style": "link",
|
|
1342
|
+
"totalCountHeader": "X-Total-Count",
|
|
1343
|
+
"maxPageSize": 50
|
|
1344
|
+
}
|
|
1345
|
+
},
|
|
1346
|
+
"ListMyDrafts": {
|
|
1347
|
+
"retry": {
|
|
1348
|
+
"maxAttempts": 3,
|
|
1349
|
+
"baseDelayMs": 1000,
|
|
1350
|
+
"backoff": "exponential",
|
|
1351
|
+
"retryOn": [
|
|
1352
|
+
429,
|
|
1353
|
+
503
|
|
1354
|
+
]
|
|
1355
|
+
},
|
|
1356
|
+
"pagination": {
|
|
1357
|
+
"style": "link",
|
|
1358
|
+
"totalCountHeader": "X-Total-Count",
|
|
1359
|
+
"maxPageSize": 50
|
|
1360
|
+
}
|
|
1361
|
+
},
|
|
1362
|
+
"GetMyNote": {
|
|
1363
|
+
"retry": {
|
|
1364
|
+
"maxAttempts": 3,
|
|
1365
|
+
"baseDelayMs": 1000,
|
|
1366
|
+
"backoff": "exponential",
|
|
1367
|
+
"retryOn": [
|
|
1368
|
+
429,
|
|
1369
|
+
503
|
|
1370
|
+
]
|
|
1371
|
+
}
|
|
1372
|
+
},
|
|
1373
|
+
"UpdateMyNote": {
|
|
1374
|
+
"retry": {
|
|
1375
|
+
"maxAttempts": 3,
|
|
1376
|
+
"baseDelayMs": 1000,
|
|
1377
|
+
"backoff": "exponential",
|
|
1378
|
+
"retryOn": [
|
|
1379
|
+
429,
|
|
1380
|
+
503
|
|
1381
|
+
]
|
|
1382
|
+
},
|
|
1383
|
+
"idempotent": {
|
|
1384
|
+
"natural": true
|
|
1385
|
+
}
|
|
1386
|
+
},
|
|
1294
1387
|
"GetMyPreferences": {
|
|
1295
1388
|
"retry": {
|
|
1296
1389
|
"maxAttempts": 3,
|
|
@@ -1316,6 +1409,45 @@
|
|
|
1316
1409
|
"natural": true
|
|
1317
1410
|
}
|
|
1318
1411
|
},
|
|
1412
|
+
"PrioritizeAssignment": {
|
|
1413
|
+
"retry": {
|
|
1414
|
+
"maxAttempts": 3,
|
|
1415
|
+
"baseDelayMs": 1000,
|
|
1416
|
+
"backoff": "exponential",
|
|
1417
|
+
"retryOn": [
|
|
1418
|
+
429,
|
|
1419
|
+
503
|
|
1420
|
+
]
|
|
1421
|
+
},
|
|
1422
|
+
"idempotent": {
|
|
1423
|
+
"natural": true
|
|
1424
|
+
}
|
|
1425
|
+
},
|
|
1426
|
+
"DeprioritizeAssignment": {
|
|
1427
|
+
"retry": {
|
|
1428
|
+
"maxAttempts": 3,
|
|
1429
|
+
"baseDelayMs": 1000,
|
|
1430
|
+
"backoff": "exponential",
|
|
1431
|
+
"retryOn": [
|
|
1432
|
+
429,
|
|
1433
|
+
503
|
|
1434
|
+
]
|
|
1435
|
+
},
|
|
1436
|
+
"idempotent": {
|
|
1437
|
+
"natural": true
|
|
1438
|
+
}
|
|
1439
|
+
},
|
|
1440
|
+
"ReorderUpNext": {
|
|
1441
|
+
"retry": {
|
|
1442
|
+
"maxAttempts": 3,
|
|
1443
|
+
"baseDelayMs": 1000,
|
|
1444
|
+
"backoff": "exponential",
|
|
1445
|
+
"retryOn": [
|
|
1446
|
+
429,
|
|
1447
|
+
503
|
|
1448
|
+
]
|
|
1449
|
+
}
|
|
1450
|
+
},
|
|
1319
1451
|
"GetMyProfile": {
|
|
1320
1452
|
"retry": {
|
|
1321
1453
|
"maxAttempts": 3,
|
|
@@ -1868,6 +2000,45 @@
|
|
|
1868
2000
|
]
|
|
1869
2001
|
}
|
|
1870
2002
|
},
|
|
2003
|
+
"GetBookmark": {
|
|
2004
|
+
"retry": {
|
|
2005
|
+
"maxAttempts": 3,
|
|
2006
|
+
"baseDelayMs": 1000,
|
|
2007
|
+
"backoff": "exponential",
|
|
2008
|
+
"retryOn": [
|
|
2009
|
+
429,
|
|
2010
|
+
503
|
|
2011
|
+
]
|
|
2012
|
+
}
|
|
2013
|
+
},
|
|
2014
|
+
"CreateBookmark": {
|
|
2015
|
+
"retry": {
|
|
2016
|
+
"maxAttempts": 3,
|
|
2017
|
+
"baseDelayMs": 1000,
|
|
2018
|
+
"backoff": "exponential",
|
|
2019
|
+
"retryOn": [
|
|
2020
|
+
429,
|
|
2021
|
+
503
|
|
2022
|
+
]
|
|
2023
|
+
},
|
|
2024
|
+
"idempotent": {
|
|
2025
|
+
"natural": true
|
|
2026
|
+
}
|
|
2027
|
+
},
|
|
2028
|
+
"DeleteBookmark": {
|
|
2029
|
+
"retry": {
|
|
2030
|
+
"maxAttempts": 3,
|
|
2031
|
+
"baseDelayMs": 1000,
|
|
2032
|
+
"backoff": "exponential",
|
|
2033
|
+
"retryOn": [
|
|
2034
|
+
429,
|
|
2035
|
+
503
|
|
2036
|
+
]
|
|
2037
|
+
},
|
|
2038
|
+
"idempotent": {
|
|
2039
|
+
"natural": true
|
|
2040
|
+
}
|
|
2041
|
+
},
|
|
1871
2042
|
"ListRecordingBoosts": {
|
|
1872
2043
|
"retry": {
|
|
1873
2044
|
"maxAttempts": 3,
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Basecamp
|
|
4
|
+
module Services
|
|
5
|
+
# Service for Bookmarks operations
|
|
6
|
+
#
|
|
7
|
+
# @generated from OpenAPI spec
|
|
8
|
+
class BookmarksService < BaseService
|
|
9
|
+
|
|
10
|
+
# List the current user's bookmarks, most recently bookmarked first (paginated).
|
|
11
|
+
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
12
|
+
# @return [Enumerator<Hash>] paginated results
|
|
13
|
+
def list_my_bookmarks(page: nil)
|
|
14
|
+
wrap_paginated(service: "bookmarks", operation: "list_my_bookmarks", is_mutation: false) do
|
|
15
|
+
params = compact_query_params(page: page)
|
|
16
|
+
paginate("/my/bookmarks.json", params: params, operation: "ListMyBookmarks")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Report whether the current user has bookmarked the recording.
|
|
21
|
+
# @param recording_id [Integer] recording id ID
|
|
22
|
+
# @return [Hash] response data
|
|
23
|
+
def get_bookmark(recording_id:)
|
|
24
|
+
with_operation(service: "bookmarks", operation: "get_bookmark", is_mutation: false, resource_id: recording_id) do
|
|
25
|
+
http_get("/recordings/#{recording_id}/bookmark.json", operation: "GetBookmark").json
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Bookmark a recording for the current user.
|
|
30
|
+
# @param recording_id [Integer] recording id ID
|
|
31
|
+
# @return [Hash] response data
|
|
32
|
+
def create_bookmark(recording_id:)
|
|
33
|
+
with_operation(service: "bookmarks", operation: "create_bookmark", is_mutation: true, resource_id: recording_id) do
|
|
34
|
+
http_post("/recordings/#{recording_id}/bookmark.json").json
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Remove the current user's bookmark from a recording (returns 204 No Content).
|
|
39
|
+
# @param recording_id [Integer] recording id ID
|
|
40
|
+
# @return [void]
|
|
41
|
+
def delete_bookmark(recording_id:)
|
|
42
|
+
with_operation(service: "bookmarks", operation: "delete_bookmark", is_mutation: true, resource_id: recording_id) do
|
|
43
|
+
http_delete("/recordings/#{recording_id}/bookmark.json")
|
|
44
|
+
nil
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Basecamp
|
|
4
|
+
module Services
|
|
5
|
+
# Service for Calendars operations
|
|
6
|
+
#
|
|
7
|
+
# @generated from OpenAPI spec
|
|
8
|
+
class CalendarsService < BaseService
|
|
9
|
+
|
|
10
|
+
# Get a calendar by its bucket id. A Calendar is a top-level BC5 bucketable
|
|
11
|
+
# @param calendar_id [Integer] calendar id ID
|
|
12
|
+
# @return [Hash] response data
|
|
13
|
+
def get_calendar(calendar_id:)
|
|
14
|
+
with_operation(service: "calendars", operation: "get_calendar", is_mutation: false, resource_id: calendar_id) do
|
|
15
|
+
http_get("/calendars/#{calendar_id}", operation: "GetCalendar").json
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Update a calendar's display color. An unknown color returns 422 with a JSON
|
|
20
|
+
# @param calendar_id [Integer] calendar id ID
|
|
21
|
+
# @param calendar [Hash] calendar
|
|
22
|
+
# @return [Hash] response data
|
|
23
|
+
def update_calendar(calendar_id:, calendar:)
|
|
24
|
+
with_operation(service: "calendars", operation: "update_calendar", is_mutation: true, resource_id: calendar_id) do
|
|
25
|
+
http_put("/calendars/#{calendar_id}", body: compact_params(calendar: calendar)).json
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Basecamp
|
|
4
|
+
module Services
|
|
5
|
+
# Service for Drafts operations
|
|
6
|
+
#
|
|
7
|
+
# @generated from OpenAPI spec
|
|
8
|
+
class DraftsService < BaseService
|
|
9
|
+
|
|
10
|
+
# List the current user's drafts across their active projects, most recently
|
|
11
|
+
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
12
|
+
# @return [Enumerator<Hash>] paginated results
|
|
13
|
+
def list_my_drafts(page: nil)
|
|
14
|
+
wrap_paginated(service: "drafts", operation: "list_my_drafts", is_mutation: false) do
|
|
15
|
+
params = compact_query_params(page: page)
|
|
16
|
+
paginate("/my/drafts.json", params: params, operation: "ListMyDrafts")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -8,59 +8,77 @@ module Basecamp
|
|
|
8
8
|
class EverythingService < BaseService
|
|
9
9
|
|
|
10
10
|
# Completed cards across all accessible projects, grouped by project (paginated).
|
|
11
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
12
|
+
# Assignees on nested steps are not considered.
|
|
13
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
11
14
|
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
12
15
|
# @return [Enumerator<Hash>] paginated results
|
|
13
|
-
def get_everything_completed_cards(page: nil)
|
|
16
|
+
def get_everything_completed_cards(assignee_ids: nil, due: nil, page: nil)
|
|
14
17
|
wrap_paginated(service: "everything", operation: "get_everything_completed_cards", is_mutation: false) do
|
|
15
|
-
params = compact_query_params(page: page)
|
|
18
|
+
params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
|
|
16
19
|
paginate("/cards/completed.json", params: params, operation: "GetEverythingCompletedCards")
|
|
17
20
|
end
|
|
18
21
|
end
|
|
19
22
|
|
|
20
23
|
# Open cards with no due date across all accessible projects, grouped by project (paginated).
|
|
24
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
25
|
+
# Assignees on nested steps are not considered.
|
|
26
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
21
27
|
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
22
28
|
# @return [Enumerator<Hash>] paginated results
|
|
23
|
-
def get_everything_no_due_date_cards(page: nil)
|
|
29
|
+
def get_everything_no_due_date_cards(assignee_ids: nil, due: nil, page: nil)
|
|
24
30
|
wrap_paginated(service: "everything", operation: "get_everything_no_due_date_cards", is_mutation: false) do
|
|
25
|
-
params = compact_query_params(page: page)
|
|
31
|
+
params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
|
|
26
32
|
paginate("/cards/no_due_date.json", params: params, operation: "GetEverythingNoDueDateCards")
|
|
27
33
|
end
|
|
28
34
|
end
|
|
29
35
|
|
|
30
36
|
# Cards parked in a project's "Not now" column across all accessible projects, grouped by project (paginated).
|
|
37
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
38
|
+
# Assignees on nested steps are not considered.
|
|
39
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
31
40
|
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
32
41
|
# @return [Enumerator<Hash>] paginated results
|
|
33
|
-
def get_everything_not_now_cards(page: nil)
|
|
42
|
+
def get_everything_not_now_cards(assignee_ids: nil, due: nil, page: nil)
|
|
34
43
|
wrap_paginated(service: "everything", operation: "get_everything_not_now_cards", is_mutation: false) do
|
|
35
|
-
params = compact_query_params(page: page)
|
|
44
|
+
params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
|
|
36
45
|
paginate("/cards/not_now.json", params: params, operation: "GetEverythingNotNowCards")
|
|
37
46
|
end
|
|
38
47
|
end
|
|
39
48
|
|
|
40
49
|
# Incomplete cards in active columns across all accessible projects, grouped by project (paginated).
|
|
50
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
51
|
+
# Assignees on nested steps are not considered.
|
|
52
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
41
53
|
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
42
54
|
# @return [Enumerator<Hash>] paginated results
|
|
43
|
-
def get_everything_open_cards(page: nil)
|
|
55
|
+
def get_everything_open_cards(assignee_ids: nil, due: nil, page: nil)
|
|
44
56
|
wrap_paginated(service: "everything", operation: "get_everything_open_cards", is_mutation: false) do
|
|
45
|
-
params = compact_query_params(page: page)
|
|
57
|
+
params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
|
|
46
58
|
paginate("/cards/open.json", params: params, operation: "GetEverythingOpenCards")
|
|
47
59
|
end
|
|
48
60
|
end
|
|
49
61
|
|
|
50
62
|
# Get every overdue card across all accessible projects, oldest-due-date-first.
|
|
63
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
64
|
+
# Assignees on nested steps are not considered.
|
|
65
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
51
66
|
# @return [Array<Hash>] response data
|
|
52
|
-
def get_everything_overdue_cards()
|
|
67
|
+
def get_everything_overdue_cards(assignee_ids: nil, due: nil)
|
|
53
68
|
with_operation(service: "everything", operation: "get_everything_overdue_cards", is_mutation: false) do
|
|
54
|
-
http_get("/cards/overdue.json", operation: "GetEverythingOverdueCards").json
|
|
69
|
+
http_get("/cards/overdue.json", params: compact_query_params(assignee_ids: assignee_ids, due: due), operation: "GetEverythingOverdueCards").json
|
|
55
70
|
end
|
|
56
71
|
end
|
|
57
72
|
|
|
58
73
|
# Open, unassigned cards across all accessible projects, grouped by project (paginated).
|
|
74
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
75
|
+
# Assignees on nested steps are not considered.
|
|
76
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
59
77
|
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
60
78
|
# @return [Enumerator<Hash>] paginated results
|
|
61
|
-
def get_everything_unassigned_cards(page: nil)
|
|
79
|
+
def get_everything_unassigned_cards(assignee_ids: nil, due: nil, page: nil)
|
|
62
80
|
wrap_paginated(service: "everything", operation: "get_everything_unassigned_cards", is_mutation: false) do
|
|
63
|
-
params = compact_query_params(page: page)
|
|
81
|
+
params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
|
|
64
82
|
paginate("/cards/unassigned.json", params: params, operation: "GetEverythingUnassignedCards")
|
|
65
83
|
end
|
|
66
84
|
end
|
|
@@ -118,49 +136,64 @@ module Basecamp
|
|
|
118
136
|
end
|
|
119
137
|
|
|
120
138
|
# Completed to-dos across all accessible projects, grouped by project (paginated).
|
|
139
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
140
|
+
# Assignees on nested steps are not considered.
|
|
141
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
121
142
|
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
122
143
|
# @return [Enumerator<Hash>] paginated results
|
|
123
|
-
def get_everything_completed_todos(page: nil)
|
|
144
|
+
def get_everything_completed_todos(assignee_ids: nil, due: nil, page: nil)
|
|
124
145
|
wrap_paginated(service: "everything", operation: "get_everything_completed_todos", is_mutation: false) do
|
|
125
|
-
params = compact_query_params(page: page)
|
|
146
|
+
params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
|
|
126
147
|
paginate("/todos/completed.json", params: params, operation: "GetEverythingCompletedTodos")
|
|
127
148
|
end
|
|
128
149
|
end
|
|
129
150
|
|
|
130
151
|
# Open to-dos with no due date across all accessible projects, grouped by project (paginated).
|
|
152
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
153
|
+
# Assignees on nested steps are not considered.
|
|
154
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
131
155
|
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
132
156
|
# @return [Enumerator<Hash>] paginated results
|
|
133
|
-
def get_everything_no_due_date_todos(page: nil)
|
|
157
|
+
def get_everything_no_due_date_todos(assignee_ids: nil, due: nil, page: nil)
|
|
134
158
|
wrap_paginated(service: "everything", operation: "get_everything_no_due_date_todos", is_mutation: false) do
|
|
135
|
-
params = compact_query_params(page: page)
|
|
159
|
+
params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
|
|
136
160
|
paginate("/todos/no_due_date.json", params: params, operation: "GetEverythingNoDueDateTodos")
|
|
137
161
|
end
|
|
138
162
|
end
|
|
139
163
|
|
|
140
164
|
# Active, incomplete to-dos across all accessible projects, grouped by project (paginated).
|
|
165
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
166
|
+
# Assignees on nested steps are not considered.
|
|
167
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
141
168
|
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
142
169
|
# @return [Enumerator<Hash>] paginated results
|
|
143
|
-
def get_everything_open_todos(page: nil)
|
|
170
|
+
def get_everything_open_todos(assignee_ids: nil, due: nil, page: nil)
|
|
144
171
|
wrap_paginated(service: "everything", operation: "get_everything_open_todos", is_mutation: false) do
|
|
145
|
-
params = compact_query_params(page: page)
|
|
172
|
+
params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
|
|
146
173
|
paginate("/todos/open.json", params: params, operation: "GetEverythingOpenTodos")
|
|
147
174
|
end
|
|
148
175
|
end
|
|
149
176
|
|
|
150
177
|
# Get every overdue to-do across all accessible projects, oldest-due-date-first.
|
|
178
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
179
|
+
# Assignees on nested steps are not considered.
|
|
180
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
151
181
|
# @return [Array<Hash>] response data
|
|
152
|
-
def get_everything_overdue_todos()
|
|
182
|
+
def get_everything_overdue_todos(assignee_ids: nil, due: nil)
|
|
153
183
|
with_operation(service: "everything", operation: "get_everything_overdue_todos", is_mutation: false) do
|
|
154
|
-
http_get("/todos/overdue.json", operation: "GetEverythingOverdueTodos").json
|
|
184
|
+
http_get("/todos/overdue.json", params: compact_query_params(assignee_ids: assignee_ids, due: due), operation: "GetEverythingOverdueTodos").json
|
|
155
185
|
end
|
|
156
186
|
end
|
|
157
187
|
|
|
158
188
|
# Open, unassigned to-dos across all accessible projects, grouped by project (paginated).
|
|
189
|
+
# @param assignee_ids [Array, nil] Restrict to tasks assigned to at least one of the given people (repeatable).
|
|
190
|
+
# Assignees on nested steps are not considered.
|
|
191
|
+
# @param due [String, nil] Filter by due date: with, without, or overdue. Unrecognized values are ignored.
|
|
159
192
|
# @param page [Integer, nil] Page number for paginating through results. Defaults to 1.
|
|
160
193
|
# @return [Enumerator<Hash>] paginated results
|
|
161
|
-
def get_everything_unassigned_todos(page: nil)
|
|
194
|
+
def get_everything_unassigned_todos(assignee_ids: nil, due: nil, page: nil)
|
|
162
195
|
wrap_paginated(service: "everything", operation: "get_everything_unassigned_todos", is_mutation: false) do
|
|
163
|
-
params = compact_query_params(page: page)
|
|
196
|
+
params = compact_query_params(assignee_ids: assignee_ids, due: due, page: page)
|
|
164
197
|
paginate("/todos/unassigned.json", params: params, operation: "GetEverythingUnassignedTodos")
|
|
165
198
|
end
|
|
166
199
|
end
|
|
@@ -32,6 +32,37 @@ module Basecamp
|
|
|
32
32
|
http_get("/my/assignments/due.json", params: compact_query_params(scope: scope), operation: "GetMyDueAssignments").json
|
|
33
33
|
end
|
|
34
34
|
end
|
|
35
|
+
|
|
36
|
+
# Add a recording to Up Next — the current user's ordered list of prioritized
|
|
37
|
+
# @param id [Integer] The recording id to prioritize.
|
|
38
|
+
# @return [void]
|
|
39
|
+
def prioritize_assignment(id:)
|
|
40
|
+
with_operation(service: "myassignments", operation: "prioritize_assignment", is_mutation: true) do
|
|
41
|
+
http_post("/my/priorities.json", body: compact_params(id: id))
|
|
42
|
+
nil
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Remove a recording from Up Next (returns 204 No Content). Exact-target:
|
|
47
|
+
# @param recording_id [Integer] recording id ID
|
|
48
|
+
# @return [void]
|
|
49
|
+
def deprioritize_assignment(recording_id:)
|
|
50
|
+
with_operation(service: "myassignments", operation: "deprioritize_assignment", is_mutation: true, resource_id: recording_id) do
|
|
51
|
+
http_delete("/my/priorities/#{recording_id}")
|
|
52
|
+
nil
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Move an already-prioritized recording to a new 1-based position in Up Next
|
|
57
|
+
# @param source_id [Integer] The recording id to move, chosen the same way as when prioritizing.
|
|
58
|
+
# @param position [Integer] The 1-based position to move it to.
|
|
59
|
+
# @return [void]
|
|
60
|
+
def reorder_up_next(source_id:, position:)
|
|
61
|
+
with_operation(service: "myassignments", operation: "reorder_up_next", is_mutation: true) do
|
|
62
|
+
http_post("/my/priority_moves.json", body: compact_params(source_id: source_id, position: position))
|
|
63
|
+
nil
|
|
64
|
+
end
|
|
65
|
+
end
|
|
35
66
|
end
|
|
36
67
|
end
|
|
37
68
|
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Basecamp
|
|
4
|
+
module Services
|
|
5
|
+
# Service for MyNotes operations
|
|
6
|
+
#
|
|
7
|
+
# @generated from OpenAPI spec
|
|
8
|
+
class MyNotesService < BaseService
|
|
9
|
+
|
|
10
|
+
# Get the authenticated user's note — a per-person notebook singleton at
|
|
11
|
+
# @return [Hash] response data
|
|
12
|
+
def get_my_note()
|
|
13
|
+
with_operation(service: "mynotes", operation: "get_my_note", is_mutation: false) do
|
|
14
|
+
http_get("/my/notes.json", operation: "GetMyNote").json
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Replace the note's content, recording a new revision server-side. The first
|
|
19
|
+
# @param note [Hash] note
|
|
20
|
+
# @return [Hash] response data
|
|
21
|
+
def update_my_note(note:)
|
|
22
|
+
with_operation(service: "mynotes", operation: "update_my_note", is_mutation: true) do
|
|
23
|
+
http_put("/my/notes.json", body: compact_params(note: note)).json
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -7,6 +7,23 @@ module Basecamp
|
|
|
7
7
|
# @generated from OpenAPI spec
|
|
8
8
|
class TodosService < BaseService
|
|
9
9
|
|
|
10
|
+
# Create a to-do directly under a project's to-do set, outside any to-do list.
|
|
11
|
+
# @param bucket_id [Integer] bucket id ID
|
|
12
|
+
# @param todoset_id [Integer] todoset id ID
|
|
13
|
+
# @param content [String] content
|
|
14
|
+
# @param description [String, nil] description
|
|
15
|
+
# @param assignee_ids [Array, nil] assignee ids
|
|
16
|
+
# @param completion_subscriber_ids [Array, nil] completion subscriber ids
|
|
17
|
+
# @param notify [Boolean, nil] notify
|
|
18
|
+
# @param due_on [String, nil] due on (YYYY-MM-DD)
|
|
19
|
+
# @param starts_on [String, nil] starts on (YYYY-MM-DD)
|
|
20
|
+
# @return [Hash] response data
|
|
21
|
+
def create_todoset_todo(bucket_id:, todoset_id:, content:, description: nil, assignee_ids: nil, completion_subscriber_ids: nil, notify: nil, due_on: nil, starts_on: nil)
|
|
22
|
+
with_operation(service: "todos", operation: "create_todoset_todo", is_mutation: true, project_id: bucket_id, resource_id: todoset_id) do
|
|
23
|
+
http_post("/buckets/#{bucket_id}/todosets/#{todoset_id}/todos.json", body: compact_params(content: content, description: description, assignee_ids: assignee_ids, completion_subscriber_ids: completion_subscriber_ids, notify: notify, due_on: due_on, starts_on: starts_on)).json
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
10
27
|
# List todos in a todolist
|
|
11
28
|
# @param todolist_id [Integer] todolist id ID
|
|
12
29
|
# @param status [String, nil] active|archived|trashed
|
|
@@ -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-
|
|
4
|
+
# Generated: 2026-07-31T15:59:31Z
|
|
5
5
|
|
|
6
6
|
require "json"
|
|
7
7
|
require "time"
|
|
@@ -255,6 +255,62 @@ module Basecamp
|
|
|
255
255
|
end
|
|
256
256
|
end
|
|
257
257
|
|
|
258
|
+
# Bookmark
|
|
259
|
+
class Bookmark
|
|
260
|
+
include TypeHelpers
|
|
261
|
+
attr_accessor :created_at, :id, :recording, :updated_at
|
|
262
|
+
|
|
263
|
+
# @return [Array<Symbol>]
|
|
264
|
+
def self.required_fields
|
|
265
|
+
%i[created_at id recording updated_at].freeze
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def initialize(data = {})
|
|
269
|
+
@created_at = parse_datetime(data["created_at"])
|
|
270
|
+
@id = parse_integer(data["id"])
|
|
271
|
+
@recording = parse_type(data["recording"], "Recording")
|
|
272
|
+
@updated_at = parse_datetime(data["updated_at"])
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def to_h
|
|
276
|
+
{
|
|
277
|
+
"created_at" => @created_at,
|
|
278
|
+
"id" => @id,
|
|
279
|
+
"recording" => @recording,
|
|
280
|
+
"updated_at" => @updated_at,
|
|
281
|
+
}.compact
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def to_json(*args)
|
|
285
|
+
to_h.to_json(*args)
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# BookmarkStatus
|
|
290
|
+
class BookmarkStatus
|
|
291
|
+
include TypeHelpers
|
|
292
|
+
attr_accessor :bookmarked
|
|
293
|
+
|
|
294
|
+
# @return [Array<Symbol>]
|
|
295
|
+
def self.required_fields
|
|
296
|
+
%i[bookmarked].freeze
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def initialize(data = {})
|
|
300
|
+
@bookmarked = parse_boolean(data["bookmarked"])
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def to_h
|
|
304
|
+
{
|
|
305
|
+
"bookmarked" => @bookmarked,
|
|
306
|
+
}.compact
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def to_json(*args)
|
|
310
|
+
to_h.to_json(*args)
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
|
|
258
314
|
# Boost
|
|
259
315
|
class Boost
|
|
260
316
|
include TypeHelpers
|
|
@@ -342,6 +398,72 @@ module Basecamp
|
|
|
342
398
|
end
|
|
343
399
|
end
|
|
344
400
|
|
|
401
|
+
# Calendar
|
|
402
|
+
class Calendar
|
|
403
|
+
include TypeHelpers
|
|
404
|
+
attr_accessor :app_url, :color, :created_at, :id, :name, :schedule_url, :type, :updated_at, :url
|
|
405
|
+
|
|
406
|
+
# @return [Array<Symbol>]
|
|
407
|
+
def self.required_fields
|
|
408
|
+
%i[app_url color created_at id name schedule_url type updated_at url].freeze
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
def initialize(data = {})
|
|
412
|
+
@app_url = data["app_url"]
|
|
413
|
+
@color = data["color"]
|
|
414
|
+
@created_at = parse_datetime(data["created_at"])
|
|
415
|
+
@id = parse_integer(data["id"])
|
|
416
|
+
@name = data["name"]
|
|
417
|
+
@schedule_url = data["schedule_url"]
|
|
418
|
+
@type = data["type"]
|
|
419
|
+
@updated_at = parse_datetime(data["updated_at"])
|
|
420
|
+
@url = data["url"]
|
|
421
|
+
end
|
|
422
|
+
|
|
423
|
+
def to_h
|
|
424
|
+
{
|
|
425
|
+
"app_url" => @app_url,
|
|
426
|
+
"color" => @color,
|
|
427
|
+
"created_at" => @created_at,
|
|
428
|
+
"id" => @id,
|
|
429
|
+
"name" => @name,
|
|
430
|
+
"schedule_url" => @schedule_url,
|
|
431
|
+
"type" => @type,
|
|
432
|
+
"updated_at" => @updated_at,
|
|
433
|
+
"url" => @url,
|
|
434
|
+
}.compact
|
|
435
|
+
end
|
|
436
|
+
|
|
437
|
+
def to_json(*args)
|
|
438
|
+
to_h.to_json(*args)
|
|
439
|
+
end
|
|
440
|
+
end
|
|
441
|
+
|
|
442
|
+
# CalendarAttributes
|
|
443
|
+
class CalendarAttributes
|
|
444
|
+
include TypeHelpers
|
|
445
|
+
attr_accessor :color
|
|
446
|
+
|
|
447
|
+
# @return [Array<Symbol>]
|
|
448
|
+
def self.required_fields
|
|
449
|
+
%i[color].freeze
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
def initialize(data = {})
|
|
453
|
+
@color = data["color"]
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
def to_h
|
|
457
|
+
{
|
|
458
|
+
"color" => @color,
|
|
459
|
+
}.compact
|
|
460
|
+
end
|
|
461
|
+
|
|
462
|
+
def to_json(*args)
|
|
463
|
+
to_h.to_json(*args)
|
|
464
|
+
end
|
|
465
|
+
end
|
|
466
|
+
|
|
345
467
|
# Campfire
|
|
346
468
|
class Campfire
|
|
347
469
|
include TypeHelpers
|
|
@@ -1351,6 +1473,107 @@ module Basecamp
|
|
|
1351
1473
|
end
|
|
1352
1474
|
end
|
|
1353
1475
|
|
|
1476
|
+
# Draft
|
|
1477
|
+
class Draft
|
|
1478
|
+
include TypeHelpers
|
|
1479
|
+
attr_accessor :app_url, :bucket, :created_at, :excerpt, :id, :parent, :scheduled_posting_at, :title, :type, :updated_at
|
|
1480
|
+
|
|
1481
|
+
# @return [Array<Symbol>]
|
|
1482
|
+
def self.required_fields
|
|
1483
|
+
%i[app_url bucket created_at excerpt id parent scheduled_posting_at title type updated_at].freeze
|
|
1484
|
+
end
|
|
1485
|
+
|
|
1486
|
+
def initialize(data = {})
|
|
1487
|
+
@app_url = data["app_url"]
|
|
1488
|
+
@bucket = parse_type(data["bucket"], "DraftBucket")
|
|
1489
|
+
@created_at = parse_datetime(data["created_at"])
|
|
1490
|
+
@excerpt = data["excerpt"]
|
|
1491
|
+
@id = parse_integer(data["id"])
|
|
1492
|
+
@parent = data["parent"]
|
|
1493
|
+
@scheduled_posting_at = data["scheduled_posting_at"]
|
|
1494
|
+
@title = data["title"]
|
|
1495
|
+
@type = data["type"]
|
|
1496
|
+
@updated_at = parse_datetime(data["updated_at"])
|
|
1497
|
+
end
|
|
1498
|
+
|
|
1499
|
+
def to_h
|
|
1500
|
+
{
|
|
1501
|
+
"app_url" => @app_url,
|
|
1502
|
+
"bucket" => @bucket,
|
|
1503
|
+
"created_at" => @created_at,
|
|
1504
|
+
"excerpt" => @excerpt,
|
|
1505
|
+
"id" => @id,
|
|
1506
|
+
"parent" => @parent,
|
|
1507
|
+
"scheduled_posting_at" => @scheduled_posting_at,
|
|
1508
|
+
"title" => @title,
|
|
1509
|
+
"type" => @type,
|
|
1510
|
+
"updated_at" => @updated_at,
|
|
1511
|
+
}.reject { |k, v| v.nil? && !["scheduled_posting_at"].include?(k) }
|
|
1512
|
+
end
|
|
1513
|
+
|
|
1514
|
+
def to_json(*args)
|
|
1515
|
+
to_h.to_json(*args)
|
|
1516
|
+
end
|
|
1517
|
+
end
|
|
1518
|
+
|
|
1519
|
+
# DraftBucket
|
|
1520
|
+
class DraftBucket
|
|
1521
|
+
include TypeHelpers
|
|
1522
|
+
attr_accessor :app_url, :id, :name
|
|
1523
|
+
|
|
1524
|
+
# @return [Array<Symbol>]
|
|
1525
|
+
def self.required_fields
|
|
1526
|
+
%i[app_url id name].freeze
|
|
1527
|
+
end
|
|
1528
|
+
|
|
1529
|
+
def initialize(data = {})
|
|
1530
|
+
@app_url = data["app_url"]
|
|
1531
|
+
@id = parse_integer(data["id"])
|
|
1532
|
+
@name = data["name"]
|
|
1533
|
+
end
|
|
1534
|
+
|
|
1535
|
+
def to_h
|
|
1536
|
+
{
|
|
1537
|
+
"app_url" => @app_url,
|
|
1538
|
+
"id" => @id,
|
|
1539
|
+
"name" => @name,
|
|
1540
|
+
}.compact
|
|
1541
|
+
end
|
|
1542
|
+
|
|
1543
|
+
def to_json(*args)
|
|
1544
|
+
to_h.to_json(*args)
|
|
1545
|
+
end
|
|
1546
|
+
end
|
|
1547
|
+
|
|
1548
|
+
# DraftParent
|
|
1549
|
+
class DraftParent
|
|
1550
|
+
include TypeHelpers
|
|
1551
|
+
attr_accessor :app_url, :id, :title
|
|
1552
|
+
|
|
1553
|
+
# @return [Array<Symbol>]
|
|
1554
|
+
def self.required_fields
|
|
1555
|
+
%i[app_url id title].freeze
|
|
1556
|
+
end
|
|
1557
|
+
|
|
1558
|
+
def initialize(data = {})
|
|
1559
|
+
@app_url = data["app_url"]
|
|
1560
|
+
@id = parse_integer(data["id"])
|
|
1561
|
+
@title = data["title"]
|
|
1562
|
+
end
|
|
1563
|
+
|
|
1564
|
+
def to_h
|
|
1565
|
+
{
|
|
1566
|
+
"app_url" => @app_url,
|
|
1567
|
+
"id" => @id,
|
|
1568
|
+
"title" => @title,
|
|
1569
|
+
}.compact
|
|
1570
|
+
end
|
|
1571
|
+
|
|
1572
|
+
def to_json(*args)
|
|
1573
|
+
to_h.to_json(*args)
|
|
1574
|
+
end
|
|
1575
|
+
end
|
|
1576
|
+
|
|
1354
1577
|
# Event
|
|
1355
1578
|
class Event
|
|
1356
1579
|
include TypeHelpers
|
|
@@ -1496,6 +1719,31 @@ module Basecamp
|
|
|
1496
1719
|
end
|
|
1497
1720
|
end
|
|
1498
1721
|
|
|
1722
|
+
# FieldKeyedErrors
|
|
1723
|
+
class FieldKeyedErrors
|
|
1724
|
+
include TypeHelpers
|
|
1725
|
+
attr_accessor :errors
|
|
1726
|
+
|
|
1727
|
+
# @return [Array<Symbol>]
|
|
1728
|
+
def self.required_fields
|
|
1729
|
+
%i[errors].freeze
|
|
1730
|
+
end
|
|
1731
|
+
|
|
1732
|
+
def initialize(data = {})
|
|
1733
|
+
@errors = parse_type(data["errors"], "FieldErrorMap")
|
|
1734
|
+
end
|
|
1735
|
+
|
|
1736
|
+
def to_h
|
|
1737
|
+
{
|
|
1738
|
+
"errors" => @errors,
|
|
1739
|
+
}.compact
|
|
1740
|
+
end
|
|
1741
|
+
|
|
1742
|
+
def to_json(*args)
|
|
1743
|
+
to_h.to_json(*args)
|
|
1744
|
+
end
|
|
1745
|
+
end
|
|
1746
|
+
|
|
1499
1747
|
# Forward
|
|
1500
1748
|
class Forward
|
|
1501
1749
|
include TypeHelpers
|
|
@@ -2279,6 +2527,70 @@ module Basecamp
|
|
|
2279
2527
|
end
|
|
2280
2528
|
end
|
|
2281
2529
|
|
|
2530
|
+
# MyNote
|
|
2531
|
+
class MyNote
|
|
2532
|
+
include TypeHelpers
|
|
2533
|
+
attr_accessor :app_url, :content, :content_attachments, :created_at, :id, :type, :updated_at, :url
|
|
2534
|
+
|
|
2535
|
+
# @return [Array<Symbol>]
|
|
2536
|
+
def self.required_fields
|
|
2537
|
+
%i[app_url content content_attachments created_at id type updated_at url].freeze
|
|
2538
|
+
end
|
|
2539
|
+
|
|
2540
|
+
def initialize(data = {})
|
|
2541
|
+
@app_url = data["app_url"]
|
|
2542
|
+
@content = data["content"]
|
|
2543
|
+
@content_attachments = parse_array(data["content_attachments"], "RichTextAttachment")
|
|
2544
|
+
@created_at = data["created_at"]
|
|
2545
|
+
@id = data["id"]
|
|
2546
|
+
@type = data["type"]
|
|
2547
|
+
@updated_at = data["updated_at"]
|
|
2548
|
+
@url = data["url"]
|
|
2549
|
+
end
|
|
2550
|
+
|
|
2551
|
+
def to_h
|
|
2552
|
+
{
|
|
2553
|
+
"app_url" => @app_url,
|
|
2554
|
+
"content" => @content,
|
|
2555
|
+
"content_attachments" => @content_attachments,
|
|
2556
|
+
"created_at" => @created_at,
|
|
2557
|
+
"id" => @id,
|
|
2558
|
+
"type" => @type,
|
|
2559
|
+
"updated_at" => @updated_at,
|
|
2560
|
+
"url" => @url,
|
|
2561
|
+
}.reject { |k, v| v.nil? && !["created_at", "id", "updated_at"].include?(k) }
|
|
2562
|
+
end
|
|
2563
|
+
|
|
2564
|
+
def to_json(*args)
|
|
2565
|
+
to_h.to_json(*args)
|
|
2566
|
+
end
|
|
2567
|
+
end
|
|
2568
|
+
|
|
2569
|
+
# MyNoteAttributes
|
|
2570
|
+
class MyNoteAttributes
|
|
2571
|
+
include TypeHelpers
|
|
2572
|
+
attr_accessor :content
|
|
2573
|
+
|
|
2574
|
+
# @return [Array<Symbol>]
|
|
2575
|
+
def self.required_fields
|
|
2576
|
+
%i[content].freeze
|
|
2577
|
+
end
|
|
2578
|
+
|
|
2579
|
+
def initialize(data = {})
|
|
2580
|
+
@content = data["content"]
|
|
2581
|
+
end
|
|
2582
|
+
|
|
2583
|
+
def to_h
|
|
2584
|
+
{
|
|
2585
|
+
"content" => @content,
|
|
2586
|
+
}.compact
|
|
2587
|
+
end
|
|
2588
|
+
|
|
2589
|
+
def to_json(*args)
|
|
2590
|
+
to_h.to_json(*args)
|
|
2591
|
+
end
|
|
2592
|
+
end
|
|
2593
|
+
|
|
2282
2594
|
# Notification
|
|
2283
2595
|
class Notification
|
|
2284
2596
|
include TypeHelpers
|
data/lib/basecamp/version.rb
CHANGED
|
@@ -116,7 +116,7 @@ class ServiceGenerator
|
|
|
116
116
|
'ClientVisibility' => %w[SetClientVisibility]
|
|
117
117
|
},
|
|
118
118
|
'Todos' => {
|
|
119
|
-
'Todos' => %w[ListTodos CreateTodo GetTodo ReplaceTodo CompleteTodo UncompleteTodo TrashTodo],
|
|
119
|
+
'Todos' => %w[ListTodos CreateTodo CreateTodosetTodo GetTodo ReplaceTodo CompleteTodo UncompleteTodo TrashTodo],
|
|
120
120
|
'Todolists' => %w[GetTodolistOrGroup UpdateTodolistOrGroup ListTodolists CreateTodolist RepositionTodolist],
|
|
121
121
|
'Todosets' => %w[GetTodoset],
|
|
122
122
|
'HillCharts' => %w[GetHillChart UpdateHillChartSettings],
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: basecamp-sdk
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.12.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Basecamp
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-
|
|
11
|
+
date: 2026-08-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: faraday
|
|
@@ -182,7 +182,9 @@ files:
|
|
|
182
182
|
- lib/basecamp/generated/services/attachments_service.rb
|
|
183
183
|
- lib/basecamp/generated/services/automation_service.rb
|
|
184
184
|
- lib/basecamp/generated/services/base_service.rb
|
|
185
|
+
- lib/basecamp/generated/services/bookmarks_service.rb
|
|
185
186
|
- lib/basecamp/generated/services/boosts_service.rb
|
|
187
|
+
- lib/basecamp/generated/services/calendars_service.rb
|
|
186
188
|
- lib/basecamp/generated/services/campfires_service.rb
|
|
187
189
|
- lib/basecamp/generated/services/card_columns_service.rb
|
|
188
190
|
- lib/basecamp/generated/services/card_steps_service.rb
|
|
@@ -195,6 +197,7 @@ files:
|
|
|
195
197
|
- lib/basecamp/generated/services/client_visibility_service.rb
|
|
196
198
|
- lib/basecamp/generated/services/comments_service.rb
|
|
197
199
|
- lib/basecamp/generated/services/documents_service.rb
|
|
200
|
+
- lib/basecamp/generated/services/drafts_service.rb
|
|
198
201
|
- lib/basecamp/generated/services/events_service.rb
|
|
199
202
|
- lib/basecamp/generated/services/everything_service.rb
|
|
200
203
|
- lib/basecamp/generated/services/forwards_service.rb
|
|
@@ -205,6 +208,7 @@ files:
|
|
|
205
208
|
- lib/basecamp/generated/services/message_types_service.rb
|
|
206
209
|
- lib/basecamp/generated/services/messages_service.rb
|
|
207
210
|
- lib/basecamp/generated/services/my_assignments_service.rb
|
|
211
|
+
- lib/basecamp/generated/services/my_notes_service.rb
|
|
208
212
|
- lib/basecamp/generated/services/my_notifications_service.rb
|
|
209
213
|
- lib/basecamp/generated/services/people_service.rb
|
|
210
214
|
- lib/basecamp/generated/services/projects_service.rb
|