ajv-validator / ajv-validator/ajv-cli

validation not working (invalid data accepted) when a schema is defined using shell process substitution/named pipes

Offen
#244 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
TypeScript
Sterne
316
Forks
77
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

The bash shell has a feature called _process substitution_ (details below) which allows creating _named pipes_.
`ajv` (CLI) does not appear to work well with such named pipes

```bash
$ ajv validate -s <(longer pipeline that yield a JSON or YAML schema) <(longer pipeline that yield a JSON or YAML data file)
/dev/fd/62 valid
```

this shows the data is valid, even when it does not satisfy the schema.

Rewritten in a way that should be equivalent from a bash script yields different `ajv` results:

```bash
$ (longer pipeline that yield a JSON or YAML schema) > schema.json
$ (longer pipeline that yield a JSON or YAML data file) > data.json
$ ajv validate -s schema.json -d data.json
data.json invalid
[
{
instancePath: '/info/breakingChanges',
schemaPath: '#/properties/info/properties/breakingChanges/const',
keyword: 'const',
params: { allowedValue: true },
message: 'must be equal to constant'
}
]

```

Here's a simpler use case

Save the attached files, which unfortunately GitHub required me to rename with `.txt` extensions, so rename with

```bash
$ mv schema.yaml.txt schema.yaml
$ mv data.yaml.txt data.yaml
```
)

Use the shell and `js-yaml` to convert the files from YAML to JSON:

```bash
$ npm i -g ajv-cli js-yaml # Install if you don't already have these commands
$ ajv --spec=draft2020 validate -s <(js-yaml schema.yaml) -d <(js-yaml data.yaml)
/dev/fd/62 valid
```

Even though `data.yaml` is invalid (as per `schema.yaml`), this command incorrectly shows the file as valid.

(here, `/dev/fd/62` is the named pipe for the pipeline `js-yaml data.yaml` )

Running `ajv` directly

```
$ ajv --spec=draft2020 validate -s schema.yaml -d data.yaml
data.yaml invalid
[
{
instancePath: '/info/breakingChanges',
schemaPath: '#/properties/info/properties/breakingChanges/const',
keyword: 'const',
params: { allowedValue: true },
message: 'must be equal to constant'
}
]

```

In situations where longer pipelines are used to derive the schema (i.e. text pipelines on YAML or other content ) and a `schema.yaml` or `schema.json` file is not directly available, I think `ajv` should work with named pipes

```bash
ajv validate -s <(longer pipeline that yield a JSON or YAML schema) <(longer pipeline that yield a JSON or YAML data file)
```

without having to resort to temp files that one must then clean up/manage etc.

----

From the [bash(1) man page](https://www.man7.org/linux/man-pages/man1/bash.1.html):

Process Substitution

Process substitution allows a process's input or output to be
referred to using a filename. It takes the form of <(list) or
>(list). The process list is run asynchronously, and its input
or output appears as a filename. This filename is passed as an
argument to the current command as the result of the expansion.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.