stoplightio / spectral

A flexible JSON/YAML linter for creating automated style guides, with baked in support for OpenAPI (v3.1, v3.0, and v2.0), Arazzo v1.0, as well as AsyncAPI v2.x.
https://stoplight.io/spectral
Apache License 2.0
2.55k stars 240 forks source link

Spectal complains when a openapi pattern uses a Unicode character set #2419

Open DavidBiesack opened 1 year ago

DavidBiesack commented 1 year ago

Describe the bug

spectral incorrectly flags an example corresponding to a valid regexp pattern as invalid.

JSON Schema says that patterns should be processed as Unicode regexp, but it appears that the fix #1787 for #1782 turned off unicodeRegExp :

unicodeRegExp: false,

Thus for the following property

openapi: 3.1.0
components:
  schemas:
    label:
      description: The human readable label for the report type.
      type: string
      minLength: 1
      maxLength: 55
      pattern: '^\P{Cc}{1,55}$'
      example:
        Admin User Activity

We get

 11:9    error  oas3-valid-schema-example  "example" property must match pattern "\P{Cc}{1,55}"      components.schemas.label.example

even though this is a valid example that matches the regex

> 'Admin User Activity'.match(/^\P{Cc}{1,55}$/u)
'Admin User Activity'.match(/^\P{Cc}{1,55}$/u)
[
  'Admin User Activity',
  index: 0,
  input: 'Admin User Activity',
  groups: undefined
]
> 

To Reproduce

  1. Save the sample as openapi.yaml

  2. Run this CLI command

    echo 'extends: spectral:oas' > .spectral.yaml
    spectral lint openapi.yaml
  3. See error

 11:9    error  oas3-valid-schema-example  "example" property must match pattern "\P{Cc}{1,55}"      components.schemas.label.example

Expected behavior

no false negative error for a valid pattern that matches a pattern with a charset pattern

Since a bug fix intentionally disables Unicode, and enabling it may break others, I would like an option to enable it, either in the CLI options or in the spectral ruleset.

Environment (remove any that are not applicable):

P0lip commented 1 year ago

We've already had a discussion around that here https://github.com/stoplightio/spectral/issues/2030.

Since a bug fix intentionally disables Unicode, and enabling it may break others, I would like an option to enable it, either in the CLI options or in the spectral ruleset.

That's fine by me. I'm not sure how the option would be named though. It's really specific to schema validation fn.

DavidBiesack commented 1 year ago

Thanks @P0lip . Do you know why #2030 was closed? I don't see this as having been resolved.

One option may be to define two schema validation functions, so one could disable one rule (that uses the current function) and enable a different rule that uses the unicode RegExp rule. I don't know exactly how example validation is done (i.e. if it is deep inside the schema validation rule, or if it is separate.

P0lip commented 1 year ago

Do you know why https://github.com/stoplightio/spectral/issues/2030 was closed? I don't see this as having been resolved.

I don't know, to be frank.

I'll keep this one up