ajv-validator / ajv-validator/ajv-cli
validation not working (invalid data accepted) when a schema is defined using shell process substitution/named pipes
- Ngôn ngữ chính
- TypeScript
- Star
- 316
- Fork
- 77
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
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.
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Đánh giá
Issue này chưa được đánh giá.