1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright (c) 2017 Cisco and/or its affiliates.
#
# 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 netmodel.util.meta import inheritors
class BaseType:
@staticmethod
def name():
return self.__class__.__name__.lower()
class String(BaseType):
def __init__(self, *args, **kwargs):
self._min_size = kwargs.pop('min_size', None)
self._max_size = kwargs.pop('max_size', None)
self._ascii = kwargs.pop('ascii', False)
self._forbidden = kwargs.pop('forbidden', None)
super().__init__()
class Integer(BaseType):
def __init__(self, *args, **kwargs):
self._min_value = kwargs.pop('min_value', None)
self._max_value = kwargs.pop('max_value', None)
super().__init__()
class Double(BaseType):
def __init__(self, *args, **kwargs):
self._min_value = kwargs.pop('min_value', None)
self._max_value = kwargs.pop('max_value', None)
super().__init__()
class Bool(BaseType):
pass
class Dict(BaseType):
pass
class Self(BaseType):
"""Self-reference
"""
class Type:
BASE_TYPES = (String, Integer, Double, Bool)
_registry = dict()
@staticmethod
def from_string(type_name, raise_exception=True):
"""Returns a type corresponding to the type name.
Params:
type_name (str) : Name of the type
Returns
Type : Type class of the requested type name
"""
type_cls = [t for t in Type.BASE_TYPES if t.name == type_name]
if type_cls:
return type_cls[0]
type_cls = Type._registry.get(type_name, None)
if not type_cls:
raise Exception("No type found: {}".format(type_name))
return type_cls
@staticmethod
def is_base_type(type_cls):
return type_cls in Type.BASE_TYPES
@staticmethod
def exists(typ):
return (isinstance(typ, type) and typ in inheritors(BaseType)) \
or isinstance(typ, BaseType)
is_base_type = Type.is_base_type
is_type = Type.exists
|