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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
# coding: utf-8
from __future__ import print_function
# partially from package six by Benjamin Peterson
import sys
import os
import types
if False: # MYPY
from typing import Any, Dict, Optional, List, Union, BinaryIO, IO, Text, Tuple # NOQA
try:
from ruamel.ordereddict import ordereddict
except:
try:
from collections import OrderedDict
except ImportError:
from ordereddict import OrderedDict # type: ignore
# to get the right name import ... as ordereddict doesn't do that
class ordereddict(OrderedDict): # type: ignore
if not hasattr(OrderedDict, 'insert'):
def insert(self, pos, key, value):
# type: (int, Any, Any) -> None
if pos >= len(self):
self[key] = value
return
od = ordereddict()
od.update(self)
for k in od:
del self[k]
for index, old_key in enumerate(od):
if pos == index:
self[key] = value
self[old_key] = od[old_key]
PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3
if PY3:
def utf8(s):
# type: (str) -> str
return s
def to_str(s):
# type: (str) -> str
return s
def to_unicode(s):
# type: (str) -> str
return s
else:
def utf8(s):
# type: (unicode) -> str
return s.encode('utf-8')
def to_str(s):
# type: (str) -> str
return str(s)
def to_unicode(s):
# type: (str) -> unicode
return unicode(s)
if PY3:
string_types = str
integer_types = int
class_types = type
text_type = str
binary_type = bytes
MAXSIZE = sys.maxsize
unichr = chr
import io
StringIO = io.StringIO
BytesIO = io.BytesIO
else:
string_types = basestring
integer_types = (int, long)
class_types = (type, types.ClassType)
text_type = unicode
binary_type = str
# to allow importing
unichr = unichr # type: ignore
from StringIO import StringIO as _StringIO
StringIO = _StringIO
import cStringIO
BytesIO = cStringIO.StringIO
if False: # MYPY
# StreamType = Union[BinaryIO, IO[str], IO[unicode], StringIO]
StreamType = Union[BinaryIO, IO[str], StringIO]
StreamTextType = Union[Text, StreamType]
VersionType = Union[List[int], str, Tuple[int, int]]
if PY3:
builtins_module = 'builtins'
else:
builtins_module = '__builtin__'
def with_metaclass(meta, *bases):
# type: (Any, Any) -> Any
"""Create a base class with a metaclass."""
return meta("NewBase", bases, {})
DBG_TOKEN = 1
DBG_EVENT = 2
DBG_NODE = 4
_debug = None # type: Union[None, int]
if bool(_debug):
class ObjectCounter(object):
def __init__(self):
# type: () -> None
self.map = {} # type: Dict[Any, Any]
def __call__(self, k):
# type: (Any) -> None
self.map[k] = self.map.get(k, 0) + 1
def dump(self):
# type: () -> None
for k in sorted(self.map):
print(k, '->', self.map[k])
object_counter = ObjectCounter()
# used from yaml util when testing
def dbg(val=None):
# type: (Any) -> Any
global _debug
if _debug is None:
# set to true or false
_debugx = os.environ.get('YAMLDEBUG')
if _debugx is None:
_debug = 0
else:
_debug = int(_debugx)
if val is None:
return _debug
return _debug & val
def nprint(*args, **kw):
# type: (Any, Any) -> None
if bool(dbg):
print(*args, **kw)
# char checkers following production rules
def check_namespace_char(ch):
# type: (Any) -> bool
if u'\x21' <= ch <= u'\x7E': # ! to ~
return True
if u'\xA0' <= ch <= u'\xD7FF':
return True
if (u'\xE000' <= ch <= u'\xFFFD') and ch != u'\xFEFF': # excl. byte order mark
return True
if u'\x10000' <= ch <= u'\x10FFFF':
return True
return False
def check_anchorname_char(ch):
# type: (Any) -> bool
if ch in u',[]{}':
return False
return check_namespace_char(ch)
|