Source code for blocklib.validation
import json
import pathlib
from enum import Enum
from typing import Dict, Union
from pydantic import BaseModel, Field, validator, ValidationError
from blocklib.validation.constrained_types import PositiveInt, UnitFloat
from blocklib.validation.lambda_fold_validation import LambdaConfig
from blocklib.validation.psig_validation import PSigConfig, PSigSignatureModel, PSigBlockingBFFilterConfig, \
PSigCharsAtSignatureSpec, PSigMetaphoneSignatureSpec
[docs]class BlockingSchemaTypes(str, Enum):
psig = 'p-sig'
lambdafold = 'lambda-fold'
PPRLIndexConfig = Union[PSigConfig, LambdaConfig]
[docs]class BlockingSchemaModel(BaseModel):
version: int
type: BlockingSchemaTypes = Field(..., description="Identifier of the blocking type")
config: PPRLIndexConfig
[docs] @validator('config', pre=True, always=True, each_item=False)
def validate_config(cls, config_to_validate, values):
return cls.config_gen(config_to_validate, values)
[docs] @classmethod
def config_gen(cls, config_to_validate, values) -> Union[PSigConfig, LambdaConfig]:
# TODO rework after https://github.com/samuelcolvin/pydantic/issues/619
if not isinstance(config_to_validate, dict):
raise ValueError(f'invalid blocking config, not dict')
blocking_type = values.get('type')
if blocking_type == BlockingSchemaTypes.psig:
return PSigConfig(**config_to_validate)
elif blocking_type == BlockingSchemaTypes.lambdafold:
return LambdaConfig(**config_to_validate)
else:
raise ValueError("Unsupported blocking type")
[docs]def load_schema(file_name: str):
path = pathlib.Path(__file__).parent / 'schemas' / file_name
# schema_bytes = pkgutil.get_data('anonlinkclient', 'docs/schemas/{}'.format(file_name))
with open(str(path.resolve()), 'rt') as schema_file:
try:
return json.load(schema_file)
except json.decoder.JSONDecodeError as e:
raise ValueError("Invalid schema") from e
[docs]def validate_blocking_schema(config: Dict) -> BlockingSchemaModel:
"""Validate blocking schema data with pydantic.
:raises ValueError: exceptions when passed an invalid config.
"""
return BlockingSchemaModel.parse_obj(config)