Source code for arx
from collections import namedtuple
import six
from v2 import v2
from .bundle import Bundle, Code, Data
from .inner.schematics import interpreter_injector
from .sources import interpreter
from .sources.core import DiskLocal
__version__ = v2.from_pkg().from_git().from_default().version
[docs]class Arx(namedtuple('Arx', 'interpreter')):
"""An Arx API object encapsulates configuration for the convenience API.
API configuration includes an interpreter (a callable) that translates
strings and simple string dictionaries to URLs, as well as settings for
temporary directory setup and task logging.
"""
[docs] def Bundle(self, *args, **kwargs):
"""A convenience method for obtaining :class:`~arx.bundle.Bundle`\s
which can be called with a variety of argument types.
.. method::
Bundle(code=[Code], data=[Data], cwd=str, label=str, env=dict)
With keyword arguments. These keyword arguments can all be
empty -- the default bundle has no additional environment, runs
in a temporary directory and does not have a custom label.
.. method:: Bundle(a: Code|Data, b: Code|Data, c: Code|Data, ...)
With :class:`~arx.bundle.Code` and :class:`~arx.bundle.Data`
objects as arguments, in any order.
.. method:: Bundle(h: io.IOBase)
With a handle -- an open file or :class:`StringIO` like object.
The contents are read and passed through a YAML parser. The
resulting dictionary object is passed to the dictionary form
mentioned below.
.. method:: Bundle({...}: dict)
With a :class:`dict`, as is provided by parsing a JSON or YAML
file. The arguments of the dict should mirror those of the
keyword arguments form, above.
Note that the keyword arguments ``cwd``, ``label`` and ``env`` from the
first form can also be passed to any of the following forms.
"""
with interpreter_injector.using(self.interpreter): # NB: Evil globals
bundle = Bundle(*args, **kwargs)
bundle.validate()
return bundle
def Source(self, *args, **kwargs):
return self.interpreter(*args, **kwargs)
[docs] def Code(self, *args, **kwargs):
"""Convenience method for constructing :class:`~arx.bundle.Code`,
which handles translation of strings and simple datatypes to
:class:`~arx.sources.core.Source`\s.
"""
if len(args) > 0:
if isinstance(args[0], six.string_types) and '://' not in args[0]:
kwargs.update(cmd=args[0])
else:
kwargs.update(source=self.Source(args[0]))
kwargs.update(args=args[1:])
args = []
code = Code(*args, **kwargs)
code.validate()
return code
[docs] def Data(self, *args, **kwargs):
"""Convenience method for constructing :class:`~arx.bundle.Data`,
which handles translation of strings and simple datatypes to
:class:`~arx.sources.core.Source`\s.
"""
if len(args) > 0:
kwargs.update(source=self.Source(args[0]))
args = args[1:]
if len(args) > 0:
kwargs.update(target=args[0])
args = args[1:]
data = Data(*args, **kwargs)
data.validate()
return data
def local(self, source, under=None):
cached = source.cache(under)
assert isinstance(cached, DiskLocal)
return self.Source(cached.externalize())
def inline(self, source):
raise NotImplementedError()
arx = Arx(interpreter.default)