Source code for lale.schemas

# Copyright 2019 IBM Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from typing import Any, Dict, List, Optional, TypeVar, Union


[docs]class Undefined: pass
undefined = Undefined() T = TypeVar("T") Option = Union[Undefined, T]
[docs]class Schema: schema: Dict[str, Any] def __init__( self, desc: Option[str] = undefined, default: Option[Any] = undefined, forOptimizer: bool = True, ): self.schema: Dict[str, Any] = {} if not isinstance(default, Undefined): self.schema["default"] = default if not isinstance(desc, Undefined): self.schema["description"] = desc if not forOptimizer: self.schema["forOptimizer"] = forOptimizer
[docs] def set(self, prop: str, value: Option[Any]): if not isinstance(value, Undefined): self.schema[prop] = value
# Base Type
[docs]class Bool(Schema): def __init__( self, desc: Option[str] = undefined, default: Option[bool] = undefined, forOptimizer: bool = True, ): super().__init__(desc, default, forOptimizer) self.set("type", "boolean")
[docs]class Enum(Schema): def __init__( self, values: Optional[List[Any]] = None, desc: Option[str] = undefined, default: Option[Any] = undefined, forOptimizer: bool = True, ): super().__init__(desc, default, forOptimizer) if values is None: values = [] self.set("enum", values)
[docs]class Float(Schema): def __init__( self, desc: Option[str] = undefined, default: Option[float] = undefined, forOptimizer: bool = True, minimum: Option[float] = undefined, exclusiveMinimum: Option[bool] = undefined, minimumForOptimizer: Option[float] = undefined, exclusiveMinimumForOptimizer: Option[bool] = undefined, maximum: Option[float] = undefined, exclusiveMaximum: Option[bool] = undefined, maximumForOptimizer: Option[float] = undefined, exclusiveMaximumForOptimizer: Option[bool] = undefined, distribution: Option[str] = undefined, ): super().__init__(desc, default, forOptimizer) self.set("type", "number") self.set("minimum", minimum) self.set("exclusiveMinimum", exclusiveMinimum) self.set("minimumForOptimizer", minimumForOptimizer) self.set("exclusiveMinimumForOptimizer", exclusiveMinimumForOptimizer) self.set("maximum", maximum) self.set("exclusiveMaximum", exclusiveMaximum) self.set("maximumForOptimizer", maximumForOptimizer) self.set("exclusiveMaximumForOptimizer", exclusiveMaximumForOptimizer) self.set("distribution", distribution)
[docs]class Int(Schema): def __init__( self, desc: Option[str] = undefined, default: Option[int] = undefined, forOptimizer: bool = True, minimum: Option[int] = undefined, exclusiveMinimum: Option[bool] = undefined, minimumForOptimizer: Option[int] = undefined, exclusiveMinimumForOptimizer: Option[bool] = undefined, maximum: Option[int] = undefined, exclusiveMaximum: Option[bool] = undefined, maximumForOptimizer: Option[int] = undefined, exclusiveMaximumForOptimizer: Option[bool] = undefined, distribution: Option[str] = undefined, laleMaximum: Option[str] = undefined, ): super().__init__(desc, default, forOptimizer) self.set("type", "integer") self.set("minimum", minimum) self.set("exclusiveMinimum", exclusiveMinimum) self.set("minimumForOptimizer", minimumForOptimizer) self.set("maximum", maximum) self.set("exclusiveMaximum", exclusiveMaximum) self.set("exclusiveMinimumForOptimizer", exclusiveMinimumForOptimizer) self.set("maximumForOptimizer", maximumForOptimizer) self.set("exclusiveMaximumForOptimizer", exclusiveMaximumForOptimizer) self.set("distribution", distribution) self.set("laleMaximum", laleMaximum)
[docs]class Null(Schema): def __init__(self, desc: Option[str] = undefined, forOptimizer: bool = True): super().__init__(desc=desc, forOptimizer=forOptimizer) self.set("enum", [None])
[docs]class Not(Schema): def __init__(self, body: Schema): super().__init__() self.schema = {"not": body.schema}
[docs]class JSON(Schema): def __init__(self, body: Dict[str, Any]): super().__init__() self.schema = body
# Combinator
[docs]class AnyOf(Schema): def __init__( self, types: Optional[List[Schema]] = None, desc: Option[str] = undefined, default: Option[Any] = undefined, forOptimizer: bool = True, ): super().__init__(desc, default, forOptimizer) if types is None: types = [] self.set("anyOf", [t.schema for t in types])
[docs]class AllOf(Schema): def __init__( self, types: Optional[List[Schema]] = None, desc: Option[str] = undefined, default: Option[Any] = undefined, ): super().__init__(desc, default) if types is None: types = [] self.set("allOf", [t.schema for t in types])
[docs]class Array(Schema): def __init__( self, items: Schema, desc: Option[str] = undefined, default: Option[List[Any]] = undefined, forOptimizer: bool = True, minItems: Option[int] = undefined, minItemsForOptimizer: Option[int] = undefined, maxItems: Option[int] = undefined, maxItemsForOptimizer: Option[int] = undefined, laleType: Option[str] = undefined, ): super().__init__(desc, default, forOptimizer) self.set("type", "array") self.set("items", items.schema) self.set("minItems", minItems) self.set("minItemsForOptimizer", minItemsForOptimizer) self.set("maxItems", maxItems) self.set("maxItemsForOptimizer", maxItemsForOptimizer) self.set("laleType", laleType)
[docs]class Object(Schema): def __init__( self, default: Option[Any] = undefined, desc: Option[str] = undefined, forOptimizer: bool = True, required: Option[List[str]] = undefined, additionalProperties: Option[bool] = undefined, **kwargs: Schema ): super().__init__(desc, default, forOptimizer) self.set("type", "object") self.set("required", required) self.set("additionalProperties", additionalProperties) self.set("properties", {k: p.schema for (k, p) in kwargs.items()})
[docs]class String(Schema): def __init__( self, desc: Option[str] = undefined, default: Option[str] = undefined, forOptimizer: bool = False, ): super().__init__(desc, default, forOptimizer) self.set("type", "string")