Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
154 changes: 154 additions & 0 deletions configurable-rules/operation-operationId-exclude-OPTIONS/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
# Variant of the `operation-operationId` rule that excludes `OPTIONS` operations

Author:
- [@nickcorby](https://github.com/nickcorby)

## What this does and why

This rule extends the built-in rule [operation-operationId](https://redocly.com/docs/cli/rules/oas/operation-operationId) by filtering out set operations e.g. `OPTIONS`.

This rule can be tweaked to exclude any combination of operations, or inversely to **include** set operations.

## Code

> If you are using a ruleset that includes the `operation-operationId` rule (like `recommended`), you will need to disable this rule in order for the configurable rule to apply.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Technically, the configurable rule will be applied anyway, but it just doesn't make any sense to use both built-in and the configurable rule 🙂.

>
> e.g. if your `redocly.yaml` file contains:
>
> ```yaml
> extends:
> - recommended
> ```
> You will need to include the following snippet in the `rules` property:
>
> ```yaml
> rules:
> operation-operationId: off
> ```

This rule is added to your `redocly.yaml` file:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This rule is added to your `redocly.yaml` file:
This rule is added to the `rules` section of your `redocly.yaml` file:


```yaml
rule/operation-operationId-exclude-OPTIONS:
subject:
type: Operation
filterOutParentKeys:
- options
assertions:
required:
- operationId
message: Operation is missing 'operationId' property.
severity: error
```

The `filterOutParentKeys` property allows you to define which operations you would like to exclude from the rule:

```yaml
type: Operation
filterOutParentKeys:
- options
```

This can be extended to multiple operations:

```yaml
type: Operation
filterOutParentKeys:
- options
- delete
```

Alternatively, you can use the `filterInParentKeys` property to define which operations you would like to include in the rule:

```yaml
type: Operation
filterInParentKeys:
- get
- post
```

## Examples

With the rule configured with `severity: error`, the following snippet of a `GET` operation will trigger this rule & display an error:

```yaml
get:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you make your examples smaller just to contain the needed data to showcase the rule, and start from the root?

openapi: 3.2.0
paths: 
  /example:
    get: ...

tags:
- Endpoint
summary: "Example endpoint."
parameters:
- name: "Authorization"
in: "header"
description: "Auth Token"
required: true
schema:
type: "string"
responses:
"200":
description: "200 response"
headers:
Access-Control-Allow-Origin:
schema:
type: "string"
content:
application/json:
schema:
$ref: ../models/200Response.yaml
"400":
description: "400 response"
headers:
Access-Control-Allow-Origin:
schema:
type: "string"
content:
application/json:
schema:
$ref: ../models/ErrorResponse.yaml
security:
- Authorizer: []
- api_key: []
```

However, the following snippet of an `OPTIONS` operation **won't** trigger the rule:

```yaml
options:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps you can combine the examples into one endpoint, but with different methods, and leave hints what's correct and what's wrong in summaries or descriptions.

tags:
- Endpoint
summary: "Example endpoint."
parameters:
- name: "Authorization"
in: "header"
description: "Auth Token"
required: true
schema:
type: "string"
responses:
"200":
description: "200 response"
headers:
Access-Control-Allow-Origin:
schema:
type: "string"
content:
application/json:
schema:
$ref: ../models/200Response.yaml
"400":
description: "400 response"
headers:
Access-Control-Allow-Origin:
schema:
type: "string"
content:
application/json:
schema:
$ref: ../models/ErrorResponse.yaml
security:
- Authorizer: []
- api_key: []
```

## References

Assisted by [AlbinaBlazhko17](https://github.com/AlbinaBlazhko17)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
rule/operation-operationId-exclude-OPTIONS:
subject:
type: Operation
filterOutParentKeys:
- options
assertions:
required:
- operationId
message: Operation is missing 'operationId' property.
severity: error
Loading