AEP-0132 Linter Rules
List methods- No HTTP body
List methods: No HTTP body
Section titled “List methods: No HTTP body”This rule enforces that all List
RPCs omit the HTTP body
, as mandated in
AEP-132.
Details
Section titled “Details”This rule looks at any message beginning with List
, and complains if
the HTTP body
field is set.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) { option (google.api.http) = { get: "/v1/{parent=publishers/*}/books" body: "*" // This should be absent. };}
Correct code for this rule:
// Correct.rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) { option (google.api.http) = { get: "/v1/{parent=publishers/*}/books" };}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::http-body=disabled// api-linter: core::0132::http-method=disabled// aep.dev/not-precedent: We need to do this because reasons. --)rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) { option (google.api.http) = { post: "/v1/{parent=publishers/*}/books" body: "*" };}
Important: HTTP GET
requests are unable to have an HTTP body, due to the
nature of the protocol. The only valid way to include a body is to also use a
different HTTP method (as depicted above).
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- GET HTTP verb
List methods: GET HTTP verb
Section titled “List methods: GET HTTP verb”This rule enforces that all List
RPCs use the GET
HTTP verb, as mandated in
AEP-132.
Details
Section titled “Details”This rule looks at any message beginning with List
, and complains if
the HTTP verb is anything other than GET
. It does check additional bindings
if they are present.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) { option (google.api.http) = { post: "/v1/{parent=publishers/*}/books" // Should be `get:`. };}
Correct code for this rule:
// Correct.rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) { option (google.api.http) = { get: "/v1/{parent=publishers/*}/books" };}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::http-method=disabled// aep.dev/not-precedent: We need to do this because reasons. --)rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) { option (google.api.http) = { post: "/v1/{parent=publishers/*}/books" };}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Method signature
List methods: Method signature
Section titled “List methods: Method signature”This rule enforces that all List
standard methods have a
google.api.method_signature
annotation with a value of "parent"
, as
mandated in AEP-132.
Details
Section titled “Details”This rule looks at any method beginning with List
, and complains if the
google.api.method_signature
annotation is missing, or if it is set to any
value other than "parent"
. Additional method signatures, if present, are
ignored.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.rpc ListBooks(ListBooksRequest) returns (Book) { // A google.api.method_signature annotation should be present.}
// Incorrect.rpc ListBooks(ListBooksRequest) returns (Book) { option (google.api.method_signature) = "publisher"; // Should be "parent".}
Correct code for this rule:
// Correct.rpc ListBooks(ListBooksRequest) returns (Book) { option (google.api.method_signature) = "parent";}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::method-signature=disabled// aep.dev/not-precedent: We need to do this because reasons. --)rpc ListBooks(ListBooksRequest) returns (Book);
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Unknown fields
List methods: Unknown fields
Section titled “List methods: Unknown fields”This rule enforces that all List
standard methods use the correct type for
any optional fields described in AEP-132.
Details
Section titled “Details”This rule looks at the fields in any message matching List*Request
and
complains if finds fields with the names below that do not have the correct
type:
string filter
string order_by
bool show_deleted
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksRequest { string parent = 1; int32 page_size = 2; string page_token = 3; BookFilter filter = 4; // Wrong type; should be a string.}
Correct code for this rule:
// Correct.message ListBooksRequest { string parent = 1; int32 page_size = 2; string page_token = 3; string filter = 4;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.
message ListBooksRequest { string parent = 1; int32 page_size = 2; string page_token = 3;
// (-- api-linter: core::0132::request-field-types=disabled // aep.dev/not-precedent: We really need this field because reasons. --) BookFilter filter = 4;}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Request message
List methods: Request message
Section titled “List methods: Request message”This rule enforces that all List
RPCs have a request message name of
List*Request
, as mandated in AEP-132.
Details
Section titled “Details”This rule looks at any message matching beginning with List
, and complains if
the name of the corresponding input message does not match the name of the RPC
with the suffix Request
appended.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.// Should be `ListBooksRequest`.rpc ListBooks(ListBooksReq) returns (ListBooksResponse) { option (google.api.http) = { get: "/v1/{parent=publishers/*}/books" };}
Correct code for this rule:
// Correct.rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) { option (google.api.http) = { get: "/v1/{parent=publishers/*}/books" };}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::request-message-name=disabled// aep.dev/not-precedent: We need to do this because reasons. --)rpc ListBooks(ListBooksReq) returns (ListBooksResponse) { option (google.api.http) = { get: "/v1/{parent=publishers/*}/books" };}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Field behavior
List methods: Field behavior
Section titled “List methods: Field behavior”This rule enforces that all List
standard methods have
google.api.field_behavior
set to REQUIRED
on their string parent
field,
as mandated in AEP-132.
Details
Section titled “Details”This rule looks at any message matching List*Request
and complains if the
parent
field does not have a google.api.field_behavior
annotation with a
value of REQUIRED
.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksRequest { // The `google.api.field_behavior` annotation should also be included. string parent = 1 [(google.api.resource_reference) = { type: "library.googleapis.com/Publisher" }]; int32 page_size = 2; string page_token = 3;}
Correct code for this rule:
// Correct.message ListBooksRequest { string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference).type = "library.googleapis.com/Publisher" ]; int32 page_size = 2; string page_token = 3;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::request-parent-behavior=disabled// aep.dev/not-precedent: We need to do this because reasons. --)message ListBooksRequest { string parent = 1 [(google.api.resource_reference) = { type: "library.googleapis.com/Publisher" }]; int32 page_size = 2; string page_token = 3;}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Parent field
List methods: Parent field
Section titled “List methods: Parent field”This rule enforces that all List
standard methods have a string parent
field in the request message, as mandated in AEP-132.
Details
Section titled “Details”This rule looks at any message matching List*Request
and complains if the
parent
field has any type other than string
.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksRequest { // Field type should be `string`. bytes parent = 1; int32 page_size = 2; string page_token = 3;}
Correct code for this rule:
// Correct.message ListBooksRequest { string parent = 1; int32 page_size = 2; string page_token = 3;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.
message ListBooksRequest { // (-- api-linter: core::0132::request-parent-field=disabled // aep.dev/not-precedent: We need to do this because reasons. --) bytes parent = 1; int32 page_size = 2; string page_token = 3;}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Resource reference
List methods: Resource reference
Section titled “List methods: Resource reference”This rule enforces that all List
standard methods have
google.api.resource_reference
on their string parent
field, as mandated in
AEP-132.
Details
Section titled “Details”This rule looks at the parent
field of any message matching List*Request
and complains if it does not have a google.api.resource_reference
annotation.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksRequest { // The `google.api.resource_reference` annotation should also be included. string parent = 1 [(google.api.field_behavior) = REQUIRED]; int32 page_size = 2; string page_token = 3;}
Correct code for this rule:
// Correct.message ListBooksRequest { string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference).type = "library.googleapis.com/Publisher" ]; int32 page_size = 2; string page_token = 3;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::request-parent-reference=disabled// aep.dev/not-precedent: We need to do this because reasons. --)message ListBooksRequest { string parent = 1 [(google.api.field_behavior) = REQUIRED];}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Parent field
List methods: Parent field
Section titled “List methods: Parent field”This rule enforces that all List
standard methods have a string parent
field in the request message, as mandated in AEP-132.
Details
Section titled “Details”This rule looks at any message matching List*Request
and complains if
the parent
field is missing.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksRequest { // Field name should be `parent`. string publisher = 1; int32 page_size = 2; string page_token = 3;}
Correct code for this rule:
// Correct.message ListBooksRequest { string parent = 1; int32 page_size = 2; string page_token = 3;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the message. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::request-parent-required=disabled// aep.dev/not-precedent: We need to do this because reasons. --)message ListBooksRequest { string publisher = 1; int32 page_size = 2; string page_token = 3;}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Resource reference
List methods: Resource reference
Section titled “List methods: Resource reference”This rule enforces that all List
standard methods reference a resource other
than the resource being listed with the google.api.resource_reference
on
their string parent
field, as mandated in AEP-132.
Details
Section titled “Details”This rule looks at the parent
field of any message matching List*Request
and complains if the google.api.resource_reference
annotation references
the resource being listed.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksRequest { // The `google.api.resource_reference` should not reference the resource // being listed. string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference).type = "library.googleapis.com/Book" ]; int32 page_size = 2; string page_token = 3;}
Correct code for this rule:
// Correct.message ListBooksRequest { string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference).child_type = "library.googleapis.com/Book" ]; int32 page_size = 2; string page_token = 3;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::request-parent-valid-reference=disabled// aep.dev/not-precedent: We need to do this because reasons. --)message ListBooksRequest { string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference).type = "library.googleapis.com/Book" ];}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Required fields
List methods: Required fields
Section titled “List methods: Required fields”This rule enforces that all List
standard methods do not have unexpected
required fields, as mandated in AEP-132.
Details
Section titled “Details”This rule looks at any message matching List*Request
and complains if it
comes across any required fields other than:
string parent
(AEP-132)
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksRequest { // The parent, which owns this collection of books. // Format: publishers/{publisher} string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { child_type: "library.googleapis.com/Book" }];
// Non-standard required field. int32 page_size = 2 [(google.api.field_behavior) = REQUIRED]}
Correct code for this rule:
// Correct.message ListBooksRequest { // The parent, which owns this collection of books. // Format: publishers/{publisher} string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { child_type: "library.googleapis.com/Book" }];
int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL]}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.
message ListBooksRequest { // The parent, which owns this collection of books. // Format: publishers/{publisher} string parent = 1 [ (google.api.field_behavior) = REQUIRED, (google.api.resource_reference) = { child_type: "library.googleapis.com/Book" }];
// (-- api-linter: core::0132::request-required-fields=disabled // aep.dev/not-precedent: We really need this field to be required because // reasons. --) int32 page_size = 2 [(google.api.field_behavior) = REQUIRED]}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- show_deleted field
List methods: show_deleted
field
Section titled “List methods: show_deleted field”This rule enforces that all List
standard methods have a bool show_deleted
field in the request message if the resource supports soft delete, as mandated
in AEP-132.
Details
Section titled “Details”This rule looks at any message matching List*Request
and complains if the
show_deleted
field is missing and the corresponding resource has an
Undelete
method.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.
service Library { ... rpc UndeleteBook(UndeleteBookRequest) returns (Book) { ... }}
// Missing the `bool show_deleted` field.message ListBooksRequest { string parent = 1; int32 page_size = 2; string page_token = 3;}
Correct code for this rule:
// Correct.
service Library { ... rpc UndeleteBook(UndeleteBookRequest) returns (Book) { ... }}
message ListBooksRequest { string parent = 1; int32 page_size = 2; string page_token = 3; bool show_deleted = 4;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the message. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::request-show-deleted-required=disabled// aep.dev/not-precedent: We need to do this because reasons. --)message ListBooksRequest { string parent = 1; int32 page_size = 2; string page_token = 3;}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Unknown fields (Request)
List methods: Unknown fields (Request)
Section titled “List methods: Unknown fields (Request)”This rule enforces that all List
standard methods do not have unexpected
fields, as mandated in AEP-132.
Details
Section titled “Details”This rule looks at any message matching List*Request
and complains if it
comes across any fields other than:
string parent
(AEP-132)int32 max_page_size
(AEP-158)string page_token
(AEP-158)int32 skip
(AEP-158)string filter
(AEP-132)string order_by
(AEP-132)bool show_deleted
(AEP-132)string request_id
(AEP-155)google.protobuf.FieldMask read_mask
(AEP-157)View view
(AEP-157)
It only checks field names; it does not validate type correctness. This is handled by other rules, such as request field types.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksRequest { string parent = 1; int32 max_page_size = 2; string page_token = 3; string library_id = 4; // Non-standard field.}
Correct code for this rule:
// Correct.message ListBooksRequest { string parent = 1; int32 max_page_size = 2; string page_token = 3;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.
message ListBooksRequest { string parent = 1; int32 max_page_size = 2; string page_token = 3;
// (-- api-linter: core::0132::request-unknown-fields=disabled // aep.dev/not-precedent: We really need this field because reasons. --) string library_id = 4;}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Parent field resource reference
List methods: Parent field resource reference
Section titled “List methods: Parent field resource reference”This rule enforces that all List
standard methods with a string parent
field use a proper google.api.resource_reference
, that being either a
child_type
referring to the pagianted resource or a type
referring directly
to the parent resource, as mandated in AEP-132.
Details
Section titled “Details”This rule looks at any message matching List*Request
and complains if the
google.api.resource_reference
on the parent
field refers to the wrong
resource.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksRequest { // `child_type` should be used instead of `type` when referring to the // paginated resource on a parent field. string parent = 1 [(google.api.resource_reference).type = "library.googleapis.com/Book"]; int32 page_size = 2; string page_token = 3;}
Correct code for this rule:
// Correct.message ListBooksRequest { string parent = 1 [(google.api.resource_reference).child_type = "library.googleapis.com/Book"]; int32 page_size = 2; string page_token = 3;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.
message ListBooksRequest { // (-- api-linter: core::0132::resource-reference-type=disabled // aep.dev/not-precedent: We need to do this because reasons. --) string parent = 1 [(google.api.resource_reference).type = "library.googleapis.com/Book"]; int32 page_size = 2; string page_token = 3;}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Response message
List methods: Response message
Section titled “List methods: Response message”This rule enforces that all List
RPCs have a response message name of
List*Response
, as mandated in AEP-132.
Details
Section titled “Details”This rule looks at any message matching beginning with List
, and complains if
the name of the corresponding returned message does not match the name of the
RPC with the suffix Response
appended.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.// Should be `ListBooksResponse`.rpc ListBooks(ListBooksRequest) returns (Books) { option (google.api.http) = { get: "/v1/{parent=publishers/*}/books" };}
Correct code for this rule:
// Correct.rpc ListBooks(ListBooksRequest) returns (ListBooksResponse) { option (google.api.http) = { get: "/v1/{parent=publishers/*}/books" };}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.
// (-- api-linter: core::0132::response-message-name=disabled// aep.dev/not-precedent: We need to do this because reasons. --)rpc ListBooks(ListBooksRequest) returns (Books) { option (google.api.http) = { get: "/v1/{parent=publishers/*}/books" };}
If you need to violate this rule for an entire file, place the comment at the top of the file.
List methods- Unknown fields (Response)
List methods: Unknown fields (Response)
Section titled “List methods: Unknown fields (Response)”This rule enforces that all List
standard methods do not have unexpected
fields, as mandated in AEP-132.
Details
Section titled “Details”This rule looks at any message matching List*Response
and complains if it
comes across any fields other than:
- The resource.
int32/int64 total_size
(AEP-132)string next_page_token
(AEP-158)repeated string unavailable
([AEP-217][])
It only checks field names; it does not validate type correctness or repeated-ness.
Examples
Section titled “Examples”Incorrect code for this rule:
// Incorrect.message ListBooksResponse { repeated Book results = 1; string next_page_token = 2; string publisher_id = 3; // Unrecognized field.}
Correct code for this rule:
// Correct.message ListBooksResponse { repeated Book results = 1; string next_page_token = 2;}
Disabling
Section titled “Disabling”If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.
message ListBooksResponse { repeated Book results = 1; string next_page_token = 2; // (-- api-linter: core::0132::response-unknown-fields=disabled // aep.dev/not-precedent: We really need this field because reasons. --) string publisher_id = 3;}
If you need to violate this rule for an entire file, place the comment at the top of the file.