This commit is contained in:
沈瑗杰 2021-04-16 22:14:17 +08:00
parent 8cd3530b87
commit b837d7a541
9 changed files with 1 additions and 1691 deletions

View File

@ -1,26 +0,0 @@
# Copyright 2014 Google Inc. All rights reserved.
#
# 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.
"""A pure Python implementation of the JSON5 configuration language."""
from .lib import dump, dumps, load, loads
from .version import VERSION
__all__ = [
'VERSION',
'dump',
'dumps',
'load',
'loads',
]

View File

@ -1,20 +0,0 @@
# Copyright 2014 Google Inc. All rights reserved.
#
# 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.
import sys # pragma: no cover
from .tool import main # pragma: no cover
if __name__ == '__main__': # pragma: no cover
sys.exit(main())

View File

@ -1,61 +0,0 @@
# Copyright 2015 Google Inc. All rights reserved.
#
# 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.
import argparse
class _Bailout(Exception):
pass
class ArgumentParser(argparse.ArgumentParser):
SUPPRESS = argparse.SUPPRESS
def __init__(self, host, prog, desc, **kwargs):
kwargs['prog'] = prog
kwargs['description'] = desc
kwargs['formatter_class'] = argparse.RawDescriptionHelpFormatter
super(ArgumentParser, self).__init__(**kwargs)
self._host = host
self.exit_status = None
self.add_argument('-V', '--version', action='store_true',
help='print the version and exit')
def parse_args(self, args=None, namespace=None):
try:
rargs = super(ArgumentParser, self).parse_args(args=args,
namespace=namespace)
except _Bailout:
return None
return rargs
# Redefining built-in 'file' pylint: disable=W0622
def _print_message(self, msg, file=None):
self._host.print_(msg=msg, stream=file, end='\n')
def print_help(self, file=None):
self._print_message(msg=self.format_help(), file=file)
def error(self, message, bailout=True): # pylint: disable=W0221
self.exit(2, '%s: error: %s\n' % (self.prog, message), bailout=bailout)
def exit(self, status=0, message=None, # pylint: disable=W0221
bailout=True):
self.exit_status = status
if message:
self._print_message(message, file=self._host.stderr)
if bailout:
raise _Bailout()

View File

@ -1,57 +0,0 @@
# Copyright 2014 Google Inc. All rights reserved.
#
# 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.
import os
import shutil
import sys
import tempfile
if sys.version_info[0] < 3:
# pylint: disable=redefined-builtin, invalid-name
str = unicode
class Host(object):
def __init__(self):
self.stdin = sys.stdin
self.stdout = sys.stdout
self.stderr = sys.stderr
def chdir(self, *comps):
return os.chdir(self.join(*comps))
def getcwd(self):
return os.getcwd()
def join(self, *comps):
return os.path.join(*comps)
def mkdtemp(self, **kwargs):
return tempfile.mkdtemp(**kwargs)
def print_(self, msg=u'', end=u'\n', stream=None):
stream = stream or self.stdout
stream.write(str(msg) + end)
stream.flush()
def rmtree(self, path):
shutil.rmtree(path, ignore_errors=True)
def read_text_file(self, path):
with open(path, 'rb') as fp:
return fp.read().decode('utf8')
def write_text_file(self, path, contents):
with open(path, 'wb') as f:
f.write(contents.encode('utf8'))

View File

@ -1,510 +0,0 @@
# Copyright 2015 Google Inc. All rights reserved.
#
# 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.
import math
import re
import sys
import unicodedata
from .parser import Parser
if sys.version_info[0] < 3:
str = unicode # pylint: disable=redefined-builtin, invalid-name
else:
long = int # pylint: disable=redefined-builtin, invalid-name
def load(fp, encoding=None, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None,
allow_duplicate_keys=True):
"""Deserialize ``fp`` (a ``.read()``-supporting file-like object
containing a JSON document) to a Python object.
Supports almost the same arguments as ``json.load()`` except that:
- the `cls` keyword is ignored.
- an extra `allow_duplicate_keys` parameter supports checking for
duplicate keys in a object; by default, this is True for
compatibility with ``json.load()``, but if set to False and
the object contains duplicate keys, a ValueError will be raised.
"""
s = fp.read()
return loads(s, encoding=encoding, cls=cls, object_hook=object_hook,
parse_float=parse_float, parse_int=parse_int,
parse_constant=parse_constant,
object_pairs_hook=object_pairs_hook,
allow_duplicate_keys=allow_duplicate_keys)
def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None,
allow_duplicate_keys=True):
"""Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a
JSON5 document) to a Python object.
Supports the same arguments as ``json.load()`` except that:
- the `cls` keyword is ignored.
- an extra `allow_duplicate_keys` parameter supports checking for
duplicate keys in a object; by default, this is True for
compatibility with ``json.load()``, but if set to False and
the object contains duplicate keys, a ValueError will be raised.
"""
assert cls is None, 'Custom decoders are not supported'
if sys.version_info[0] < 3:
decodable_type = type('')
else:
decodable_type = type(b'')
if isinstance(s, decodable_type):
encoding = encoding or 'utf-8'
s = s.decode(encoding)
if not s:
raise ValueError('Empty strings are not legal JSON5')
parser = Parser(s, '<string>')
ast, err, _ = parser.parse()
if err:
raise ValueError(err)
def _fp_constant_parser(s):
return float(s.replace('Infinity', 'inf').replace('NaN', 'nan'))
if object_pairs_hook:
dictify = object_pairs_hook
elif object_hook:
dictify = lambda pairs: object_hook(dict(pairs))
else:
dictify = lambda pairs: dict(pairs) # pylint: disable=unnecessary-lambda
if not allow_duplicate_keys:
_orig_dictify = dictify
dictify = lambda pairs: _reject_duplicate_keys(pairs, _orig_dictify)
parse_float = parse_float or float
parse_int = parse_int or int
parse_constant = parse_constant or _fp_constant_parser
return _walk_ast(ast, dictify, parse_float, parse_int, parse_constant)
def _reject_duplicate_keys(pairs, dictify):
keys = set()
for key, _ in pairs:
if key in keys:
raise ValueError('Duplicate key "%s" found in object', key)
keys.add(key)
return dictify(pairs)
def _walk_ast(el, dictify, parse_float, parse_int, parse_constant):
if el == 'None':
return None
if el == 'True':
return True
if el == 'False':
return False
ty, v = el
if ty == 'number':
if v.startswith('0x') or v.startswith('0X'):
return parse_int(v, base=16)
elif '.' in v or 'e' in v or 'E' in v:
return parse_float(v)
elif 'Infinity' in v or 'NaN' in v:
return parse_constant(v)
else:
return parse_int(v)
if ty == 'string':
return v
if ty == 'object':
pairs = []
for key, val_expr in v:
val = _walk_ast(val_expr, dictify, parse_float, parse_int,
parse_constant)
pairs.append((key, val))
return dictify(pairs)
if ty == 'array':
return [_walk_ast(el, dictify, parse_float, parse_int, parse_constant)
for el in v]
raise Exception('unknown el: ' + el) # pragma: no cover
def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False,
quote_keys=False, trailing_commas=True,
allow_duplicate_keys=True,
**kwargs):
"""Serialize ``obj`` to a JSON5-formatted stream to ``fp`` (a ``.write()``-
supporting file-like object).
Supports the same arguments as ``json.dumps()``, except that:
- The ``cls`` keyword is not supported.
- The ``encoding`` keyword is ignored; Unicode strings are always written.
- By default, object keys that are legal identifiers are not quoted;
if you pass quote_keys=True, they will be.
- By default, if lists and objects span multiple lines of output (i.e.,
when ``indent`` >=0), the last item will have a trailing comma
after it. If you pass ``trailing_commas=False, it will not.
- If you use a number, a boolean, or None as a key value in a dict,
it will be converted to the corresponding json string value, e.g.
"1", "true", or "null". By default, dump() will match the `json`
modules behavior and produce ill-formed JSON if you mix keys of
different types that have the same converted value, e.g.:
{1: "foo", "1": "bar"} produces '{"1": "foo", "1": "bar"}', an
object with duplicated keys. If you pass allow_duplicate_keys=False,
an exception will be raised instead.
Calling ``dumps(obj, fp, quote_keys=True, trailing_commas=False,
allow_duplicate_keys=True)``
should produce exactly the same output as ``json.dumps(obj, fp).``
"""
fp.write(str(dumps(obj=obj, skipkeys=skipkeys, ensure_ascii=ensure_ascii,
check_circular=check_circular, allow_nan=allow_nan,
cls=cls, indent=indent, separators=separators,
default=default, sort_keys=sort_keys,
quote_keys=quote_keys, trailing_commas=trailing_commas,
allow_duplicate_keys=allow_duplicate_keys)))
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False,
quote_keys=False, trailing_commas=True, allow_duplicate_keys=True,
**kwargs):
"""Serialize ``obj`` to a JSON5-formatted ``str``.
Supports the same arguments as ``json.dumps()``, except that:
- The ``cls`` keyword is not supported.
- The ``encoding`` keyword is ignored; Unicode strings are always returned.
- By default, object keys that are legal identifiers are not quoted;
if you pass quote_keys=True, they will be.
- By default, if lists and objects span multiple lines of output (i.e.,
when ``indent`` >=0), the last item will have a trailing comma
after it. If you pass ``trailing_commas=False, it will not.
- If you use a number, a boolean, or None as a key value in a dict,
it will be converted to the corresponding json string value, e.g.
"1", "true", or "null". By default, dump() will match the ``json``
module's behavior and produce ill-formed JSON if you mix keys of
different types that have the same converted value, e.g.:
{1: "foo", "1": "bar"} produces '{"1": "foo", "1": "bar"}', an
object with duplicated keys. If you pass ``allow_duplicate_keys=False``,
an exception will be raised instead.
Calling ``dumps(obj, quote_keys=True, trailing_commas=False,
allow_duplicate_keys=True)``
should produce exactly the same output as ``json.dumps(obj).``
"""
assert kwargs.get('cls', None) is None, 'Custom encoders are not supported'
if separators is None:
if indent is None:
separators = (u', ', u': ')
else:
separators = (u',', u': ')
default = default or _raise_type_error
if check_circular:
seen = set()
else:
seen = None
level = 1
is_key = False
_, v = _dumps(obj, skipkeys, ensure_ascii, check_circular,
allow_nan, indent, separators, default, sort_keys,
quote_keys, trailing_commas, allow_duplicate_keys,
seen, level, is_key)
return v
def _dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, indent,
separators, default, sort_keys,
quote_keys, trailing_commas, allow_duplicate_keys,
seen, level, is_key):
s = None
if obj is True:
s = u'true'
if obj is False:
s = u'false'
if obj is None:
s = u'null'
t = type(obj)
if t == type('') or t == type(u''):
if (is_key and _is_ident(obj) and not quote_keys
and not _is_reserved_word(obj)):
return True, obj
return True, _dump_str(obj, ensure_ascii)
if t is float:
s = _dump_float(obj, allow_nan)
if t is int:
s = str(obj)
if is_key:
if s is not None:
return True, '"%s"' % s
if skipkeys:
return False, None
raise TypeError('invalid key %s' % repr(obj))
if s is not None:
return True, s
if indent is not None:
end_str = ''
if trailing_commas:
end_str = ','
if type(indent) == int:
if indent > 0:
indent_str = '\n' + ' ' * indent * level
end_str += '\n' + ' ' * indent * (level - 1)
else:
indent_str = '\n'
end_str += '\n'
else:
indent_str = '\n' + indent * level
end_str += '\n' + indent * (level - 1)
else:
indent_str = ''
end_str = ''
item_sep, kv_sep = separators
item_sep += indent_str
level += 1
if seen is not None:
i = id(obj)
if i in seen:
raise ValueError('Circular reference detected.')
else:
seen.add(i)
# In Python3, we'd check if this was an abc.Mapping or an abc.Sequence.
# For now, just check for the attrs we need to iterate over the object.
if hasattr(t, 'keys') and hasattr(t, '__getitem__'):
s = _dump_dict(obj, skipkeys, ensure_ascii,
check_circular, allow_nan, indent,
separators, default, sort_keys,
quote_keys, trailing_commas,
allow_duplicate_keys, seen, level,
item_sep, kv_sep, indent_str, end_str)
elif hasattr(t, '__getitem__') and hasattr(t, '__iter__'):
s = _dump_array(obj, skipkeys, ensure_ascii,
check_circular, allow_nan, indent,
separators, default, sort_keys,
quote_keys, trailing_commas,
allow_duplicate_keys, seen, level,
item_sep, indent_str, end_str)
else:
s = default(obj)
if seen is not None:
seen.remove(i)
return False, s
def _dump_dict(obj, skipkeys, ensure_ascii, check_circular, allow_nan,
indent, separators, default, sort_keys,
quote_keys, trailing_commas, allow_duplicate_keys,
seen, level, item_sep, kv_sep, indent_str, end_str):
if not obj:
return u'{}'
if sort_keys:
keys = sorted(obj.keys())
else:
keys = obj.keys()
s = u'{' + indent_str
num_items_added = 0
new_keys = set()
for key in keys:
valid_key, key_str = _dumps(key, skipkeys, ensure_ascii, check_circular,
allow_nan, indent, separators, default,
sort_keys,
quote_keys, trailing_commas,
allow_duplicate_keys,
seen, level, is_key=True)
if valid_key:
if not allow_duplicate_keys:
if key_str in new_keys:
raise ValueError('duplicate key %s' % repr(key))
else:
new_keys.add(key_str)
if num_items_added:
s += item_sep
s += key_str + kv_sep + _dumps(obj[key], skipkeys, ensure_ascii,
check_circular, allow_nan, indent,
separators, default, sort_keys,
quote_keys, trailing_commas,
allow_duplicate_keys,
seen, level, is_key=False)[1]
num_items_added += 1
elif not skipkeys:
raise TypeError('invalid key %s' % repr(key))
s += end_str + u'}'
return s
def _dump_array(obj, skipkeys, ensure_ascii, check_circular, allow_nan,
indent, separators, default, sort_keys,
quote_keys, trailing_commas, allow_duplicate_keys,
seen, level, item_sep, indent_str, end_str):
if not obj:
return u'[]'
return (u'[' + indent_str +
item_sep.join([_dumps(el, skipkeys, ensure_ascii, check_circular,
allow_nan, indent, separators, default,
sort_keys, quote_keys, trailing_commas,
allow_duplicate_keys,
seen, level, False)[1] for el in obj]) +
end_str + u']')
def _dump_float(obj, allow_nan):
if allow_nan:
if math.isnan(obj):
return 'NaN'
if obj == float('inf'):
return 'Infinity'
if obj == float('-inf'):
return '-Infinity'
elif math.isnan(obj) or obj == float('inf') or obj == float('-inf'):
raise ValueError('Out of range float values '
'are not JSON compliant')
return str(obj)
def _dump_str(obj, ensure_ascii):
ret = ['"']
for ch in obj:
if ch == '\\':
ret.append('\\\\')
elif ch == '"':
ret.append('\\"')
elif ch == u'\u2028':
ret.append('\\u2028')
elif ch == u'\u2029':
ret.append('\\u2029')
elif ch == '\n':
ret.append('\\n')
elif ch == '\r':
ret.append('\\r')
elif ch == '\b':
ret.append('\\b')
elif ch == '\f':
ret.append('\\f')
elif ch == '\t':
ret.append('\\t')
elif ch == '\v':
ret.append('\\v')
elif ch == '\0':
ret.append('\\0')
elif not ensure_ascii:
ret.append(ch)
else:
o = ord(ch)
if o >= 32 and o < 128:
ret.append(ch)
elif o < 65536:
ret.append('\\u' + '%04x' % o)
else:
val = o - 0x10000
high = 0xd800 + (val >> 10)
low = 0xdc00 + (val & 0x3ff)
ret.append('\\u%04x\\u%04x' % (high, low))
return u''.join(ret) + '"'
def _is_ident(k):
k = str(k)
if not k or not _is_id_start(k[0]) and k[0] not in (u'$', u'_'):
return False
for ch in k[1:]:
if not _is_id_continue(ch) and ch not in (u'$', u'_'):
return False
return True
def _is_id_start(ch):
return unicodedata.category(ch) in (
'Lu', 'Ll', 'Li', 'Lt', 'Lm', 'Lo', 'Nl')
def _is_id_continue(ch):
return unicodedata.category(ch) in (
'Lu', 'Ll', 'Li', 'Lt', 'Lm', 'Lo', 'Nl', 'Nd', 'Mn', 'Mc', 'Pc')
_reserved_word_re = None
def _is_reserved_word(k):
global _reserved_word_re
if _reserved_word_re is None:
# List taken from section 7.6.1 of ECMA-262.
_reserved_word_re = re.compile('(' + '|'.join([
'break',
'case',
'catch',
'class',
'const',
'continue',
'debugger',
'default',
'delete',
'do',
'else',
'enum',
'export',
'extends',
'false',
'finally',
'for',
'function',
'if',
'import',
'in',
'instanceof',
'new',
'null',
'return',
'super',
'switch',
'this',
'throw',
'true',
'try',
'typeof',
'var',
'void',
'while',
'with',
]) + ')$')
return _reserved_word_re.match(k) is not None
def _raise_type_error(obj):
raise TypeError('%s is not JSON5 serializable' % repr(obj))

View File

@ -1,894 +0,0 @@
# pylint: disable=line-too-long,unnecessary-lambda
import sys
if sys.version_info[0] < 3:
# pylint: disable=redefined-builtin,invalid-name
chr = unichr
range = xrange
str = unicode
class Parser(object):
def __init__(self, msg, fname):
self.msg = str(msg)
self.end = len(self.msg)
self.fname = fname
self.val = None
self.pos = 0
self.failed = False
self.errpos = 0
self._scopes = []
self._cache = {}
def parse(self):
self._grammar_()
if self.failed:
return None, self._err_str(), self.errpos
return self.val, None, self.pos
def _err_str(self):
lineno, colno = self._err_offsets()
if self.errpos == len(self.msg):
thing = 'end of input'
else:
thing = '"%s"' % self.msg[self.errpos]
return '%s:%d Unexpected %s at column %d' % (
self.fname, lineno, thing, colno)
def _err_offsets(self):
lineno = 1
colno = 1
for i in range(self.errpos):
if self.msg[i] == '\n':
lineno += 1
colno = 1
else:
colno += 1
return lineno, colno
def _succeed(self, v, newpos=None):
self.val = v
self.failed = False
if newpos is not None:
self.pos = newpos
def _fail(self):
self.val = None
self.failed = True
if self.pos >= self.errpos:
self.errpos = self.pos
def _rewind(self, newpos):
self._succeed(None, newpos)
def _bind(self, rule, var):
rule()
if not self.failed:
self._set(var, self.val)
def _not(self, rule):
p = self.pos
rule()
if self.failed:
self._succeed(None, p)
else:
self._rewind(p)
self._fail()
def _opt(self, rule):
p = self.pos
rule()
if self.failed:
self._succeed([], p)
else:
self._succeed([self.val])
def _plus(self, rule):
vs = []
rule()
vs.append(self.val)
if self.failed:
return
self._star(rule, vs)
def _star(self, rule, vs=None):
vs = vs or []
while not self.failed:
p = self.pos
rule()
if self.failed:
self._rewind(p)
if p < self.errpos:
self.errpos = p
break
else:
vs.append(self.val)
self._succeed(vs)
def _seq(self, rules):
for rule in rules:
rule()
if self.failed:
return
def _choose(self, rules):
p = self.pos
for rule in rules[:-1]:
rule()
if not self.failed:
return
self._rewind(p)
rules[-1]()
def _ch(self, ch):
p = self.pos
if p < self.end and self.msg[p] == ch:
self._succeed(ch, self.pos + 1)
else:
self._fail()
def _str(self, s):
for ch in s:
self._ch(ch)
if self.failed:
return
self.val = s
def _range(self, i, j):
p = self.pos
if p != self.end and ord(i) <= ord(self.msg[p]) <= ord(j):
self._succeed(self.msg[p], self.pos + 1)
else:
self._fail()
def _push(self, name):
self._scopes.append((name, {}))
def _pop(self, name):
actual_name, _ = self._scopes.pop()
assert name == actual_name
def _get(self, var):
return self._scopes[-1][1][var]
def _set(self, var, val):
self._scopes[-1][1][var] = val
def _is_unicat(self, var, cat):
import unicodedata
return unicodedata.category(var) == cat
def _join(self, s, vs):
return s.join(vs)
def _xtou(self, s):
return chr(int(s, base=16))
def _grammar_(self):
self._push('grammar')
self._seq([self._sp_, lambda: self._bind(self._value_, 'v'), self._sp_,
self._end_, lambda: self._succeed(self._get('v'))])
self._pop('grammar')
def _sp_(self):
self._star(self._ws_)
def _ws_(self):
self._choose([self._ws__c0_, self._eol_, self._comment_, self._ws__c3_,
self._ws__c4_, self._ws__c5_, self._ws__c6_,
self._ws__c7_, self._ws__c8_])
def _ws__c0_(self):
self._ch(' ')
def _ws__c3_(self):
self._ch('\t')
def _ws__c4_(self):
self._ch('\v')
def _ws__c5_(self):
self._ch('\f')
def _ws__c6_(self):
self._ch(u'\xa0')
def _ws__c7_(self):
self._ch(u'\ufeff')
def _ws__c8_(self):
self._push('ws__c8')
self._seq([lambda: self._bind(self._anything_, 'x'), self._ws__c8__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('ws__c8')
def _ws__c8__s1_(self):
v = self._is_unicat(self._get('x'), 'Zs')
if v:
self._succeed(v)
else:
self._fail()
def _eol_(self):
self._choose([self._eol__c0_, self._eol__c1_, self._eol__c2_,
self._eol__c3_, self._eol__c4_])
def _eol__c0_(self):
self._seq([lambda: self._ch('\r'), lambda: self._ch('\n')])
def _eol__c1_(self):
self._ch('\r')
def _eol__c2_(self):
self._ch('\n')
def _eol__c3_(self):
self._ch(u'\u2028')
def _eol__c4_(self):
self._ch(u'\u2029')
def _comment_(self):
self._choose([self._comment__c0_, self._comment__c1_])
def _comment__c0_(self):
self._seq([lambda: self._str('//'),
lambda: self._star(self._comment__c0__s1_p_)])
def _comment__c0__s1_p_(self):
self._seq([lambda: self._not(self._eol_), self._anything_])
def _comment__c1_(self):
self._seq([lambda: self._str('/*'), self._comment__c1__s1_,
lambda: self._str('*/')])
def _comment__c1__s1_(self):
self._star(lambda: self._seq([self._comment__c1__s1_p__s0_, self._anything_]))
def _comment__c1__s1_p__s0_(self):
self._not(lambda: self._str('*/'))
def _value_(self):
self._choose([self._value__c0_, self._value__c1_, self._value__c2_,
self._value__c3_, self._value__c4_, self._value__c5_,
self._value__c6_])
def _value__c0_(self):
self._seq([lambda: self._str('null'), lambda: self._succeed('None')])
def _value__c1_(self):
self._seq([lambda: self._str('true'), lambda: self._succeed('True')])
def _value__c2_(self):
self._seq([lambda: self._str('false'), lambda: self._succeed('False')])
def _value__c3_(self):
self._push('value__c3')
self._seq([lambda: self._bind(self._object_, 'v'),
lambda: self._succeed(['object', self._get('v')])])
self._pop('value__c3')
def _value__c4_(self):
self._push('value__c4')
self._seq([lambda: self._bind(self._array_, 'v'),
lambda: self._succeed(['array', self._get('v')])])
self._pop('value__c4')
def _value__c5_(self):
self._push('value__c5')
self._seq([lambda: self._bind(self._string_, 'v'),
lambda: self._succeed(['string', self._get('v')])])
self._pop('value__c5')
def _value__c6_(self):
self._push('value__c6')
self._seq([lambda: self._bind(self._num_literal_, 'v'),
lambda: self._succeed(['number', self._get('v')])])
self._pop('value__c6')
def _object_(self):
self._choose([self._object__c0_, self._object__c1_])
def _object__c0_(self):
self._push('object__c0')
self._seq([lambda: self._ch('{'), self._sp_,
lambda: self._bind(self._member_list_, 'v'), self._sp_,
lambda: self._ch('}'), lambda: self._succeed(self._get('v'))])
self._pop('object__c0')
def _object__c1_(self):
self._seq([lambda: self._ch('{'), self._sp_, lambda: self._ch('}'),
lambda: self._succeed([])])
def _array_(self):
self._choose([self._array__c0_, self._array__c1_])
def _array__c0_(self):
self._push('array__c0')
self._seq([lambda: self._ch('['), self._sp_,
lambda: self._bind(self._element_list_, 'v'), self._sp_,
lambda: self._ch(']'), lambda: self._succeed(self._get('v'))])
self._pop('array__c0')
def _array__c1_(self):
self._seq([lambda: self._ch('['), self._sp_, lambda: self._ch(']'),
lambda: self._succeed([])])
def _string_(self):
self._choose([self._string__c0_, self._string__c1_])
def _string__c0_(self):
self._push('string__c0')
self._seq([self._squote_, self._string__c0__s1_, self._squote_,
lambda: self._succeed(self._join('', self._get('cs')))])
self._pop('string__c0')
def _string__c0__s1_(self):
self._bind(lambda: self._star(self._sqchar_), 'cs')
def _string__c1_(self):
self._push('string__c1')
self._seq([self._dquote_, self._string__c1__s1_, self._dquote_,
lambda: self._succeed(self._join('', self._get('cs')))])
self._pop('string__c1')
def _string__c1__s1_(self):
self._bind(lambda: self._star(self._dqchar_), 'cs')
def _sqchar_(self):
self._choose([self._sqchar__c0_, self._sqchar__c1_, self._sqchar__c2_])
def _sqchar__c0_(self):
self._push('sqchar__c0')
self._seq([self._bslash_, lambda: self._bind(self._esc_char_, 'c'),
lambda: self._succeed(self._get('c'))])
self._pop('sqchar__c0')
def _sqchar__c1_(self):
self._seq([self._bslash_, self._eol_, lambda: self._succeed('')])
def _sqchar__c2_(self):
self._push('sqchar__c2')
self._seq([lambda: self._not(self._bslash_),
lambda: self._not(self._squote_),
lambda: self._not(self._eol_),
lambda: self._bind(self._anything_, 'c'),
lambda: self._succeed(self._get('c'))])
self._pop('sqchar__c2')
def _dqchar_(self):
self._choose([self._dqchar__c0_, self._dqchar__c1_, self._dqchar__c2_])
def _dqchar__c0_(self):
self._push('dqchar__c0')
self._seq([self._bslash_, lambda: self._bind(self._esc_char_, 'c'),
lambda: self._succeed(self._get('c'))])
self._pop('dqchar__c0')
def _dqchar__c1_(self):
self._seq([self._bslash_, self._eol_, lambda: self._succeed('')])
def _dqchar__c2_(self):
self._push('dqchar__c2')
self._seq([lambda: self._not(self._bslash_),
lambda: self._not(self._dquote_),
lambda: self._not(self._eol_),
lambda: self._bind(self._anything_, 'c'),
lambda: self._succeed(self._get('c'))])
self._pop('dqchar__c2')
def _bslash_(self):
self._ch('\\')
def _squote_(self):
self._ch("'")
def _dquote_(self):
self._ch('"')
def _esc_char_(self):
self._choose([self._esc_char__c0_, self._esc_char__c1_,
self._esc_char__c2_, self._esc_char__c3_,
self._esc_char__c4_, self._esc_char__c5_,
self._esc_char__c6_, self._esc_char__c7_,
self._esc_char__c8_, self._esc_char__c9_,
self._esc_char__c10_, self._esc_char__c11_,
self._esc_char__c12_])
def _esc_char__c0_(self):
self._seq([lambda: self._ch('b'), lambda: self._succeed('\b')])
def _esc_char__c1_(self):
self._seq([lambda: self._ch('f'), lambda: self._succeed('\f')])
def _esc_char__c10_(self):
self._seq([lambda: self._ch('0'), lambda: self._not(self._digit_),
lambda: self._succeed('\x00')])
def _esc_char__c11_(self):
self._push('esc_char__c11')
self._seq([lambda: self._bind(self._hex_esc_, 'c'),
lambda: self._succeed(self._get('c'))])
self._pop('esc_char__c11')
def _esc_char__c12_(self):
self._push('esc_char__c12')
self._seq([lambda: self._bind(self._unicode_esc_, 'c'),
lambda: self._succeed(self._get('c'))])
self._pop('esc_char__c12')
def _esc_char__c2_(self):
self._seq([lambda: self._ch('n'), lambda: self._succeed('\n')])
def _esc_char__c3_(self):
self._seq([lambda: self._ch('r'), lambda: self._succeed('\r')])
def _esc_char__c4_(self):
self._seq([lambda: self._ch('t'), lambda: self._succeed('\t')])
def _esc_char__c5_(self):
self._seq([lambda: self._ch('v'), lambda: self._succeed('\v')])
def _esc_char__c6_(self):
self._seq([self._squote_, lambda: self._succeed("'")])
def _esc_char__c7_(self):
self._seq([self._dquote_, lambda: self._succeed('"')])
def _esc_char__c8_(self):
self._seq([self._bslash_, lambda: self._succeed('\\')])
def _esc_char__c9_(self):
self._push('esc_char__c9')
self._seq([self._esc_char__c9__s0_,
lambda: self._bind(self._anything_, 'c'),
lambda: self._succeed(self._get('c'))])
self._pop('esc_char__c9')
def _esc_char__c9__s0_(self):
self._not(lambda: (self._esc_char__c9__s0_n_g_)())
def _esc_char__c9__s0_n_g_(self):
self._choose([self._esc_char__c9__s0_n_g__c0_,
self._esc_char__c9__s0_n_g__c1_,
lambda: self._seq([self._digit_]),
lambda: self._seq([self._eol_])])
def _esc_char__c9__s0_n_g__c0_(self):
self._seq([lambda: self._ch('x')])
def _esc_char__c9__s0_n_g__c1_(self):
self._seq([lambda: self._ch('u')])
def _hex_esc_(self):
self._push('hex_esc')
self._seq([lambda: self._ch('x'), lambda: self._bind(self._hex_, 'h1'),
lambda: self._bind(self._hex_, 'h2'),
lambda: self._succeed(self._xtou(self._get('h1') + self._get('h2')))])
self._pop('hex_esc')
def _unicode_esc_(self):
self._push('unicode_esc')
self._seq([lambda: self._ch('u'), lambda: self._bind(self._hex_, 'a'),
lambda: self._bind(self._hex_, 'b'),
lambda: self._bind(self._hex_, 'c'),
lambda: self._bind(self._hex_, 'd'),
lambda: self._succeed(self._xtou(self._get('a') + self._get('b') + self._get('c') + self._get('d')))])
self._pop('unicode_esc')
def _element_list_(self):
self._push('element_list')
self._seq([lambda: self._bind(self._value_, 'v'),
self._element_list__s1_, self._sp_, self._element_list__s3_,
lambda: self._succeed([self._get('v')] + self._get('vs'))])
self._pop('element_list')
def _element_list__s1_(self):
self._bind(lambda: self._star(self._element_list__s1_l_p_), 'vs')
def _element_list__s1_l_p_(self):
self._seq([self._sp_, lambda: self._ch(','), self._sp_, self._value_])
def _element_list__s3_(self):
self._opt(lambda: self._ch(','))
def _member_list_(self):
self._push('member_list')
self._seq([lambda: self._bind(self._member_, 'm'),
self._member_list__s1_, self._sp_, self._member_list__s3_,
lambda: self._succeed([self._get('m')] + self._get('ms'))])
self._pop('member_list')
def _member_list__s1_(self):
self._bind(lambda: self._star(self._member_list__s1_l_p_), 'ms')
def _member_list__s1_l_p_(self):
self._seq([self._sp_, lambda: self._ch(','), self._sp_, self._member_])
def _member_list__s3_(self):
self._opt(lambda: self._ch(','))
def _member_(self):
self._choose([self._member__c0_, self._member__c1_])
def _member__c0_(self):
self._push('member__c0')
self._seq([lambda: self._bind(self._string_, 'k'), self._sp_,
lambda: self._ch(':'), self._sp_,
lambda: self._bind(self._value_, 'v'),
lambda: self._succeed([self._get('k'), self._get('v')])])
self._pop('member__c0')
def _member__c1_(self):
self._push('member__c1')
self._seq([lambda: self._bind(self._ident_, 'k'), self._sp_,
lambda: self._ch(':'), self._sp_,
lambda: self._bind(self._value_, 'v'),
lambda: self._succeed([self._get('k'), self._get('v')])])
self._pop('member__c1')
def _ident_(self):
self._push('ident')
self._seq([lambda: self._bind(self._id_start_, 'hd'), self._ident__s1_,
lambda: self._succeed(self._join('', [self._get('hd')] + self._get('tl')))])
self._pop('ident')
def _ident__s1_(self):
self._bind(lambda: self._star(self._id_continue_), 'tl')
def _id_start_(self):
self._choose([self._ascii_id_start_, self._other_id_start_,
self._id_start__c2_])
def _id_start__c2_(self):
self._seq([self._bslash_, self._unicode_esc_])
def _ascii_id_start_(self):
self._choose([self._ascii_id_start__c0_, self._ascii_id_start__c1_,
self._ascii_id_start__c2_, self._ascii_id_start__c3_])
def _ascii_id_start__c0_(self):
self._range('a', 'z')
def _ascii_id_start__c1_(self):
self._range('A', 'Z')
def _ascii_id_start__c2_(self):
self._ch('$')
def _ascii_id_start__c3_(self):
self._ch('_')
def _other_id_start_(self):
self._choose([self._other_id_start__c0_, self._other_id_start__c1_,
self._other_id_start__c2_, self._other_id_start__c3_,
self._other_id_start__c4_, self._other_id_start__c5_])
def _other_id_start__c0_(self):
self._push('other_id_start__c0')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._other_id_start__c0__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('other_id_start__c0')
def _other_id_start__c0__s1_(self):
v = self._is_unicat(self._get('x'), 'Ll')
if v:
self._succeed(v)
else:
self._fail()
def _other_id_start__c1_(self):
self._push('other_id_start__c1')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._other_id_start__c1__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('other_id_start__c1')
def _other_id_start__c1__s1_(self):
v = self._is_unicat(self._get('x'), 'Lm')
if v:
self._succeed(v)
else:
self._fail()
def _other_id_start__c2_(self):
self._push('other_id_start__c2')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._other_id_start__c2__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('other_id_start__c2')
def _other_id_start__c2__s1_(self):
v = self._is_unicat(self._get('x'), 'Lo')
if v:
self._succeed(v)
else:
self._fail()
def _other_id_start__c3_(self):
self._push('other_id_start__c3')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._other_id_start__c3__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('other_id_start__c3')
def _other_id_start__c3__s1_(self):
v = self._is_unicat(self._get('x'), 'Lt')
if v:
self._succeed(v)
else:
self._fail()
def _other_id_start__c4_(self):
self._push('other_id_start__c4')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._other_id_start__c4__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('other_id_start__c4')
def _other_id_start__c4__s1_(self):
v = self._is_unicat(self._get('x'), 'Lu')
if v:
self._succeed(v)
else:
self._fail()
def _other_id_start__c5_(self):
self._push('other_id_start__c5')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._other_id_start__c5__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('other_id_start__c5')
def _other_id_start__c5__s1_(self):
v = self._is_unicat(self._get('x'), 'Nl')
if v:
self._succeed(v)
else:
self._fail()
def _id_continue_(self):
self._choose([self._ascii_id_start_, self._digit_,
self._other_id_start_, self._id_continue__c3_,
self._id_continue__c4_, self._id_continue__c5_,
self._id_continue__c6_, self._id_continue__c7_,
self._id_continue__c8_, self._id_continue__c9_])
def _id_continue__c3_(self):
self._push('id_continue__c3')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._id_continue__c3__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('id_continue__c3')
def _id_continue__c3__s1_(self):
v = self._is_unicat(self._get('x'), 'Mn')
if v:
self._succeed(v)
else:
self._fail()
def _id_continue__c4_(self):
self._push('id_continue__c4')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._id_continue__c4__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('id_continue__c4')
def _id_continue__c4__s1_(self):
v = self._is_unicat(self._get('x'), 'Mc')
if v:
self._succeed(v)
else:
self._fail()
def _id_continue__c5_(self):
self._push('id_continue__c5')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._id_continue__c5__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('id_continue__c5')
def _id_continue__c5__s1_(self):
v = self._is_unicat(self._get('x'), 'Nd')
if v:
self._succeed(v)
else:
self._fail()
def _id_continue__c6_(self):
self._push('id_continue__c6')
self._seq([lambda: self._bind(self._anything_, 'x'),
self._id_continue__c6__s1_,
lambda: self._succeed(self._get('x'))])
self._pop('id_continue__c6')
def _id_continue__c6__s1_(self):
v = self._is_unicat(self._get('x'), 'Pc')
if v:
self._succeed(v)
else:
self._fail()
def _id_continue__c7_(self):
self._seq([self._bslash_, self._unicode_esc_])
def _id_continue__c8_(self):
self._ch(u'\u200c')
def _id_continue__c9_(self):
self._ch(u'\u200d')
def _num_literal_(self):
self._choose([self._num_literal__c0_, self._num_literal__c1_,
self._hex_literal_, self._num_literal__c3_,
self._num_literal__c4_])
def _num_literal__c0_(self):
self._push('num_literal__c0')
self._seq([lambda: self._ch('-'),
lambda: self._bind(self._num_literal_, 'n'),
lambda: self._succeed('-' + self._get('n'))])
self._pop('num_literal__c0')
def _num_literal__c1_(self):
self._push('num_literal__c1')
self._seq([self._num_literal__c1__s0_,
lambda: self._bind(self._dec_literal_, 'd'),
lambda: self._not(self._id_start_),
lambda: self._succeed(self._get('d'))])
self._pop('num_literal__c1')
def _num_literal__c1__s0_(self):
self._opt(lambda: self._ch('+'))
def _num_literal__c3_(self):
self._str('Infinity')
def _num_literal__c4_(self):
self._str('NaN')
def _dec_literal_(self):
self._choose([self._dec_literal__c0_, self._dec_literal__c1_,
self._dec_literal__c2_, self._dec_literal__c3_,
self._dec_literal__c4_, self._dec_literal__c5_])
def _dec_literal__c0_(self):
self._push('dec_literal__c0')
self._seq([lambda: self._bind(self._dec_int_lit_, 'd'),
lambda: self._bind(self._frac_, 'f'),
lambda: self._bind(self._exp_, 'e'),
lambda: self._succeed(self._get('d') + self._get('f') + self._get('e'))])
self._pop('dec_literal__c0')
def _dec_literal__c1_(self):
self._push('dec_literal__c1')
self._seq([lambda: self._bind(self._dec_int_lit_, 'd'),
lambda: self._bind(self._frac_, 'f'),
lambda: self._succeed(self._get('d') + self._get('f'))])
self._pop('dec_literal__c1')
def _dec_literal__c2_(self):
self._push('dec_literal__c2')
self._seq([lambda: self._bind(self._dec_int_lit_, 'd'),
lambda: self._bind(self._exp_, 'e'),
lambda: self._succeed(self._get('d') + self._get('e'))])
self._pop('dec_literal__c2')
def _dec_literal__c3_(self):
self._push('dec_literal__c3')
self._seq([lambda: self._bind(self._dec_int_lit_, 'd'),
lambda: self._succeed(self._get('d'))])
self._pop('dec_literal__c3')
def _dec_literal__c4_(self):
self._push('dec_literal__c4')
self._seq([lambda: self._bind(self._frac_, 'f'),
lambda: self._bind(self._exp_, 'e'),
lambda: self._succeed(self._get('f') + self._get('e'))])
self._pop('dec_literal__c4')
def _dec_literal__c5_(self):
self._push('dec_literal__c5')
self._seq([lambda: self._bind(self._frac_, 'f'),
lambda: self._succeed(self._get('f'))])
self._pop('dec_literal__c5')
def _dec_int_lit_(self):
self._choose([self._dec_int_lit__c0_, self._dec_int_lit__c1_])
def _dec_int_lit__c0_(self):
self._seq([lambda: self._ch('0'), lambda: self._not(self._digit_),
lambda: self._succeed('0')])
def _dec_int_lit__c1_(self):
self._push('dec_int_lit__c1')
self._seq([lambda: self._bind(self._nonzerodigit_, 'd'),
self._dec_int_lit__c1__s1_,
lambda: self._succeed(self._get('d') + self._join('', self._get('ds')))])
self._pop('dec_int_lit__c1')
def _dec_int_lit__c1__s1_(self):
self._bind(lambda: self._star(self._digit_), 'ds')
def _digit_(self):
self._range('0', '9')
def _nonzerodigit_(self):
self._range('1', '9')
def _hex_literal_(self):
self._push('hex_literal')
self._seq([self._hex_literal__s0_, self._hex_literal__s1_,
lambda: self._succeed('0x' + self._join('', self._get('hs')))])
self._pop('hex_literal')
def _hex_literal__s0_(self):
self._choose([lambda: self._str('0x'), lambda: self._str('0X')])
def _hex_literal__s1_(self):
self._bind(lambda: self._plus(self._hex_), 'hs')
def _hex_(self):
self._choose([self._hex__c0_, self._hex__c1_, self._digit_])
def _hex__c0_(self):
self._range('a', 'f')
def _hex__c1_(self):
self._range('A', 'F')
def _frac_(self):
self._push('frac')
self._seq([lambda: self._ch('.'), self._frac__s1_,
lambda: self._succeed('.' + self._join('', self._get('ds')))])
self._pop('frac')
def _frac__s1_(self):
self._bind(lambda: self._star(self._digit_), 'ds')
def _exp_(self):
self._choose([self._exp__c0_, self._exp__c1_])
def _exp__c0_(self):
self._push('exp__c0')
self._seq([self._exp__c0__s0_,
lambda: self._bind(self._exp__c0__s1_l_, 's'),
self._exp__c0__s2_,
lambda: self._succeed('e' + self._get('s') + self._join('', self._get('ds')))])
self._pop('exp__c0')
def _exp__c0__s0_(self):
self._choose([lambda: self._ch('e'), lambda: self._ch('E')])
def _exp__c0__s1_l_(self):
self._choose([lambda: self._ch('+'), lambda: self._ch('-')])
def _exp__c0__s2_(self):
self._bind(lambda: self._star(self._digit_), 'ds')
def _exp__c1_(self):
self._push('exp__c1')
self._seq([self._exp__c1__s0_, self._exp__c1__s1_,
lambda: self._succeed('e' + self._join('', self._get('ds')))])
self._pop('exp__c1')
def _exp__c1__s0_(self):
self._choose([lambda: self._ch('e'), lambda: self._ch('E')])
def _exp__c1__s1_(self):
self._bind(lambda: self._star(self._digit_), 'ds')
def _anything_(self):
if self.pos < self.end:
self._succeed(self.msg[self.pos], self.pos + 1)
else:
self._fail()
def _end_(self):
if self.pos == self.end:
self._succeed(None)
else:
self._fail()

View File

@ -1,107 +0,0 @@
# Copyright 2014 Google Inc. All rights reserved.
#
# 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.
"""A tool to parse and pretty-print JSON5.
Usage:
$ echo '{foo:"bar"}' | python -m json5.tool
{
foo: 'bar',
}
$ echo '{foo:"bar"}' | python -m json5.tool --as-json
{
"foo": "bar"
}
"""
import sys
from . import arg_parser
from . import lib
from .host import Host
from .version import VERSION
def main(argv=None, host=None):
host = host or Host()
parser = arg_parser.ArgumentParser(host, prog='json5', desc=__doc__)
parser.add_argument('-c', metavar='STR', dest='cmd',
help='inline json5 string to read instead of '
'reading from a file')
parser.add_argument('--as-json', dest='as_json', action='store_const',
const=True, default=False,
help='output as JSON '
'(same as --quote-keys --no-trailing-commas)')
parser.add_argument('--indent', dest='indent', default=4,
help='amount to indent each line '
'(default is 4 spaces)')
parser.add_argument('--quote-keys', action='store_true', default=False,
help='quote all object keys')
parser.add_argument('--no-quote-keys', action='store_false',
dest='quote_keys',
help="don't quote object keys that are identifiers"
" (this is the default)")
parser.add_argument('--trailing-commas', action='store_true',
default=True,
help='add commas after the last item in multi-line '
'objects and arrays (this is the default)')
parser.add_argument('--no-trailing-commas', dest='trailing_commas',
action='store_false',
help='do not add commas after the last item in '
'multi-line lists and objects')
parser.add_argument('file', metavar='FILE', nargs='?', default='-',
help='optional file to read JSON5 document from; if '
'not specified or "-", will read from stdin '
'instead')
args = parser.parse_args(argv)
if parser.exit_status is not None:
return parser.exit_status
if args.version:
host.print_(VERSION)
return 0
if args.cmd:
inp = args.cmd
elif args.file == '-':
inp = host.stdin.read()
else:
inp = host.read_text_file(args.file)
if args.indent == 'None':
args.indent = None
else:
try:
args.indent = int(args.indent)
except ValueError:
pass
if args.as_json:
args.quote_keys = True
args.trailing_commas = False
obj = lib.loads(inp)
s = lib.dumps(obj,
indent=args.indent,
quote_keys=args.quote_keys,
trailing_commas=args.trailing_commas)
host.print_(s)
return 0
if __name__ == '__main__': # pragma: no cover
sys.exit(main())

View File

@ -1,15 +0,0 @@
# Copyright 2014 Google Inc. All rights reserved.
#
# 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.
VERSION = '0.9.5'

View File

@ -13,7 +13,7 @@
'visible': 'true',
// bool
'style': 'None',
'fps': 60,
'fps': 30,
'views': [
'space',
'map',