Skip to content

Commit cf3fb23

Browse files
authored
feat: Add dependency_sbom rate limit support (#3908)
1 parent a427207 commit cf3fb23

File tree

6 files changed

+69
-3
lines changed

6 files changed

+69
-3
lines changed

github/github-accessors.go

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

github/github-accessors_test.go

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

github/github.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,6 +1527,7 @@ const (
15271527
DependencySnapshotsCategory
15281528
CodeSearchCategory
15291529
AuditLogCategory
1530+
DependencySBOMCategory
15301531

15311532
Categories // An array of this length will be able to contain all rate limit categories.
15321533
)
@@ -1577,6 +1578,11 @@ func GetRateLimitCategory(method, path string) RateLimitCategory {
15771578
// https://docs.github.com/en/enterprise-cloud@latest/rest/orgs/orgs?apiVersion=2022-11-28#get-the-audit-log-for-an-organization
15781579
case strings.HasSuffix(path, "/audit-log"):
15791580
return AuditLogCategory
1581+
1582+
// https://docs.github.com/en/rest/dependency-graph/sboms?apiVersion=2022-11-28#export-a-software-bill-of-materials-sbom-for-a-repository
1583+
case strings.HasPrefix(path, "/repos/") &&
1584+
strings.HasSuffix(path, "/dependency-graph/sbom"):
1585+
return DependencySBOMCategory
15801586
}
15811587
}
15821588

github/github_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,6 +1328,11 @@ func TestDo_rateLimitCategory(t *testing.T) {
13281328
url: "/orgs/google/audit-log",
13291329
category: AuditLogCategory,
13301330
},
1331+
{
1332+
method: "GET",
1333+
url: "/repos/google/go-github/dependency-graph/sbom",
1334+
category: DependencySBOMCategory,
1335+
},
13311336
// missing a check for actionsRunnerRegistrationCategory: API not found
13321337
}
13331338

github/rate_limit.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ type RateLimits struct {
6363
DependencySnapshots *Rate `json:"dependency_snapshots"`
6464
CodeSearch *Rate `json:"code_search"`
6565
AuditLog *Rate `json:"audit_log"`
66+
DependencySBOM *Rate `json:"dependency_sbom"`
6667
}
6768

6869
func (r RateLimits) String() string {
@@ -126,6 +127,9 @@ func (s *RateLimitService) Get(ctx context.Context) (*RateLimits, *Response, err
126127
if response.Resources.AuditLog != nil {
127128
s.client.rateLimits[AuditLogCategory] = *response.Resources.AuditLog
128129
}
130+
if response.Resources.DependencySBOM != nil {
131+
s.client.rateLimits[DependencySBOMCategory] = *response.Resources.DependencySBOM
132+
}
129133
s.client.rateMu.Unlock()
130134
}
131135

github/rate_limit_test.go

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ func TestRateLimits_String(t *testing.T) {
2828
DependencySnapshots: &Rate{},
2929
CodeSearch: &Rate{},
3030
AuditLog: &Rate{},
31+
DependencySBOM: &Rate{},
3132
}
32-
want := `github.RateLimits{Core:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, Search:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, GraphQL:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, IntegrationManifest:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, SourceImport:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, CodeScanningUpload:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, ActionsRunnerRegistration:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, SCIM:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, DependencySnapshots:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, CodeSearch:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, AuditLog:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}}`
33+
want := `github.RateLimits{Core:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, Search:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, GraphQL:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, IntegrationManifest:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, SourceImport:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, CodeScanningUpload:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, ActionsRunnerRegistration:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, SCIM:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, DependencySnapshots:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, CodeSearch:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, AuditLog:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}, DependencySBOM:github.Rate{Limit:0, Remaining:0, Used:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Resource:""}}`
3334
if got := v.String(); got != want {
3435
t.Errorf("RateLimits.String = %v, want %v", got, want)
3536
}
@@ -52,7 +53,8 @@ func TestRateLimits(t *testing.T) {
5253
"scim": {"limit":9,"remaining":8,"used":1,"reset":1372700880},
5354
"dependency_snapshots": {"limit":10,"remaining":9,"used":1,"reset":1372700881},
5455
"code_search": {"limit":11,"remaining":10,"used":1,"reset":1372700882},
55-
"audit_log": {"limit": 12,"remaining":11,"used":1,"reset":1372700883}
56+
"audit_log": {"limit": 12,"remaining":11,"used":1,"reset":1372700883},
57+
"dependency_sbom": {"limit": 100,"remaining":100,"used":0,"reset":1372700884}
5658
}}`)
5759
})
5860

@@ -129,6 +131,12 @@ func TestRateLimits(t *testing.T) {
129131
Used: 1,
130132
Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 3, 0, time.UTC).Local()},
131133
},
134+
DependencySBOM: &Rate{
135+
Limit: 100,
136+
Remaining: 100,
137+
Used: 0,
138+
Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 4, 0, time.UTC).Local()},
139+
},
132140
}
133141
if !cmp.Equal(rate, want) {
134142
t.Errorf("RateLimits returned %+v, want %+v", rate, want)
@@ -181,6 +189,10 @@ func TestRateLimits(t *testing.T) {
181189
category: AuditLogCategory,
182190
rate: want.AuditLog,
183191
},
192+
{
193+
category: DependencySBOMCategory,
194+
rate: want.DependencySBOM,
195+
},
184196
}
185197

186198
for _, tt := range tests {
@@ -225,7 +237,8 @@ func TestRateLimits_overQuota(t *testing.T) {
225237
"scim": {"limit":9,"remaining":8,"used":1,"reset":1372700880},
226238
"dependency_snapshots": {"limit":10,"remaining":9,"used":1,"reset":1372700881},
227239
"code_search": {"limit":11,"remaining":10,"used":1,"reset":1372700882},
228-
"audit_log": {"limit":12,"remaining":11,"used":1,"reset":1372700883}
240+
"audit_log": {"limit":12,"remaining":11,"used":1,"reset":1372700883},
241+
"dependency_sbom": {"limit":13,"remaining":12,"used":1,"reset":1372700884}
229242
}}`)
230243
})
231244

@@ -302,6 +315,12 @@ func TestRateLimits_overQuota(t *testing.T) {
302315
Used: 1,
303316
Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 3, 0, time.UTC).Local()},
304317
},
318+
DependencySBOM: &Rate{
319+
Limit: 13,
320+
Remaining: 12,
321+
Used: 1,
322+
Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 4, 0, time.UTC).Local()},
323+
},
305324
}
306325
if !cmp.Equal(rate, want) {
307326
t.Errorf("RateLimits returned %+v, want %+v", rate, want)
@@ -355,6 +374,10 @@ func TestRateLimits_overQuota(t *testing.T) {
355374
category: AuditLogCategory,
356375
rate: want.AuditLog,
357376
},
377+
{
378+
category: DependencySBOMCategory,
379+
rate: want.DependencySBOM,
380+
},
358381
}
359382
for _, tt := range tests {
360383
if got, want := client.rateLimits[tt.category], *tt.rate; got != want {
@@ -434,6 +457,12 @@ func TestRateLimits_Marshal(t *testing.T) {
434457
Used: 0,
435458
Reset: Timestamp{referenceTime},
436459
},
460+
DependencySBOM: &Rate{
461+
Limit: 1,
462+
Remaining: 1,
463+
Used: 0,
464+
Reset: Timestamp{referenceTime},
465+
},
437466
}
438467

439468
want := `{
@@ -502,6 +531,12 @@ func TestRateLimits_Marshal(t *testing.T) {
502531
"remaining": 1,
503532
"used": 0,
504533
"reset": ` + referenceTimeStr + `
534+
},
535+
"dependency_sbom": {
536+
"limit": 1,
537+
"remaining": 1,
538+
"used": 0,
539+
"reset": ` + referenceTimeStr + `
505540
}
506541
}`
507542

0 commit comments

Comments
 (0)