Source code for axon.api

# The MIT License (MIT)
#
# Copyright (c) <2011-2014> <Shibzukhov Zaur, szport at gmail dot com>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

from __future__ import unicode_literals, print_function
from axon._loader import Loader
from axon._dumper import Dumper
from axon.types import unicode_type, str_type
from axon._objects import as_unicode, StringReader, StringWriter

import io

class Reader(object):
    def __init__(self, fd, encoding):
        self.fd = fd
        self.encoding = encoding

    def readline(self):
        line = self.fd.readline()
        line =  line.decode(self.encoding)
        return line

    def close(self):
        self.fd.close()

class Writer(object):
    def __init__(self, fd, encoding):
        self.fd = fd
        self.encoding = encoding

    def write(self, line):
        line =  line.encode(self.encoding)
        self.fd.write(line)

    def close(self):
        self.fd.close()

[docs]def display(text, pretty=1, braces=0, sorted=1, hsize=0, crossref=0): ''' Display AXON text in formatted form for easy read. :param text: `unicode` AXON text :returns: formatted `unicode` AXON text ''' val = loads(text) print(dumps(val, pretty, braces, sorted, hsize, crossref))
[docs]def dumps(val, pretty=0, braces=0, sorted=1, hsize=0, crossref=0): ''' Dump value into unicode text. :param val: value to convert :param simple_dumpers: dictionary containing callables for text representation of values of simple types &em; int, float, decimal, boolean, unicode text, date/time/datetime &em; in form of `type`:`dumper`. :param type_reducers: dictionary containing callables, which returns reduced data for representation in AXON. :param pretty: flag indicating pretty dumping: * True - use pretty dumping * False - do not use pretty dumping (default) :param crossref: flag for crossreferece support in unsafe mode * True - use crosserefernce support * False - do not use crosserefernce support (default) :returns: unicode string of AXON representation of `val`. ''' fd = StringWriter() dumper = Dumper(fd, pretty, braces, sorted, hsize, crossref) dumper.dump(val) v = fd.getvalue() fd.close() return v
[docs]def dump(fpath, val, pretty=0, braces=0, sorted=1, hsize=0, crossref=0, encoding='utf-8'): '''\ Same as :py:func:`dumps` but for dumping into a file. :param fpath: path to file for dumping. For other parameters see :py:func:`dumps`. ''' fd = io.open(fpath, mode='w', encoding=encoding) dumper = Dumper(fd, pretty, braces, sorted, hsize, crossref) dumper.dump(val) fd.close()
[docs]def loads(text, mode="safe", errto=None, json=0): '''\ Load values from unicode text. :param text: `unicode` text in AXON. :param mode: specifies the method of building python objects for complex values (see .. py:func:`load`) :param errto: name of file for reporting errors :param json: if true then allow to load from json format :returns: `list` of values. ''' loader = iloads(text, mode, errto, json) return loader.load()
[docs]def iloads(text, mode="safe", errto=None, json=0): '''\ Iterative loading values from unicode text. :param text: unicode text in AXON. :param mode: specifies the method of building python objects for complex values (see .. py:func:`load`) :param errto: name of file for reporting errors :param json: if true then allow to load from json format :returns: iterator object. ''' text = as_unicode(text) fd = StringReader(text) return iload(fd, mode, errto, json=json)
[docs]def load(fd, mode="safe", errto=None, encoding='utf-8', json=0): ''' Load object from unicode text in AXON. :param fd: input file name of file object opening as TextIO/StringIO :param mode: specifies the method of building python objects for complex values. :param errto: name of file for reporting errors :param encoding: encoding of input file (default `utf-8`) There are values of parameter `mode`: * "safe" - use safe object builder * "strict" - use unsafe builder with strict name resolution: if there is no registered name for building object builder return `undef` object * "mixed" - use unsafe object builder with following rule: if there is no registered name for building object then use `safe` mode. :param json: if true then allow to load from json format :returns: `list` of values. ''' loader = iload(fd, mode, errto, encoding, json) return loader.load()
[docs]def iload(fd, mode="safe", errto=None, encoding='utf-8', json=0): '''\ Iterative loading values from input file. Arguments are same as in .. py:func:`load`. :returns: iterator object. ''' if type(fd) in (str_type, unicode_type): fd = io.open(fd, mode='r', encoding=encoding) loader = Loader(fd, mode, errto, json) return loader
# def itokens(text, mode="safe", errto=None, encoding='utf-8', json=0): # text = as_unicode(text) # fd = StringReader(text) # # loader = Loader(fd, mode, errto, json) # # for tok in loader.itokens(): # yield tok #