Add schema validation for collection files #369
This commit improves collection file editing and error detection directly in the IDE. It adds YAML schema, IDE configuration and automatic tests to validate it. - Introduce a YAML schema for collection file. - Use `yaml-language-server` for enhanced YAML support in VSCode. - Add telemetry disabling in `configure_vscode.py` to respect user privacy. - Add automated checks to validate YAML file structure against the schema. - Remove unused properties and do not allow them in compiler.
This commit is contained in:
51
scripts/validate-collections-yaml/README.md
Normal file
51
scripts/validate-collections-yaml/README.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# validate-collections-yaml
|
||||
|
||||
This script validates YAML collection files against a predefined schema to ensure their integrity.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Python 3.x installed on your system.
|
||||
|
||||
## Running in a Virtual Environment (Recommended)
|
||||
|
||||
Using a virtual environment isolates dependencies and prevents conflicts.
|
||||
|
||||
1. **Create a virtual environment:**
|
||||
|
||||
```bash
|
||||
python3 -m venv ./scripts/validate-collections-yaml/.venv
|
||||
```
|
||||
|
||||
2. **Activate the virtual environment:**
|
||||
|
||||
```bash
|
||||
source ./scripts/validate-collections-yaml/.venv/bin/activate
|
||||
```
|
||||
|
||||
3. **Install dependencies:**
|
||||
|
||||
```bash
|
||||
python3 -m pip install -r ./scripts/validate-collections-yaml/requirements.txt
|
||||
```
|
||||
|
||||
4. **Run the script:**
|
||||
|
||||
```bash
|
||||
python3 ./scripts/validate-collections-yaml
|
||||
```
|
||||
|
||||
## Running Globally
|
||||
|
||||
Running the script globally is less recommended due to potential dependency conflicts.
|
||||
|
||||
1. **Install dependencies:**
|
||||
|
||||
```bash
|
||||
python3 -m pip install -r ./scripts/validate-collections-yaml/requirements.txt
|
||||
```
|
||||
|
||||
2. **Run the script:**
|
||||
|
||||
```bash
|
||||
python3 ./scripts/validate-collections-yaml
|
||||
```
|
||||
62
scripts/validate-collections-yaml/__main__.py
Normal file
62
scripts/validate-collections-yaml/__main__.py
Normal file
@@ -0,0 +1,62 @@
|
||||
"""
|
||||
Description:
|
||||
This script validates collection YAML files against the expected schema.
|
||||
|
||||
Usage:
|
||||
python3 ./scripts/validate-collections-yaml
|
||||
|
||||
Notes:
|
||||
This script requires the `jsonschema` and `pyyaml` packages (see requirements.txt).
|
||||
"""
|
||||
# pylint: disable=missing-function-docstring
|
||||
from os import path
|
||||
import sys
|
||||
from glob import glob
|
||||
from typing import List
|
||||
from jsonschema import exceptions, validate # pylint: disable=import-error
|
||||
import yaml # pylint: disable=import-error
|
||||
|
||||
SCHEMA_FILE_PATH = './src/application/collections/.schema.yaml'
|
||||
COLLECTIONS_GLOB_PATTERN = './src/application/collections/*.yaml'
|
||||
|
||||
def main() -> None:
|
||||
schema_yaml = read_file(SCHEMA_FILE_PATH)
|
||||
schema_json = convert_yaml_to_json(schema_yaml)
|
||||
collection_file_paths = find_collection_files(COLLECTIONS_GLOB_PATTERN)
|
||||
print(f'Found {len(collection_file_paths)} YAML files to validate.')
|
||||
|
||||
total_invalid_files = 0
|
||||
for collection_file_path in collection_file_paths:
|
||||
file_name = path.basename(collection_file_path)
|
||||
print(f'Validating {file_name}...')
|
||||
collection_yaml = read_file(collection_file_path)
|
||||
collection_json = convert_yaml_to_json(collection_yaml)
|
||||
try:
|
||||
validate(instance=collection_json, schema=schema_json)
|
||||
print(f'Success: {file_name} is valid.')
|
||||
except exceptions.ValidationError as err:
|
||||
print(f'Error: Validation failed for {file_name}.', file=sys.stderr)
|
||||
print(str(err), file=sys.stderr)
|
||||
total_invalid_files += 1
|
||||
|
||||
if total_invalid_files > 0:
|
||||
print(f'Validation complete with {total_invalid_files} invalid files.', file=sys.stderr)
|
||||
sys.exit(1)
|
||||
else:
|
||||
print('Validation complete. All files are valid.')
|
||||
sys.exit(0)
|
||||
|
||||
def read_file(file_path: str) -> str:
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
return file.read()
|
||||
|
||||
def find_collection_files(glob_pattern: str) -> List[str]:
|
||||
files = glob(glob_pattern)
|
||||
filtered_files = [f for f in files if not path.basename(f).startswith('.')]
|
||||
return filtered_files
|
||||
|
||||
def convert_yaml_to_json(yaml_content: str) -> dict:
|
||||
return yaml.safe_load(yaml_content)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
6
scripts/validate-collections-yaml/requirements.txt
Normal file
6
scripts/validate-collections-yaml/requirements.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
attrs==23.2.0
|
||||
jsonschema==4.22.0
|
||||
jsonschema-specifications==2023.12.1
|
||||
PyYAML==6.0.1
|
||||
referencing==0.35.1
|
||||
rpds-py==0.18.1
|
||||
Reference in New Issue
Block a user