Skip to content

Commit a54bc7d

Browse files
authored
Use metadata to reconcile go-github with GitHub's OpenAPI descriptions (#2919)
1 parent 5b34ea7 commit a54bc7d

File tree

189 files changed

+10969
-16146
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

189 files changed

+10969
-16146
lines changed

.codecov.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ ignore:
33
- "github/github-accessors.go"
44
# ignore experimental scrape package
55
- "scrape"
6-
# ignore update-urls
7-
- "update-urls"
6+
# ignore tools
7+
- "tools"

.github/dependabot.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ updates:
99
schedule:
1010
interval: weekly
1111
- package-ecosystem: gomod
12-
directory: update-urls
12+
directory: tools
1313
schedule:
1414
interval: weekly
1515
- package-ecosystem: github-actions

.github/workflows/linter.yml

+3
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@ jobs:
1414
go-version: 1.x
1515
cache-dependency-path: "**/go.sum"
1616
- run: script/lint.sh
17+
env:
18+
CHECK_GITHUB_OPENAPI: 1
19+
GITHUB_TOKEN: ${{ github.token }}

.golangci.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,4 @@ issues:
5050
# We don't care about file inclusion via variable in examples or internal tools.
5151
- linters: [ gosec ]
5252
text: 'G304: Potential file inclusion via variable'
53-
path: '^(example|update-urls)\/'
53+
path: '^(example|tools)\/'

CONTRIBUTING.md

+114-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
# How to contribute #
1+
# How to contribute
22

33
We'd love to accept your patches and contributions to this project. There are
44
a just a few small guidelines you need to follow.
55

6-
7-
## Contributor License Agreement ##
6+
## Contributor License Agreement
87

98
Contributions to any Google project must be accompanied by a Contributor
109
License Agreement. This is not a copyright **assignment**, it simply gives
@@ -17,7 +16,7 @@ You generally only need to submit a CLA once, so if you've already submitted one
1716
again.
1817

1918

20-
## Reporting issues ##
19+
## Reporting issues
2120

2221
Bugs, feature requests, and development-related questions should be directed to
2322
our [GitHub issue tracker](https://github.com/google/go-github/issues). If
@@ -29,7 +28,7 @@ how the requested feature would help you do that.
2928
Security related bugs can either be reported in the issue tracker, or if they
3029
are more sensitive, emailed to <[email protected]>.
3130

32-
## Submitting a patch ##
31+
## Submitting a patch
3332

3433
1. It's generally best to start by opening a new issue describing the bug or
3534
feature you're intending to fix. Even if you think it's relatively minor,
@@ -73,7 +72,112 @@ are more sensitive, emailed to <[email protected]>.
7372
[pull request]: https://help.github.com/articles/creating-a-pull-request
7473
[monitored by codecov.io]: https://codecov.io/gh/google/go-github
7574

76-
## Scripts ##
75+
## Code Comments
76+
77+
Every exported method needs to have code comments that follow
78+
[Go Doc Comments][]. A typical method's comments will look like this:
79+
80+
```go
81+
// Get fetches a repository.
82+
//
83+
// GitHub API docs: https://docs.github.com/rest/repos/repos#get-a-repository
84+
//
85+
//meta:operation GET /repos/{owner}/{repo}
86+
func (s *RepositoriesService) Get(ctx context.Context, owner, repo string) (*Repository, *Response, error) {
87+
u := fmt.Sprintf("repos/%v/%v", owner, repo)
88+
req, err := s.client.NewRequest("GET", u, nil)
89+
...
90+
}
91+
```
92+
93+
The first line is the name of the method followed by a short description. This
94+
could also be a longer description if needed, but there is no need to repeat any
95+
details that are documented in GitHub's documentation because users are expected
96+
to follow the documentation links to learn more.
97+
98+
After the description comes a link to the GitHub API documentation. This is
99+
added or fixed automatically when you run `script/generate.sh`, so you won't
100+
need to set this yourself.
101+
102+
Finally, the `//meta:operation` comment is a directive to the code generator
103+
that maps the method to the corresponding OpenAPI operation. Once again, there
104+
can be multiple directives for methods that call multiple
105+
endpoints. `script/generate.sh` will normalize these directives for you, so if
106+
you are adding a new method you can use the pattern from the `u := fmt.Sprintf`
107+
line instead of looking up what the url parameters are called in the OpenAPI
108+
description.
109+
110+
[Go Doc Comments]: https://go.dev/doc/comment
111+
112+
## Metadata
113+
114+
GitHub publishes [OpenAPI descriptions of their API][]. We use these
115+
descriptions to keep documentation links up to date and to keep track of which
116+
methods call which endpoints via the `//meta:operation` comments described
117+
above. GitHub's descriptions are far too large to keep in this repository or to
118+
pull down every time we generate code, so we keep only the metadata we need
119+
in `openapi_operations.yaml`.
120+
121+
### openapi_operations.yaml
122+
123+
Most contributors won't need to interact with `openapi_operations.yaml`, but it
124+
may be useful to know what it is. Its sections are:
125+
126+
- `openapi_operations` - is the metadata that comes from GitHub's OpenAPI
127+
descriptions. It is generated by `script/metadata.sh update-openapi` and
128+
should not be edited by hand. In the rare case where it needs to be
129+
overridden, use the `operation_overrides` section instead.
130+
131+
An operation consists of `name`, `documentation_url`,
132+
and `openapi_files`. `openapi_files` is the list of files where the operation
133+
is described. In order or preference, values can be "api.github.com.json" for
134+
operations available on the free plan, "ghec.json" for operations available on
135+
GitHub Enterprise Cloud or "ghes-<version>.json" for operations available on
136+
GitHub Enterprise Server. When an operation is described in multiple ghes
137+
files, only the most recent version is included. `documentation_url` is the
138+
URL that should be linked from godoc. It is the documentation link found in
139+
the first file listed in `openapi_files`.
140+
141+
- `openapi_commit` - is the git commit that `script/metadata.sh update-openapi`
142+
saw when it last updated `openapi_operations`. It is not necessarily the most
143+
recent commit seen because `update-openapi` doesn't update the file when
144+
there are no changes to `openapi_operations`.
145+
146+
- `operations` - contains manually added metadata that is not in GitHub's
147+
OpenAPI descriptions. There are only a few of these. Some have
148+
documentation_urls that point to relevant GitHub documentation that is not in
149+
the OpenAPI descriptions. Others have no documentation_url and result in a
150+
note in the generated code that the documentation is missing.
151+
152+
- `operation_overrides` - is where we override the documentation_url for
153+
operations where the link in the OpenAPI descriptions is wrong.
154+
155+
### tools/metadata
156+
157+
The `tools/metadata` package is a command-line tool for working with metadata.
158+
In a typical workflow, you won't use it directly, but you will use it indirectly
159+
through `script/generate.sh` and `script/lint.sh`.
160+
161+
Its subcommands are:
162+
163+
- `update-openapi` - updates `openapi_operations.yaml` with the latest
164+
information from GitHub's OpenAPI descriptions. With `--validate` it will
165+
validate that the descriptions are correct as of the commit
166+
in `openapi_commit`. `update-openapi --validate` is called
167+
by `script/lint.sh`.
168+
169+
- `update-go` - updates Go files with documentation URLs and formats comments.
170+
It is used by `script/generate.sh`.
171+
172+
- `format` - formats whitespace in `openapi_operations.yaml` and sorts its
173+
arrays. It is used by `script/fmt.sh`.
174+
175+
- `unused` - lists operations from `openapi_operations.yaml` that are not mapped
176+
from any methods.
177+
178+
[OpenAPI descriptions of their API]: https://github.com/github/rest-api-description
179+
180+
## Scripts
77181

78182
The `script` directory has shell scripts that help with common development
79183
tasks.
@@ -86,6 +190,9 @@ tasks.
86190
**script/lint.sh** runs linters on the project and checks generated files are
87191
current.
88192

193+
**script/metadata.sh** runs `tools/metadata`. See the [Metadata](#metadata)
194+
section for more information.
195+
89196
**script/test.sh** runs tests on all modules.
90197

91198
## Other notes on code organization ##
@@ -104,7 +211,7 @@ defined at <https://docs.github.com/en/rest/webhooks/repos> live in
104211
[repos_hooks.go]: https://github.com/google/go-github/blob/master/github/repos_hooks.go
105212

106213

107-
## Maintainer's Guide ##
214+
## Maintainer's Guide
108215

109216
(These notes are mostly only for people merging in pull requests.)
110217

github/actions.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ package github
88
// ActionsService handles communication with the actions related
99
// methods of the GitHub API.
1010
//
11-
// GitHub API docs: https://docs.github.com/en/rest/actions/
11+
// GitHub API docs: https://docs.github.com/rest/actions/
1212
type ActionsService service

github/actions_artifacts.go

+18-8
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414

1515
// ArtifactWorkflowRun represents a GitHub artifact's workflow run.
1616
//
17-
// GitHub API docs: https://docs.github.com/en/rest/actions/artifacts
17+
// GitHub API docs: https://docs.github.com/rest/actions/artifacts
1818
type ArtifactWorkflowRun struct {
1919
ID *int64 `json:"id,omitempty"`
2020
RepositoryID *int64 `json:"repository_id,omitempty"`
@@ -27,7 +27,7 @@ type ArtifactWorkflowRun struct {
2727
// data between jobs in a workflow and provide storage for data
2828
// once a workflow is complete.
2929
//
30-
// GitHub API docs: https://docs.github.com/en/rest/actions/artifacts
30+
// GitHub API docs: https://docs.github.com/rest/actions/artifacts
3131
type Artifact struct {
3232
ID *int64 `json:"id,omitempty"`
3333
NodeID *string `json:"node_id,omitempty"`
@@ -44,15 +44,17 @@ type Artifact struct {
4444

4545
// ArtifactList represents a list of GitHub artifacts.
4646
//
47-
// GitHub API docs: https://docs.github.com/en/rest/actions/artifacts#artifacts
47+
// GitHub API docs: https://docs.github.com/rest/actions/artifacts#artifacts
4848
type ArtifactList struct {
4949
TotalCount *int64 `json:"total_count,omitempty"`
5050
Artifacts []*Artifact `json:"artifacts,omitempty"`
5151
}
5252

5353
// ListArtifacts lists all artifacts that belong to a repository.
5454
//
55-
// GitHub API docs: https://docs.github.com/en/rest/actions/artifacts#list-artifacts-for-a-repository
55+
// GitHub API docs: https://docs.github.com/rest/actions/artifacts#list-artifacts-for-a-repository
56+
//
57+
//meta:operation GET /repos/{owner}/{repo}/actions/artifacts
5658
func (s *ActionsService) ListArtifacts(ctx context.Context, owner, repo string, opts *ListOptions) (*ArtifactList, *Response, error) {
5759
u := fmt.Sprintf("repos/%v/%v/actions/artifacts", owner, repo)
5860
u, err := addOptions(u, opts)
@@ -76,7 +78,9 @@ func (s *ActionsService) ListArtifacts(ctx context.Context, owner, repo string,
7678

7779
// ListWorkflowRunArtifacts lists all artifacts that belong to a workflow run.
7880
//
79-
// GitHub API docs: https://docs.github.com/en/rest/actions/artifacts#list-workflow-run-artifacts
81+
// GitHub API docs: https://docs.github.com/rest/actions/artifacts#list-workflow-run-artifacts
82+
//
83+
//meta:operation GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts
8084
func (s *ActionsService) ListWorkflowRunArtifacts(ctx context.Context, owner, repo string, runID int64, opts *ListOptions) (*ArtifactList, *Response, error) {
8185
u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/artifacts", owner, repo, runID)
8286
u, err := addOptions(u, opts)
@@ -100,7 +104,9 @@ func (s *ActionsService) ListWorkflowRunArtifacts(ctx context.Context, owner, re
100104

101105
// GetArtifact gets a specific artifact for a workflow run.
102106
//
103-
// GitHub API docs: https://docs.github.com/en/rest/actions/artifacts#get-an-artifact
107+
// GitHub API docs: https://docs.github.com/rest/actions/artifacts#get-an-artifact
108+
//
109+
//meta:operation GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}
104110
func (s *ActionsService) GetArtifact(ctx context.Context, owner, repo string, artifactID int64) (*Artifact, *Response, error) {
105111
u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v", owner, repo, artifactID)
106112

@@ -120,7 +126,9 @@ func (s *ActionsService) GetArtifact(ctx context.Context, owner, repo string, ar
120126

121127
// DownloadArtifact gets a redirect URL to download an archive for a repository.
122128
//
123-
// GitHub API docs: https://docs.github.com/en/rest/actions/artifacts#download-an-artifact
129+
// GitHub API docs: https://docs.github.com/rest/actions/artifacts#download-an-artifact
130+
//
131+
//meta:operation GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}
124132
func (s *ActionsService) DownloadArtifact(ctx context.Context, owner, repo string, artifactID int64, maxRedirects int) (*url.URL, *Response, error) {
125133
u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v/zip", owner, repo, artifactID)
126134

@@ -144,7 +152,9 @@ func (s *ActionsService) DownloadArtifact(ctx context.Context, owner, repo strin
144152

145153
// DeleteArtifact deletes a workflow run artifact.
146154
//
147-
// GitHub API docs: https://docs.github.com/en/rest/actions/artifacts#delete-an-artifact
155+
// GitHub API docs: https://docs.github.com/rest/actions/artifacts#delete-an-artifact
156+
//
157+
//meta:operation DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}
148158
func (s *ActionsService) DeleteArtifact(ctx context.Context, owner, repo string, artifactID int64) (*Response, error) {
149159
u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v", owner, repo, artifactID)
150160

0 commit comments

Comments
 (0)