diff --git a/docs/api/modules/index.html b/docs/api/modules/index.html
index 54b4facf..faaebdea 100644
--- a/docs/api/modules/index.html
+++ b/docs/api/modules/index.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
diff --git a/docs/api/modules/spython/client.html b/docs/api/modules/spython/client.html
index 847d049e..22bca830 100644
--- a/docs/api/modules/spython/client.html
+++ b/docs/api/modules/spython/client.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
os.putenv("SINGULARITY_MESSAGELEVEL", level)
# Import logger to set
- from spython.logger import bot
+ from spython.logger import bot
bot.debug("Logging level %s" % level)
import spython
@@ -332,13 +331,13 @@ Source code for spython.client
# Does the user want help for a subcommand?
if args.command == "recipe":
- from .recipe import main as func
+ from .recipe import main as func
elif args.command == "shell":
- from .shell import main as func
+ from .shell import main as func
elif args.command == "test":
- from .test import main as func
+ from .test import main as func
else:
print_help()
diff --git a/docs/api/modules/spython/client/recipe.html b/docs/api/modules/spython/client/recipe.html
index de2c931f..e3f0ec24 100644
--- a/docs/api/modules/spython/client/recipe.html
+++ b/docs/api/modules/spython/client/recipe.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -156,11 +155,11 @@
Source code for spython.client.recipe
# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.main.parse.writers import get_writer
-from spython.main.parse.parsers import get_parser
+from spython.main.parse.writers import get_writer
+from spython.main.parse.parsers import get_parser
-from spython.logger import bot
-from spython.utils import write_file, write_json
+from spython.logger import bot
+from spython.utils import write_file, write_json
import json
import sys
diff --git a/docs/api/modules/spython/client/shell.html b/docs/api/modules/spython/client/shell.html
index 18adfeff..bc54b070 100644
--- a/docs/api/modules/spython/client/shell.html
+++ b/docs/api/modules/spython/client/shell.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -179,9 +178,9 @@
Source code for spython.client.shell
"""prepare a client to embed in a shell with recipe parsers and writers.
"""
# The client will announce itself (backend/database) unless it's get
- from spython.main import get_client
- from spython.main.parse import parsers
- from spython.main.parse import writers
+ from spython.main import get_client
+ from spython.main.parse import parsers
+ from spython.main.parse import writers
client = get_client()
@@ -200,7 +199,7 @@ Source code for spython.client.shell
client = prepare_client(image) # pylint: disable=unused-variable
try:
- from IPython import embed
+ from IPython import embed
except ImportError:
return python(image)
diff --git a/docs/api/modules/spython/client/test.html b/docs/api/modules/spython/client/test.html
index 02773fe6..565c47d4 100644
--- a/docs/api/modules/spython/client/test.html
+++ b/docs/api/modules/spython/client/test.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
diff --git a/docs/api/modules/spython/image.html b/docs/api/modules/spython/image.html
index cbcbe5f1..9b178e96 100644
--- a/docs/api/modules/spython/image.html
+++ b/docs/api/modules/spython/image.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,18 +156,18 @@
Source code for spython.image
import hashlib
import os
import re
-from spython.logger import bot
-from spython.utils import split_uri
+from spython.logger import bot
+from spython.utils import split_uri
[docs]class ImageBase(object):
-
def __str__(self):
+
def __str__(self):
protocol = getattr(self, "protocol", None)
if protocol:
return "%s://%s" % (protocol, self.image)
return self.image
-
def __repr__(self):
+
def __repr__(self):
return self.__str__()
[docs] def parse_image_name(self, image):
@@ -186,7 +185,7 @@
Source code for spython.image
[docs]class Image(ImageBase):
-
def __init__(self, image=None):
+
def __init__(self, image=None):
"""An image here is an image file or a record.
The user can choose to load the image when starting the client, or
update the main client with an image. The image object is kept
diff --git a/docs/api/modules/spython/image/cmd.html b/docs/api/modules/spython/image/cmd.html
index dd20e8e2..fad7bb75 100644
--- a/docs/api/modules/spython/image/cmd.html
+++ b/docs/api/modules/spython/image/cmd.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -178,12 +177,12 @@
Source code for spython.image.cmd
class ImageClient(object):
group = "image"
- from spython.main.base.logger import println
- from spython.main.base.command import init_command, run_command
- from .utils import compress, decompress
- from .create import create
- from .importcmd import importcmd
- from .export import export
+ from spython.main.base.logger import println
+ from spython.main.base.command import init_command, run_command
+ from .utils import compress, decompress
+ from .create import create
+ from .importcmd import importcmd
+ from .export import export
ImageClient.create = create
ImageClient.imprt = importcmd
diff --git a/docs/api/modules/spython/image/cmd/create.html b/docs/api/modules/spython/image/cmd/create.html
index c5798b69..e12a75d5 100644
--- a/docs/api/modules/spython/image/cmd/create.html
+++ b/docs/api/modules/spython/image/cmd/create.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -160,10 +159,10 @@
Source code for spython.image.cmd.create
import os
-from spython.logger import bot
+from spython.logger import bot
-[docs]def create(self, image_path, size=1024, sudo=False):
+
[docs]def create(self, image_path, size=1024, sudo=False, singularity_options=None):
"""create will create a a new image
Parameters
@@ -171,13 +170,13 @@
Source code for spython.image.cmd.create
image_path: full path to image
size: image sizein MiB, default is 1024MiB
filesystem: supported file systems ext3/ext4 (ext[2/3]: default ext3
-
+ singularity_options: a list of options to provide to the singularity client
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
- cmd = self.init_command("image.create")
+ cmd = self.init_command("image.create", singularity_options)
cmd = cmd + ["--size", str(size), image_path]
output = self.run_command(cmd, sudo=sudo)
diff --git a/docs/api/modules/spython/image/cmd/export.html b/docs/api/modules/spython/image/cmd/export.html
index 39a521e9..99c7b3a4 100644
--- a/docs/api/modules/spython/image/cmd/export.html
+++ b/docs/api/modules/spython/image/cmd/export.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -159,7 +158,7 @@
Source code for spython.image.cmd.export
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
+from spython.logger import bot
import tempfile
@@ -173,7 +172,7 @@ Source code for spython.image.cmd.export
tmptar: if defined, use custom temporary path for tar export
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
diff --git a/docs/api/modules/spython/image/cmd/importcmd.html b/docs/api/modules/spython/image/cmd/importcmd.html
index d377d7e3..60a69092 100644
--- a/docs/api/modules/spython/image/cmd/importcmd.html
+++ b/docs/api/modules/spython/image/cmd/importcmd.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -169,7 +168,7 @@
Source code for spython.image.cmd.importcmd
import_type: if not specified, imports whatever function is given
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
diff --git a/docs/api/modules/spython/image/cmd/utils.html b/docs/api/modules/spython/image/cmd/utils.html
index 21995667..dfeb4765 100644
--- a/docs/api/modules/spython/image/cmd/utils.html
+++ b/docs/api/modules/spython/image/cmd/utils.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -160,7 +159,7 @@
Source code for spython.image.cmd.utils
import os
-from spython.logger import bot
+from spython.logger import bot
[docs]def compress(self, image_path):
diff --git a/docs/api/modules/spython/instance.html b/docs/api/modules/spython/instance.html
index 35deff4c..b1e26d88 100644
--- a/docs/api/modules/spython/instance.html
+++ b/docs/api/modules/spython/instance.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -154,12 +153,12 @@
Source code for spython.instance
# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.image import ImageBase
+from spython.image import ImageBase
import os
[docs]class Instance(ImageBase):
-
def __init__(self, image, start=True, name=None, **kwargs):
+
def __init__(self, image, start=True, name=None, **kwargs):
"""An instance is an image running as an instance with services.
This class has functions appended under cmd/__init__ and is
instantiated when the user calls Client.
@@ -236,13 +235,13 @@
Source code for spython.instance
elif "container_image" in kwargs:
self._image = kwargs["container_image"]
- def __str__(self):
+ def __str__(self):
if hasattr(self, "name"):
if self.protocol:
return "%s://%s" % (self.protocol, self.name)
return os.path.basename(self._image)
- def __repr__(self):
+ def __repr__(self):
return self.__str__()
diff --git a/docs/api/modules/spython/instance/cmd.html b/docs/api/modules/spython/instance/cmd.html
index 8bc0ccf4..8d18cc02 100644
--- a/docs/api/modules/spython/instance/cmd.html
+++ b/docs/api/modules/spython/instance/cmd.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -163,18 +162,18 @@
Source code for spython.instance.cmd
client via the environment variable MESSAGELEVEL.
"""
- from spython.instance import Instance
+ from spython.instance import Instance
- from spython.main.base.logger import println
- from spython.main.instances import list_instances
- from spython.utils import run_command as run_cmd
+ from spython.main.base.logger import println
+ from spython.main.instances import list_instances
+ from spython.utils import run_command as run_cmd
# run_command uses run_cmd, but wraps to catch error
- from spython.main.base.command import init_command, run_command
- from spython.main.base.generate import RobotNamer
- from .start import start
- from .stop import stop
- from .logs import error_logs, output_logs, _logs
+ from spython.main.base.command import init_command, run_command
+ from spython.main.base.generate import RobotNamer
+ from .start import start
+ from .stop import stop
+ from .logs import error_logs, output_logs, _logs
Instance.RobotNamer = RobotNamer()
Instance._init_command = init_command
diff --git a/docs/api/modules/spython/instance/cmd/iutils.html b/docs/api/modules/spython/instance/cmd/iutils.html
index 252083c2..88f1d6c5 100644
--- a/docs/api/modules/spython/instance/cmd/iutils.html
+++ b/docs/api/modules/spython/instance/cmd/iutils.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -158,8 +157,8 @@
Source code for spython.instance.cmd.iutils
# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.instance import Instance
-from spython.logger import bot
+from spython.instance import Instance
+from spython.logger import bot
[docs]def parse_table(table_string, header, remove_rows=1):
@@ -189,11 +188,11 @@
Source code for spython.instance.cmd.iutils
-
[docs]def get(self, name, return_json=False, quiet=False):
+
[docs]def get(self, name, return_json=False, quiet=False, singularity_options=None):
"""get is a list for a single instance. It is assumed to be running,
and we need to look up the PID, etc.
"""
-
from spython.utils import check_install
+
from spython.utils import check_install
check_install()
@@ -203,7 +202,7 @@
Source code for spython.instance.cmd.iutils
if "version 3" in self.version():
subgroup = ["instance", "list"]
- cmd = self._init_command(subgroup)
+ cmd = self._init_command(subgroup, singularity_options)
cmd.append(name)
output = self.run_command(cmd, quiet=True)
diff --git a/docs/api/modules/spython/instance/cmd/logs.html b/docs/api/modules/spython/instance/cmd/logs.html
index 00c56e4a..7035551f 100644
--- a/docs/api/modules/spython/instance/cmd/logs.html
+++ b/docs/api/modules/spython/instance/cmd/logs.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -159,8 +158,8 @@
Source code for spython.instance.cmd.logs
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.utils import get_userhome, get_username
-from spython.logger import bot
+from spython.utils import get_userhome, get_username
+from spython.logger import bot
import platform
import os
@@ -195,7 +194,7 @@ Source code for spython.instance.cmd.logs
"""A shared function to print log files. The only differing element is
the extension (err or out)
"""
- from spython.utils import check_install, run_command
+ from spython.utils import check_install, run_command
check_install()
diff --git a/docs/api/modules/spython/instance/cmd/start.html b/docs/api/modules/spython/instance/cmd/start.html
index aea796e0..abed7842 100644
--- a/docs/api/modules/spython/instance/cmd/start.html
+++ b/docs/api/modules/spython/instance/cmd/start.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -159,11 +158,18 @@
Source code for spython.instance.cmd.start
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
+from spython.logger import bot
[docs]def start(
-
self, image=None, name=None, args=None, sudo=False, options=None, capture=False
+
self,
+
image=None,
+
name=None,
+
args=None,
+
sudo=False,
+
options=None,
+
capture=False,
+
singularity_options=None,
):
"""start an instance. This is done by default when an instance is created.
@@ -174,6 +180,7 @@
Source code for spython.instance.cmd.start
sudo: if the user wants to run the command with sudo
capture: capture output, default is False. With True likely to hang.
args: arguments to provide to the instance (supported Singularity 3.1+)
+ singularity_options: a list of options to provide to the singularity client
options: a list of tuples, each an option to give to the start command
[("--bind", "/tmp"),...]
@@ -181,7 +188,7 @@ Source code for spython.instance.cmd.start
singularity [...] instance.start [...] <container path> <instance name>
"""
- from spython.utils import run_command, check_install
+ from spython.utils import run_command, check_install
check_install()
@@ -203,7 +210,7 @@ Source code for spython.instance.cmd.start
if "version 3" in self.version():
subgroup = ["instance", "start"]
- cmd = self._init_command(subgroup)
+ cmd = self._init_command(subgroup, singularity_options)
# Add options, if they are provided
if not isinstance(options, list):
diff --git a/docs/api/modules/spython/instance/cmd/stop.html b/docs/api/modules/spython/instance/cmd/stop.html
index 048ce2c8..eb877067 100644
--- a/docs/api/modules/spython/instance/cmd/stop.html
+++ b/docs/api/modules/spython/instance/cmd/stop.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -159,16 +158,17 @@
Source code for spython.instance.cmd.stop
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
+from spython.logger import bot
-[docs]def stop(self, name=None, sudo=False, timeout=None):
+
[docs]def stop(self, name=None, sudo=False, timeout=None, singularity_options=None):
"""stop an instance. This is done by default when an instance is created.
Parameters
==========
name: a name for the instance
sudo: if the user wants to run the command with sudo
+
singularity_options: a list of options to provide to the singularity client
timeout: forcebly kill non-stopped instance after the
timeout specified in seconds
@@ -176,7 +176,7 @@
Source code for spython.instance.cmd.stop
singularity [...] instance.stop [...] <instance name>
"""
- from spython.utils import check_install, run_command
+ from spython.utils import check_install, run_command
check_install()
@@ -187,7 +187,7 @@ Source code for spython.instance.cmd.stop
if timeout:
subgroup += ["-t", str(timeout)]
- cmd = self._init_command(subgroup)
+ cmd = self._init_command(subgroup, singularity_options)
# If name is provided assume referencing an instance
instance_name = self.name
diff --git a/docs/api/modules/spython/logger/message.html b/docs/api/modules/spython/logger/message.html
index e9997ce6..7dbb9f4b 100644
--- a/docs/api/modules/spython/logger/message.html
+++ b/docs/api/modules/spython/logger/message.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -156,8 +155,8 @@
Source code for spython.logger.message
import os
import sys
-from .spinner import Spinner
-from spython.logger import decodeUtf8String
+from .spinner import Spinner
+from spython.logger import decodeUtf8String
ABORT = -5
CRITICAL = -4
@@ -180,7 +179,7 @@ Source code for spython.logger.message
[docs]class SingularityMessage:
-
def __init__(self, MESSAGELEVEL=None):
+
def __init__(self, MESSAGELEVEL=None):
self.level = get_logging_level()
self.history = []
self.errorStream = sys.stderr
diff --git a/docs/api/modules/spython/logger/progress.html b/docs/api/modules/spython/logger/progress.html
index af986283..4c9c609a 100644
--- a/docs/api/modules/spython/logger/progress.html
+++ b/docs/api/modules/spython/logger/progress.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,7 +156,7 @@
Source code for spython.logger.progress
# Credit to base code goes to https://github.com/kennethreitz/clint/blob/master/clint/textui/progress.py
-from __future__ import absolute_import
+from __future__ import absolute_import
import sys
import time
@@ -176,14 +175,14 @@ Source code for spython.logger.progress
[docs]class ProgressBar(object):
-
def __enter__(self):
+
def __enter__(self):
return self
-
def __exit__(self, exc_type, exc_val, exc_tb):
+
def __exit__(self, exc_type, exc_val, exc_tb):
self.done()
return False # we're not suppressing exceptions
-
def __init__(
+
def __init__(
self,
label="",
width=32,
diff --git a/docs/api/modules/spython/logger/spinner.html b/docs/api/modules/spython/logger/spinner.html
index 9dc6c981..89f9a136 100644
--- a/docs/api/modules/spython/logger/spinner.html
+++ b/docs/api/modules/spython/logger/spinner.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -158,7 +157,7 @@
Source code for spython.logger.spinner
import sys
import time
import threading
-from random import choice
+from random import choice
[docs]class Spinner:
@@ -189,7 +188,7 @@
Source code for spython.logger.spinner
-
def __init__(self, delay=None, generator=None):
+
def __init__(self, delay=None, generator=None):
generator = self.select_generator(generator)
if generator == "cursor":
diff --git a/docs/api/modules/spython/main.html b/docs/api/modules/spython/main.html
index 57003d4e..eddf3e2c 100644
--- a/docs/api/modules/spython/main.html
+++ b/docs/api/modules/spython/main.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -166,22 +165,22 @@
Source code for spython.main
debug: turn on debugging mode
"""
- from spython.utils import get_singularity_version
- from .base import Client as client
+ from spython.utils import get_singularity_version
+ from .base import Client as client
client.quiet = quiet
client.debug = debug
# Do imports here, can be customized
- from .apps import apps
- from .build import build
- from .execute import execute, shell
- from .help import helpcmd
- from .inspect import inspect
- from .instances import list_instances, stopall # global instance commands
- from .run import run
- from .pull import pull
- from .export import export, _export
+ from .apps import apps
+ from .build import build
+ from .execute import execute, shell
+ from .help import helpcmd
+ from .inspect import inspect
+ from .instances import list_instances, stopall # global instance commands
+ from .run import run
+ from .pull import pull
+ from .export import export, _export
# Actions
client.apps = apps
@@ -197,12 +196,12 @@ Source code for spython.main
client.pull = pull
# Command Groups, Images
- from spython.image.cmd import generate_image_commands # deprecated
+ from spython.image.cmd import generate_image_commands # deprecated
client.image = generate_image_commands()
# Commands Groups, Instances
- from spython.instance.cmd import (
+ from spython.instance.cmd import (
generate_instance_commands,
) # instance level commands
@@ -212,7 +211,7 @@ Source code for spython.main
# Commands Groups, OCI (Singularity version 3 and up)
if "version 3" in get_singularity_version():
- from spython.oci.cmd import generate_oci_commands
+ from spython.oci.cmd import generate_oci_commands
client.oci = generate_oci_commands()() # first () runs function, second
# initializes OciImage class
diff --git a/docs/api/modules/spython/main/apps.html b/docs/api/modules/spython/main/apps.html
index 82509b9c..646c9513 100644
--- a/docs/api/modules/spython/main/apps.html
+++ b/docs/api/modules/spython/main/apps.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -162,7 +161,8 @@
Source code for spython.main.apps
return list of SCIF apps in image. The Singularity software serves
a scientific filesystem integration that will install apps to
/scif/apps and associated data to /scif/data. For more information
- about SCIF, see https://sci-f.github.io
+ about SCIF, see https://sci-f.github.io. Note that this seems
+ to be deprecated in Singularity 3.x.
Parameters
==========
@@ -170,7 +170,7 @@ Source code for spython.main.apps
image_path: full path to the image
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
diff --git a/docs/api/modules/spython/main/base.html b/docs/api/modules/spython/main/base.html
index f301a9bf..18e9ef9f 100644
--- a/docs/api/modules/spython/main/base.html
+++ b/docs/api/modules/spython/main/base.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,18 +156,18 @@
Source code for spython.main.base
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
-from spython.utils import (
+from spython.logger import bot
+from spython.utils import (
check_install,
get_singularity_version,
get_singularity_version_info,
)
-from .command import generate_bind_list, init_command, run_command
-from .flags import parse_verbosity
-from .sutils import get_uri, load, setenv, get_filename
-from .logger import println, init_level
-from .generate import RobotNamer
+from .command import generate_bind_list, init_command, run_command
+from .flags import parse_verbosity
+from .sutils import get_uri, load, setenv, get_filename
+from .logger import println, init_level
+from .generate import RobotNamer
import json
import sys
@@ -177,17 +176,17 @@ Source code for spython.main.base
[docs]class Client:
-
def __str__(self):
+
def __str__(self):
base = "[singularity-python]"
if hasattr(self, "simage"):
if self.simage.image not in [None, ""]:
base = "%s[%s]" % (base, self.simage)
return base
-
def __repr__(self):
+
def __repr__(self):
return self.__str__()
-
def __init__(self):
+
def __init__(self):
"""the base client for singularity, will have commands added to it.
upon init, store verbosity requested in environment MESSAGELEVEL.
"""
diff --git a/docs/api/modules/spython/main/base/command.html b/docs/api/modules/spython/main/base/command.html
index 63d56a4d..ea2cf74e 100644
--- a/docs/api/modules/spython/main/base/command.html
+++ b/docs/api/modules/spython/main/base/command.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -159,9 +158,9 @@
Source code for spython.main.base.command
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.utils import run_command as run_cmd
+from spython.utils import run_command as run_cmd
-from spython.logger import bot
+from spython.logger import bot
import subprocess
import sys
@@ -174,13 +173,13 @@ Source code for spython.main.base.command
Parameters
==========
action: the main action to perform (e.g., build)
- flags: one or more additional flags (e.g, volumes)
- not implemented yet.
+ flags: one or more additional singularity options
"""
+ flags = flags or []
if not isinstance(action, list):
action = [action]
- cmd = ["singularity"] + action
+ cmd = ["singularity"] + flags + action
if self.quiet:
cmd.insert(1, "--quiet")
diff --git a/docs/api/modules/spython/main/base/flags.html b/docs/api/modules/spython/main/base/flags.html
index bd09c8f0..f3399456 100644
--- a/docs/api/modules/spython/main/base/flags.html
+++ b/docs/api/modules/spython/main/base/flags.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
diff --git a/docs/api/modules/spython/main/base/generate.html b/docs/api/modules/spython/main/base/generate.html
index 01db558b..23adc89f 100644
--- a/docs/api/modules/spython/main/base/generate.html
+++ b/docs/api/modules/spython/main/base/generate.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -161,7 +160,7 @@
Source code for spython.main.base.generate
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from random import choice
+from random import choice
[docs]class RobotNamer:
diff --git a/docs/api/modules/spython/main/base/logger.html b/docs/api/modules/spython/main/base/logger.html
index 830c8317..5869ae99 100644
--- a/docs/api/modules/spython/main/base/logger.html
+++ b/docs/api/modules/spython/main/base/logger.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -160,7 +159,7 @@
Source code for spython.main.base.logger
import os
-from spython.logger import decodeUtf8String
+from spython.logger import decodeUtf8String
[docs]def init_level(self, quiet=False):
diff --git a/docs/api/modules/spython/main/base/sutils.html b/docs/api/modules/spython/main/base/sutils.html
index ac3a0899..df78a903 100644
--- a/docs/api/modules/spython/main/base/sutils.html
+++ b/docs/api/modules/spython/main/base/sutils.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -162,7 +161,7 @@
Source code for spython.main.base.sutils
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
+from spython.logger import bot
import os
import re
@@ -175,8 +174,8 @@ Source code for spython.main.base.sutils
image: the image path or uri to load (e.g., docker://ubuntu
"""
- from spython.image import Image
- from spython.instance import Instance
+ from spython.image import Image
+ from spython.instance import Instance
self.simage = Image(image)
diff --git a/docs/api/modules/spython/main/build.html b/docs/api/modules/spython/main/build.html
index 9ff10c0f..c257091b 100644
--- a/docs/api/modules/spython/main/build.html
+++ b/docs/api/modules/spython/main/build.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,8 +156,8 @@
Source code for spython.main.build
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
-from spython.utils import stream_command
+from spython.logger import bot
+from spython.utils import stream_command
import re
import os
@@ -180,6 +179,7 @@ Source code for spython.main.build
quiet=False,
return_result=False,
sudo_options=None,
+ singularity_options=None,
):
"""build a singularity image, optionally for an isolated build
@@ -205,18 +205,18 @@ Source code for spython.main.build
sudo: give sudo to the command (or not) default is True for build
sudo_options: options to pass to sudo (e.g. --preserve-env=SINGULARITY_CACHEDIR,SINGULARITY_TMPDIR)
options: for all other options, specify them in this list.
+ singularity_options: a list of options to provide to the singularity client
quiet: quiet verbose printing from the client.
return_result: if True, return complete error code / message dictionary
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
- cmd = self._init_command("build")
+ cmd = self._init_command("build", singularity_options)
# If no extra options
- if not options:
- options = []
+ options = options or []
if "version 3" in self.version():
ext = "sif"
@@ -237,7 +237,7 @@ Source code for spython.main.build
bot.exit("Cannot find %s, exiting." % image)
if image is None:
- if re.search("(docker|shub)://", recipe) and not robot_name:
+ if re.search("(docker|shub|library)://", recipe) and not robot_name:
image = self._get_filename(recipe, ext)
else:
image = "%s.%s" % (self.RobotNamer.generate(), ext)
diff --git a/docs/api/modules/spython/main/execute.html b/docs/api/modules/spython/main/execute.html
index 6114baaf..e70326f6 100644
--- a/docs/api/modules/spython/main/execute.html
+++ b/docs/api/modules/spython/main/execute.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,8 +156,8 @@
Source code for spython.main.execute
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
-from spython.utils import stream_command, which
+from spython.logger import bot
+from spython.utils import stream_command, which
import os
@@ -175,6 +174,7 @@ Source code for spython.main.execute
nv=False,
return_result=False,
options=None,
+ singularity_options=None,
sudo=False,
quiet=True,
):
@@ -190,6 +190,7 @@ Source code for spython.main.execute
contain: This option disables the automatic sharing of writable
filesystems on your host
options: an optional list of options to provide to execute.
+ singularity_options: a list of options to provide to the singularity client
bind: list or single string of bind paths.
This option allows you to map directories on your host system to
directories within your container using bind mounts
@@ -197,11 +198,11 @@ Source code for spython.main.execute
return_result: if True, return entire json object with return code
and message result not (default)
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
- cmd = self._init_command("exec")
+ cmd = self._init_command("exec", singularity_options)
# nv option leverages any GPU cards
if nv:
@@ -265,6 +266,7 @@ Source code for spython.main.execute
bind=None,
nv=False,
options=None,
+ singularity_options=None,
sudo=False,
):
""" shell into a container. A user is advised to use singularity to do
@@ -279,16 +281,17 @@ Source code for spython.main.execute
contain: This option disables the automatic sharing of writable
filesystems on your host
options: an optional list of options to provide to shell.
+ singularity_options: a list of options to provide to the singularity client
bind: list or single string of bind paths.
This option allows you to map directories on your host system to
directories within your container using bind mounts
nv: if True, load Nvidia Drivers in runtime (default False)
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
- cmd = self._init_command("shell")
+ cmd = self._init_command("shell", singularity_options)
# nv option leverages any GPU cards
if nv:
diff --git a/docs/api/modules/spython/main/export.html b/docs/api/modules/spython/main/export.html
index 0dca8a0a..6648a83a 100644
--- a/docs/api/modules/spython/main/export.html
+++ b/docs/api/modules/spython/main/export.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,13 +156,21 @@
Source code for spython.main.export
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
+from spython.logger import bot
import tempfile
import shutil
import os
-def export(self, image_path, pipe=False, output_file=None, command=None, sudo=False):
+def export(
+ self,
+ image_path,
+ pipe=False,
+ output_file=None,
+ command=None,
+ sudo=False,
+ singularity_options=None,
+):
"""export will export an image, sudo must be used. If we have Singularity
versions after 3, export is replaced with building into a sandbox.
@@ -172,10 +179,11 @@ Source code for spython.main.export
==========
image_path: full path to image
pipe: export to pipe and not file (default, False)
+ singularity_options: a list of options to provide to the singularity client
output_file: if pipe=False, export tar to this file. If not specified,
will generate temporary directory.
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
@@ -191,19 +199,35 @@ Source code for spython.main.export
output_file = self._get_filename(basename, "sandbox", pwd=False)
return self.build(
- recipe=image_path, image=output_file, sandbox=True, force=True, sudo=sudo
+ recipe=image_path,
+ image=output_file,
+ sandbox=True,
+ force=True,
+ sudo=sudo,
+ singularity_options=singularity_options,
)
# If not version 3, run deprecated command
elif "2.5" in self.version():
return self._export(
- image_path=image_path, pipe=pipe, output_file=output_file, command=command
+ image_path=image_path,
+ pipe=pipe,
+ output_file=output_file,
+ command=command,
+ singularity_options=singularity_options,
)
bot.warning("Unsupported version of Singularity, %s" % self.version())
-def _export(self, image_path, pipe=False, output_file=None, command=None):
+def _export(
+ self,
+ image_path,
+ pipe=False,
+ output_file=None,
+ command=None,
+ singularity_options=None,
+):
""" the older deprecated function, running export for previous
versions of Singularity that support it
@@ -221,7 +245,7 @@ Source code for spython.main.export
"""
sudo = True
- cmd = self._init_command("export")
+ cmd = self._init_command("export", singularity_options)
# If the user has specified export to pipe, we don't need a file
if pipe:
diff --git a/docs/api/modules/spython/main/help.html b/docs/api/modules/spython/main/help.html
index 43bba4fa..2b95ed8e 100644
--- a/docs/api/modules/spython/main/help.html
+++ b/docs/api/modules/spython/main/help.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -165,7 +164,7 @@
Source code for spython.main.help
command: the command to get help for, if none, prints general help
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
diff --git a/docs/api/modules/spython/main/inspect.html b/docs/api/modules/spython/main/inspect.html
index f98e6a88..f52ac884 100644
--- a/docs/api/modules/spython/main/inspect.html
+++ b/docs/api/modules/spython/main/inspect.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,12 +156,14 @@
Source code for spython.main.inspect
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
import json as jsonp
-from spython.logger import bot
+from spython.logger import bot
-from spython.utils import check_install, run_command
+from spython.utils import check_install, run_command
-[docs]def inspect(self, image=None, json=True, app=None, quiet=True):
+
[docs]def inspect(
+
self, image=None, json=True, app=None, quiet=True, singularity_options=None
+
):
"""inspect will show labels, defile, runscript, and tests for an image
Parameters
@@ -171,6 +172,7 @@
Source code for spython.main.inspect
json: print json instead of raw text (default True)
quiet: Don't print result to the screen (default True)
app: if defined, return help in context of an app
+ singularity_options: a list of options to provide to the singularity client
"""
check_install()
@@ -183,7 +185,7 @@ Source code for spython.main.inspect
if not image:
bot.exit("Please provide an image to inspect.")
- cmd = self._init_command("inspect")
+ cmd = self._init_command("inspect", singularity_options)
if app:
cmd = cmd + ["--app", app]
diff --git a/docs/api/modules/spython/main/instances.html b/docs/api/modules/spython/main/instances.html
index 1872a090..0dd2a102 100644
--- a/docs/api/modules/spython/main/instances.html
+++ b/docs/api/modules/spython/main/instances.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,11 +156,18 @@
Source code for spython.main.instances
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
-from spython.utils import run_command
+from spython.logger import bot
+from spython.utils import run_command
-[docs]def list_instances(self, name=None, return_json=False, quiet=False, sudo=False):
+
[docs]def list_instances(
+
self,
+
name=None,
+
return_json=False,
+
quiet=False,
+
sudo=False,
+
singularity_options=None,
+
):
"""list instances. For Singularity, this is provided as a command sub
group.
@@ -174,6 +180,7 @@
Source code for spython.main.instances
==========
return_json: return a json list of instances instead of objects (False)
name: if defined, return the list for just one instance (used to ged pid)
+ singularity_options: a list of options to provide to the singularity client
Return Code -- Reason
0 -- Instances Found
@@ -181,8 +188,8 @@ Source code for spython.main.instances
255 -- Couldn't get UID
"""
- from spython.instance.cmd.iutils import parse_table
- from spython.utils import check_install
+ from spython.instance.cmd.iutils import parse_table
+ from spython.utils import check_install
check_install()
@@ -191,7 +198,7 @@ Source code for spython.main.instances
if "version 3" in self.version():
subgroup = ["instance", "list"]
- cmd = self._init_command(subgroup)
+ cmd = self._init_command(subgroup, singularity_options)
# If the user has provided a name, we want to see a particular instance
if name is not None:
@@ -255,7 +262,7 @@ Source code for spython.main.instances
-[docs]def stopall(self, sudo=False, quiet=True):
+
[docs]def stopall(self, sudo=False, quiet=True, singularity_options=None):
"""stop ALL instances. This command is only added to the command group
as it doesn't make sense to call from a single instance
@@ -265,7 +272,7 @@
Source code for spython.main.instances
instances)
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
@@ -274,7 +281,7 @@ Source code for spython.main.instances
if "version 3" in self.version():
subgroup = ["instance", "stop"]
- cmd = self._init_command(subgroup)
+ cmd = self._init_command(subgroup, singularity_options)
cmd = cmd + ["--all"]
output = run_command(cmd, sudo=sudo, quiet=quiet)
diff --git a/docs/api/modules/spython/main/parse/recipe.html b/docs/api/modules/spython/main/parse/recipe.html
index e9c29803..a4242f0f 100644
--- a/docs/api/modules/spython/main/parse/recipe.html
+++ b/docs/api/modules/spython/main/parse/recipe.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -172,7 +171,7 @@
Source code for spython.main.parse.recipe
"""
- def __init__(self, recipe=None):
+ def __init__(self, recipe=None):
self.cmd = None
self.comments = []
@@ -188,7 +187,7 @@ Source code for spython.main.parse.recipe
self.source = recipe
- def __str__(self):
+ def __str__(self):
""" show the user the recipe object, along with the type. E.g.,
[spython-recipe][source:Singularity]
@@ -231,7 +230,7 @@ Source code for spython.main.parse.recipe
- def __repr__(self):
+ def __repr__(self):
return self.__str__()
diff --git a/docs/api/modules/spython/main/pull.html b/docs/api/modules/spython/main/pull.html
index 6e68f601..4fdb732e 100644
--- a/docs/api/modules/spython/main/pull.html
+++ b/docs/api/modules/spython/main/pull.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,8 +156,8 @@
Source code for spython.main.pull
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
-from spython.utils import stream_command, ScopedEnvVar
+from spython.logger import bot
+from spython.utils import stream_command, ScopedEnvVar
import os
import re
@@ -173,6 +172,7 @@ Source code for spython.main.pull
capture=False,
stream=False,
quiet=False,
+ singularity_options=None,
):
"""pull will pull a singularity hub or Docker image
@@ -180,6 +180,7 @@ Source code for spython.main.pull
Parameters
==========
image: the complete image uri. If not provided, the client loaded is used
+ singularity_options: a list of options to provide to the singularity client
pull_folder: if not defined, pulls to $PWD (''). If defined, pulls to
user specified location instead.
@@ -189,11 +190,11 @@ Source code for spython.main.pull
ext: if no name specified, the default extension to use.
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
- cmd = self._init_command("pull")
+ cmd = self._init_command("pull", singularity_options)
# Quiet is honored if set by the client, or user
quiet = quiet or self.quiet
@@ -209,9 +210,9 @@ Source code for spython.main.pull
if image is None:
bot.exit("You must provide an image uri, or use client.load() first.")
- # Singularity Only supports shub and Docker pull
- if not re.search("^(shub|docker)://", image):
- bot.exit("pull only valid for docker and shub. Use sregistry client.")
+ # Singularity Only supports shub, docker and library pull
+ if not re.search("^(shub|docker|library)://", image):
+ bot.exit("pull only valid for docker, shub and library. Use sregistry client.")
# If we still don't have a custom name, base off of image uri.
if name is None:
diff --git a/docs/api/modules/spython/main/run.html b/docs/api/modules/spython/main/run.html
index 9f6892da..5d8f71aa 100644
--- a/docs/api/modules/spython/main/run.html
+++ b/docs/api/modules/spython/main/run.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -157,8 +156,8 @@
Source code for spython.main.run
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.logger import bot
-from spython.utils import stream_command
+from spython.logger import bot
+from spython.utils import stream_command
import json
@@ -174,6 +173,7 @@ Source code for spython.main.run
stream=False,
nv=False,
options=None,
+ singularity_options=None,
return_result=False,
):
"""
@@ -187,6 +187,7 @@ Source code for spython.main.run
app: if not None, execute a command in context of an app
writable: This option makes the file system accessible as read/write
options: an optional list of options to provide to run.
+ singularity_options: a list of options to provide to the singularity client
contain: This option disables the automatic sharing of writable
filesystems on your host
bind: list or single string of bind paths.
@@ -198,11 +199,11 @@ Source code for spython.main.run
and message result (default is False)
"""
- from spython.utils import check_install
+ from spython.utils import check_install
check_install()
- cmd = self._init_command("run")
+ cmd = self._init_command("run", singularity_options)
# nv option leverages any GPU cards
if nv:
diff --git a/docs/api/modules/spython/oci.html b/docs/api/modules/spython/oci.html
index 30547860..f48d954d 100644
--- a/docs/api/modules/spython/oci.html
+++ b/docs/api/modules/spython/oci.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -154,8 +153,8 @@
Source code for spython.oci
# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-from spython.image import ImageBase
-from spython.logger import bot
+from spython.image import ImageBase
+from spython.logger import bot
import os
@@ -164,7 +163,7 @@ Source code for spython.oci
# Default functions of client don't use sudo
sudo = False
- def __init__(
+ def __init__(
self, container_id=None, bundle=None, create=True, sudo=True, **kwargs
):
""" An Oci Image is an Image Base with OCI functions appended
@@ -218,12 +217,12 @@ Source code for spython.oci
# Naming
- def __str__(self):
+ def __str__(self):
if self.container_id is not None:
return "[singularity-python-oci:%s]" % self.container_id
return "[singularity-python-oci]"
- def __repr__(self):
+ def __repr__(self):
return self.__str__()
# Commands
@@ -279,7 +278,7 @@ Source code for spython.oci
not implemented yet.
"""
- from spython.main.base.command import init_command
+ from spython.main.base.command import init_command
if not isinstance(action, list):
action = [action]
diff --git a/docs/api/modules/spython/tests/test_client.html b/docs/api/modules/spython/tests/test_client.html
deleted file mode 100644
index bd21d493..00000000
--- a/docs/api/modules/spython/tests/test_client.html
+++ /dev/null
@@ -1,247 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- spython.tests.test_client — Singularity Python API 1 documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Source code for spython.tests.test_client
-#!/usr/bin/python
-
-# Copyright (C) 2017-2020 Vanessa Sochat.
-
-# This Source Code Form is subject to the terms of the
-# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
-# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from spython.main import Client
-import shutil
-import os
-
-
-[docs]def test_build_from_docker(tmp_path):
-
container = str(tmp_path / "container.sif")
-
-
created_container = Client.build(
-
"docker://busybox:1.30.1", image=container, sudo=False
-
)
-
assert created_container == container
-
assert os.path.exists(created_container)
-
-
-[docs]def test_export():
-
sandbox = "busybox:1.30.sandbox"
-
created_sandbox = Client.export("docker://busybox:1.30.1")
-
assert created_sandbox == sandbox
-
assert os.path.exists(created_sandbox)
-
shutil.rmtree(created_sandbox)
-
-
-[docs]def test_docker_pull(docker_container):
-
tmp_path, container = docker_container
-
print(container)
-
ext = "sif" if Client.version_info().major >= 3 else "simg"
-
assert container == str(tmp_path / ("busybox:1.30.1." + ext))
-
assert os.path.exists(container)
-
-
-[docs]def test_execute(docker_container):
-
result = Client.execute(docker_container[1], "ls /")
-
print(result)
-
assert "tmp\nusr\nvar" in result
-
-
-[docs]def test_execute_with_return_code(docker_container):
-
result = Client.execute(docker_container[1], "ls /", return_result=True)
-
print(result)
-
assert "tmp\nusr\nvar" in result["message"]
-
assert result["return_code"] == 0
-
-
-[docs]def test_inspect(docker_container):
-
result = Client.inspect(docker_container[1])
-
assert "attributes" in result or "data" in result
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/api/modules/spython/tests/test_instances.html b/docs/api/modules/spython/tests/test_instances.html
deleted file mode 100644
index 53ea8780..00000000
--- a/docs/api/modules/spython/tests/test_instances.html
+++ /dev/null
@@ -1,261 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- spython.tests.test_instances — Singularity Python API 1 documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - Docs »
-
- - Module code »
-
- - spython.tests.test_instances
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
Source code for spython.tests.test_instances
-#!/usr/bin/python
-
-# Copyright (C) 2017-2020 Vanessa Sochat.
-
-# This Source Code Form is subject to the terms of the
-# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
-# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-import pytest
-from spython.main import Client
-
-
-[docs]def test_instance_class():
-
instance = Client.instance("docker://ubuntu", start=False)
-
assert instance.get_uri() == "instance://" + instance.name
-
assert instance.name != ""
-
-
name = "coolName"
-
instance = Client.instance("docker://busybox:1.30.1", start=False, name=name)
-
assert instance.get_uri() == "instance://" + instance.name
-
assert instance.name == name
-
-
-[docs]def test_has_no_instances():
-
instances = Client.instances()
-
assert instances == []
-
-
-[docs]class TestInstanceFuncs(object):
-
[docs] @pytest.fixture(autouse=True)
-
def cleanup(self):
-
yield
-
Client.instance_stopall()
-
-
[docs] def test_instance_cmds(self, docker_container):
-
image = docker_container[1]
-
myinstance = Client.instance(image)
-
assert myinstance.get_uri().startswith("instance://")
-
-
print("...Case 2: List instances")
-
instances = Client.instances()
-
assert len(instances) == 1
-
instances = Client.instances(return_json=True)
-
assert len(instances) == 1
-
assert isinstance(instances[0], dict)
-
-
print("...Case 3: Commands to instances")
-
result = Client.execute(myinstance, ["echo", "hello"])
-
assert result == "hello\n"
-
-
print("...Case 4: Return value from instance")
-
result = Client.execute(myinstance, "ls /", return_result=True)
-
print(result)
-
assert "tmp\nusr\nvar" in result["message"]
-
assert result["return_code"] == 0
-
-
print("...Case 5: Stop instances")
-
myinstance.stop()
-
instances = Client.instances()
-
assert instances == []
-
myinstance1 = Client.instance(image)
-
myinstance2 = Client.instance(image)
-
assert myinstance1 is not None
-
assert myinstance2 is not None
-
instances = Client.instances()
-
assert len(instances) == 2
-
Client.instance_stopall()
-
instances = Client.instances()
-
assert instances == []
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/api/modules/spython/tests/test_utils.html b/docs/api/modules/spython/tests/test_utils.html
deleted file mode 100644
index 0fff93a1..00000000
--- a/docs/api/modules/spython/tests/test_utils.html
+++ /dev/null
@@ -1,367 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- spython.tests.test_utils — Singularity Python API 1 documentation
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Source code for spython.tests.test_utils
-#!/usr/bin/python
-
-# Copyright (C) 2017-2020 Vanessa Sochat.
-
-# This Source Code Form is subject to the terms of the
-# Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed
-# with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-import os
-import pytest
-from semver import VersionInfo
-from spython.utils import ScopedEnvVar
-
-
-[docs]def test_write_read_files(tmp_path):
-
"""test_write_read_files will test the functions write_file and read_file
-
"""
-
print("Testing utils.write_file...")
-
from spython.utils import write_file
-
-
tmpfile = str(tmp_path / "written_file.txt")
-
assert not os.path.exists(tmpfile)
-
write_file(tmpfile, "hello!")
-
assert os.path.exists(tmpfile)
-
-
print("Testing utils.read_file...")
-
from spython.utils import read_file
-
-
content = read_file(tmpfile)[0]
-
assert content == "hello!"
-
-
-[docs]def test_write_bad_json(tmp_path):
-
from spython.utils import write_json
-
-
bad_json = {"Wakkawakkawakka'}": [{True}, "2", 3]}
-
tmpfile = str(tmp_path / "json_file.txt")
-
assert not os.path.exists(tmpfile)
-
with pytest.raises(TypeError):
-
write_json(bad_json, tmpfile)
-
-
-[docs]def test_write_json(tmp_path):
-
import json
-
from spython.utils import write_json
-
-
good_json = {"Wakkawakkawakka": [True, "2", 3]}
-
tmpfile = str(tmp_path / "good_json_file.txt")
-
assert not os.path.exists(tmpfile)
-
write_json(good_json, tmpfile)
-
with open(tmpfile, "r") as f:
-
content = json.loads(f.read())
-
assert isinstance(content, dict)
-
assert "Wakkawakkawakka" in content
-
-
-[docs]def test_check_install():
-
"""check install is used to check if a particular software is installed.
-
If no command is provided, singularity is assumed to be the test case"""
-
print("Testing utils.check_install")
-
from spython.utils import check_install
-
-
is_installed = check_install()
-
assert is_installed
-
is_not_installed = check_install("fakesoftwarename")
-
assert not is_not_installed
-
-
-[docs]def test_check_get_singularity_version():
-
"""check that the singularity version is found to be that installed"""
-
from spython.utils import get_singularity_version
-
-
version = get_singularity_version()
-
assert version != ""
-
with ScopedEnvVar("SPYTHON_SINGULARITY_VERSION", "3.0"):
-
version = get_singularity_version()
-
assert version == "3.0"
-
-
-[docs]def test_check_get_singularity_version_info():
-
"""Check that the version_info is correct"""
-
from spython.utils import get_singularity_version_info
-
-
with ScopedEnvVar("SPYTHON_SINGULARITY_VERSION", "2.3.1"):
-
version = get_singularity_version_info()
-
assert version == VersionInfo(2, 3, 1)
-
assert version > VersionInfo(2, 3, 0)
-
assert version < VersionInfo(3, 0, 0)
-
-
with ScopedEnvVar("SPYTHON_SINGULARITY_VERSION", "singularity version 3.2.1-1"):
-
version = get_singularity_version_info()
-
assert version == VersionInfo(3, 2, 1, "1")
-
assert version > VersionInfo(2, 0, 0)
-
assert version < VersionInfo(3, 3, 0)
-
assert version > VersionInfo(3, 2, 0)
-
assert version < VersionInfo(3, 2, 1)
-
-
with ScopedEnvVar("SPYTHON_SINGULARITY_VERSION", "2.6.1-pull/124.1d068a7"):
-
version = get_singularity_version_info()
-
assert version == VersionInfo(2, 6, 1, "pull", "124.1d068a7")
-
assert version > VersionInfo(2, 6, 0)
-
assert version < VersionInfo(2, 7, 0)
-
-
-[docs]def test_get_installdir():
-
"""get install directory should return the base of where singularity
-
is installed
-
"""
-
print("Testing utils.get_installdir")
-
from spython.utils import get_installdir
-
-
whereami = get_installdir()
-
print(whereami)
-
assert whereami.endswith("spython")
-
-
-[docs]def test_split_uri():
-
from spython.utils import split_uri
-
-
protocol, image = split_uri("docker://ubuntu")
-
assert protocol == "docker"
-
assert image == "ubuntu"
-
-
protocol, image = split_uri("http://image/path/with/slash/")
-
assert protocol == "http"
-
assert image == "image/path/with/slash"
-
-
protocol, image = split_uri("no/proto/")
-
assert protocol == ""
-
assert image == "no/proto"
-
-
-[docs]def test_remove_uri():
-
print("Testing utils.remove_uri")
-
from spython.utils import remove_uri
-
-
assert remove_uri("docker://ubuntu") == "ubuntu"
-
assert (
-
remove_uri("shub://vanessa/singularity-images") == "vanessa/singularity-images"
-
)
-
assert remove_uri("vanessa/singularity-images") == "vanessa/singularity-images"
-
-
-[docs]def test_decode():
-
from spython.logger import decodeUtf8String
-
-
out = decodeUtf8String(str("Hello"))
-
assert isinstance(out, str)
-
assert out == "Hello"
-
out = decodeUtf8String(bytes(b"Hello"))
-
assert isinstance(out, str)
-
assert out == "Hello"
-
-
-[docs]def test_ScopedEnvVar():
-
assert "FOO" not in os.environ
-
with ScopedEnvVar("FOO", "bar") as e:
-
assert e.name == "FOO"
-
assert e.value == "bar"
-
assert os.environ["FOO"] == "bar"
-
with ScopedEnvVar("FOO", "baz"):
-
assert os.environ["FOO"] == "baz"
-
assert os.environ["FOO"] == "bar"
-
# None removes it
-
with ScopedEnvVar("FOO", None):
-
assert "FOO" not in os.environ
-
# But empty string is allowed
-
with ScopedEnvVar("FOO", ""):
-
assert os.environ["FOO"] == ""
-
assert os.environ["FOO"] == "bar"
-
assert "FOO" not in os.environ
-
# Unset a non-existing variable
-
with ScopedEnvVar("FOO", None):
-
assert "FOO" not in os.environ
-
assert "FOO" not in os.environ
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/docs/api/modules/spython/utils/fileio.html b/docs/api/modules/spython/utils/fileio.html
index a20eb46c..065fa483 100644
--- a/docs/api/modules/spython/utils/fileio.html
+++ b/docs/api/modules/spython/utils/fileio.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -161,7 +160,7 @@
Source code for spython.utils.fileio
import errno
import os
import json
-from spython.logger import bot
+from spython.logger import bot
import sys
diff --git a/docs/api/modules/spython/utils/terminal.html b/docs/api/modules/spython/utils/terminal.html
index 34e0b51b..1128d879 100644
--- a/docs/api/modules/spython/utils/terminal.html
+++ b/docs/api/modules/spython/utils/terminal.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
@@ -162,8 +161,8 @@
Source code for spython.utils.terminal
import pwd
import re
import semver
-from spython.logger import bot
-from spython.logger import decodeUtf8String
+from spython.logger import bot
+from spython.logger import decodeUtf8String
import subprocess
import sys
import shlex
@@ -284,13 +283,16 @@ Source code for spython.utils.terminal
"""
cmd = _process_sudo_cmd(cmd, sudo, sudo_options)
- process = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
+ process = subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True
+ )
for line in iter(process.stdout.readline, ""):
if not re.search(no_newline_regexp, line):
yield line
process.stdout.close()
return_code = process.wait()
if return_code:
+ print(process.stderr.read(), file=sys.stderr)
raise subprocess.CalledProcessError(return_code, cmd)
@@ -380,7 +382,7 @@ Source code for spython.utils.terminal
[docs]def remove_uri(container):
-
"""remove_uri will remove docker:// or shub:// from the uri
+
"""remove_uri will remove docker:// or shub:// or library:// from the uri
"""
return split_uri(container)[1]
diff --git a/docs/api/objects.inv b/docs/api/objects.inv
index 55903a78..965f66ec 100644
Binary files a/docs/api/objects.inv and b/docs/api/objects.inv differ
diff --git a/docs/api/py-modindex.html b/docs/api/py-modindex.html
index 4de8bc32..cb252d0c 100644
--- a/docs/api/py-modindex.html
+++ b/docs/api/py-modindex.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -87,7 +87,6 @@
@@ -350,21 +349,6 @@
Python Module Index
spython.tests |
|
-
- |
-
- spython.tests.test_client |
- |
-
- |
-
- spython.tests.test_instances |
- |
-
- |
-
- spython.tests.test_utils |
- |
|
diff --git a/docs/api/search.html b/docs/api/search.html
index 3b0aa2b7..ec704b6a 100644
--- a/docs/api/search.html
+++ b/docs/api/search.html
@@ -21,11 +21,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -85,7 +85,6 @@
diff --git a/docs/api/searchindex.js b/docs/api/searchindex.js
index 3fa7e237..eddb2243 100644
--- a/docs/api/searchindex.js
+++ b/docs/api/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["changelog","index","source/modules","source/spython","source/spython.client","source/spython.image","source/spython.image.cmd","source/spython.instance","source/spython.instance.cmd","source/spython.logger","source/spython.main","source/spython.main.base","source/spython.main.parse","source/spython.tests","source/spython.utils"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["changelog.md","index.rst","source/modules.rst","source/spython.rst","source/spython.client.rst","source/spython.image.rst","source/spython.image.cmd.rst","source/spython.instance.rst","source/spython.instance.cmd.rst","source/spython.logger.rst","source/spython.main.rst","source/spython.main.base.rst","source/spython.main.parse.rst","source/spython.tests.rst","source/spython.utils.rst"],objects:{"":{spython:[3,0,0,"-"]},"spython.client":{get_parser:[4,1,1,""],main:[4,1,1,""],recipe:[4,0,0,"-"],set_verbosity:[4,1,1,""],shell:[4,0,0,"-"],test:[4,0,0,"-"],version:[4,1,1,""]},"spython.client.recipe":{main:[4,1,1,""]},"spython.client.shell":{ipython:[4,1,1,""],main:[4,1,1,""],prepare_client:[4,1,1,""],python:[4,1,1,""],run_bpython:[4,1,1,""]},"spython.client.test":{main:[4,1,1,""]},"spython.image":{Image:[5,2,1,""],ImageBase:[5,2,1,""],cmd:[6,0,0,"-"]},"spython.image.Image":{get_hash:[5,3,1,""]},"spython.image.ImageBase":{parse_image_name:[5,3,1,""]},"spython.image.cmd":{"export":[6,0,0,"-"],create:[6,0,0,"-"],generate_image_commands:[6,1,1,""],importcmd:[6,0,0,"-"],utils:[6,0,0,"-"]},"spython.image.cmd.create":{create:[6,1,1,""]},"spython.image.cmd.export":{"export":[6,1,1,""]},"spython.image.cmd.importcmd":{importcmd:[6,1,1,""]},"spython.image.cmd.utils":{compress:[6,1,1,""],decompress:[6,1,1,""]},"spython.instance":{Instance:[7,2,1,""],cmd:[8,0,0,"-"]},"spython.instance.Instance":{RobotNamer:[7,4,1,""],debug:[7,4,1,""],error_logs:[7,3,1,""],generate_name:[7,3,1,""],get_uri:[7,3,1,""],instance:[7,4,1,""],output_logs:[7,3,1,""],parse_image_name:[7,3,1,""],quiet:[7,4,1,""],run_command:[7,3,1,""],start:[7,3,1,""],stop:[7,3,1,""],version:[7,3,1,""]},"spython.instance.cmd":{generate_instance_commands:[8,1,1,""],iutils:[8,0,0,"-"],start:[8,0,0,"-"],stop:[8,0,0,"-"]},"spython.instance.cmd.iutils":{get:[8,1,1,""],parse_table:[8,1,1,""]},"spython.instance.cmd.start":{start:[8,1,1,""]},"spython.instance.cmd.stop":{stop:[8,1,1,""]},"spython.logger":{message:[9,0,0,"-"],progress:[9,0,0,"-"],spinner:[9,0,0,"-"]},"spython.logger.message":{SingularityMessage:[9,2,1,""],convert2boolean:[9,1,1,""],get_logging_level:[9,1,1,""],get_user_color_preference:[9,1,1,""]},"spython.logger.message.SingularityMessage":{abort:[9,3,1,""],addColor:[9,3,1,""],critical:[9,3,1,""],custom:[9,3,1,""],debug:[9,3,1,""],emit:[9,3,1,""],emitError:[9,3,1,""],emitOutput:[9,3,1,""],error:[9,3,1,""],exit:[9,3,1,""],get_logs:[9,3,1,""],info:[9,3,1,""],isEnabledFor:[9,3,1,""],is_quiet:[9,3,1,""],log:[9,3,1,""],newline:[9,3,1,""],println:[9,3,1,""],show_progress:[9,3,1,""],spinner:[9,4,1,""],table:[9,3,1,""],useColor:[9,3,1,""],verbose1:[9,3,1,""],verbose2:[9,3,1,""],verbose3:[9,3,1,""],verbose:[9,3,1,""],warning:[9,3,1,""],write:[9,3,1,""]},"spython.logger.progress":{ProgressBar:[9,2,1,""],bar:[9,1,1,""]},"spython.logger.progress.ProgressBar":{done:[9,3,1,""],format_time:[9,3,1,""],show:[9,3,1,""]},"spython.logger.spinner":{Spinner:[9,2,1,""]},"spython.logger.spinner.Spinner":{balloons_cursor:[9,3,1,""],changing_arrows:[9,3,1,""],delay:[9,4,1,""],run:[9,3,1,""],select_generator:[9,3,1,""],spinning:[9,4,1,""],spinning_cursor:[9,3,1,""],start:[9,3,1,""],stop:[9,3,1,""]},"spython.main":{apps:[10,0,0,"-"],base:[11,0,0,"-"],build:[10,0,0,"-"],execute:[10,0,0,"-"],get_client:[10,1,1,""],help:[10,0,0,"-"],inspect:[10,0,0,"-"],instances:[10,0,0,"-"],parse:[12,0,0,"-"],pull:[10,0,0,"-"],run:[10,0,0,"-"]},"spython.main.apps":{apps:[10,1,1,""]},"spython.main.base":{Client:[11,2,1,""],command:[11,0,0,"-"],flags:[11,0,0,"-"],generate:[11,0,0,"-"],logger:[11,0,0,"-"],sutils:[11,0,0,"-"]},"spython.main.base.Client":{"export":[11,3,1,""],RobotNamer:[11,4,1,""],apps:[11,3,1,""],build:[11,3,1,""],debug:[11,4,1,""],execute:[11,3,1,""],help:[11,3,1,""],image:[11,4,1,""],inspect:[11,3,1,""],instance:[11,4,1,""],instance_stopall:[11,3,1,""],instances:[11,3,1,""],load:[11,3,1,""],oci:[11,4,1,""],pull:[11,3,1,""],quiet:[11,4,1,""],run:[11,3,1,""],setenv:[11,3,1,""],shell:[11,3,1,""],version:[11,3,1,""],version_info:[11,3,1,""]},"spython.main.base.command":{generate_bind_list:[11,1,1,""],init_command:[11,1,1,""],run_command:[11,1,1,""],send_command:[11,1,1,""]},"spython.main.base.flags":{parse_verbosity:[11,1,1,""]},"spython.main.base.generate":{RobotNamer:[11,2,1,""],main:[11,1,1,""]},"spython.main.base.generate.RobotNamer":{generate:[11,3,1,""]},"spython.main.base.logger":{init_level:[11,1,1,""],println:[11,1,1,""]},"spython.main.base.sutils":{get_filename:[11,1,1,""],get_uri:[11,1,1,""],load:[11,1,1,""],setenv:[11,1,1,""]},"spython.main.build":{build:[10,1,1,""]},"spython.main.execute":{execute:[10,1,1,""],shell:[10,1,1,""]},"spython.main.help":{helpcmd:[10,1,1,""]},"spython.main.inspect":{inspect:[10,1,1,""],parse_labels:[10,1,1,""]},"spython.main.instances":{list_instances:[10,1,1,""],stopall:[10,1,1,""]},"spython.main.parse":{recipe:[12,0,0,"-"]},"spython.main.parse.recipe":{Recipe:[12,2,1,""]},"spython.main.parse.recipe.Recipe":{json:[12,3,1,""]},"spython.main.pull":{pull:[10,1,1,""]},"spython.main.run":{run:[10,1,1,""]},"spython.tests":{test_client:[13,0,0,"-"],test_instances:[13,0,0,"-"],test_utils:[13,0,0,"-"]},"spython.tests.test_client":{test_build_from_docker:[13,1,1,""],test_docker_pull:[13,1,1,""],test_execute:[13,1,1,""],test_execute_with_return_code:[13,1,1,""],test_export:[13,1,1,""],test_inspect:[13,1,1,""]},"spython.tests.test_instances":{TestInstanceFuncs:[13,2,1,""],test_has_no_instances:[13,1,1,""],test_instance_class:[13,1,1,""]},"spython.tests.test_instances.TestInstanceFuncs":{cleanup:[13,3,1,""],test_instance_cmds:[13,3,1,""]},"spython.tests.test_utils":{test_ScopedEnvVar:[13,1,1,""],test_check_get_singularity_version:[13,1,1,""],test_check_get_singularity_version_info:[13,1,1,""],test_check_install:[13,1,1,""],test_decode:[13,1,1,""],test_get_installdir:[13,1,1,""],test_remove_uri:[13,1,1,""],test_split_uri:[13,1,1,""],test_write_bad_json:[13,1,1,""],test_write_json:[13,1,1,""],test_write_read_files:[13,1,1,""]},"spython.utils":{fileio:[14,0,0,"-"],terminal:[14,0,0,"-"]},"spython.utils.fileio":{mkdir_p:[14,1,1,""],read_file:[14,1,1,""],read_json:[14,1,1,""],write_file:[14,1,1,""],write_json:[14,1,1,""]},"spython.utils.terminal":{check_install:[14,1,1,""],format_container_name:[14,1,1,""],get_installdir:[14,1,1,""],get_singularity_version:[14,1,1,""],get_singularity_version_info:[14,1,1,""],get_userhome:[14,1,1,""],get_username:[14,1,1,""],remove_uri:[14,1,1,""],run_command:[14,1,1,""],split_uri:[14,1,1,""],stream_command:[14,1,1,""],which:[14,1,1,""]},spython:{client:[4,0,0,"-"],image:[5,0,0,"-"],instance:[7,0,0,"-"],logger:[9,0,0,"-"],main:[10,0,0,"-"],tests:[13,0,0,"-"],utils:[14,0,0,"-"],version:[3,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"],"4":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method","4":"py:attribute"},terms:{"1024mib":6,"95m":9,"boolean":[0,7,9,10,11],"byte":11,"case":[7,10,13],"char":11,"class":[5,7,9,11,12,13],"default":[0,6,7,8,9,10,11,14],"export":[0,3,5,11],"function":[0,4,6,9,10,11,13,14],"import":[0,6,10],"int":9,"new":[6,11,14],"public":[3,12,14],"return":[0,5,7,8,9,10,11,12,13,14],"static":9,"true":[6,7,8,9,10,11,14],Added:0,Adding:0,For:[7,10,11,14],The:[0,1,6,8,10,11,12,14],These:6,Will:9,With:[7,8],__init__:6,abil:0,abl:7,abort:9,about:[10,11],accept:0,access:[10,11],account:0,action:[0,11],actual:[5,11],add:[0,7,14],addcolor:9,added:[0,6,7,9,10,11],adding:0,addit:[0,6,11],address:0,adjust:0,advis:[10,11],after:[7,8,11],alia:[7,11],all:[0,9,10,11,14],allow:[10,11],along:7,also:[11,12],ani:[10,11],api:0,app:[2,3,11],appear:11,append:14,applic:[11,14],arbitari:[10,11],aren:0,arg:[0,4,7,8,9,10,11],argpars:11,argument:[0,7,8,10,11],around:4,ascii:9,associ:[10,11],assum:[8,9,13],attempt:[11,14],attribut:[0,12],automat:[10,11],avail:[11,14],back:[0,11,14],backward:0,balloons_cursor:9,bar:[7,9,14],base:[0,3,4,5,7,9,10,12,13,14],basic:0,been:0,behaviour:0,being:9,bind:[0,7,8,10,11],bindlist:11,bootstrap:11,both:[4,11],bourn:11,bpython:4,branch:0,bug:0,build:[0,2,3,11,12],build_fold:[10,11],builder:[10,11],built:[10,11],bundl:11,call:[0,7,8,9,10,11],can:[0,3,4,7,11,12,14],capabl:11,captur:[7,8,10,11,14],carriage_return:9,chang:0,changelog:1,changing_arrow:9,charact:[9,14],check:[0,9,11,13,14],check_instal:14,classmethod:7,cleanup:13,cli:0,client:[0,1,2,3,6,7,8,10,11,14],close:[0,14],cmd:[0,3,5,7,11,12,14],code:[0,3,10,11,12,14],coincid:0,col_width:9,color:9,column:[8,9],com:[7,10,11],command:[0,3,6,7,8,10,12,13,14],comment:12,commit:0,commonli:6,complet:[5,7,9,10,11],compos:0,compress:6,condit:0,configur:9,consol:[0,4,7,14],contain:[0,1,7,8,10,11,14],content:[1,2],context:[10,11],continu:0,convers:0,convert2boolean:9,convert:[0,3,4,10,11],copi:[0,3,12,14],copyright:[3,12,14],correct:[0,13],couldn:[10,11],count:9,crash:0,creat:[3,5,7,8,9,10,11,14],criteria:5,critic:[0,9],crypto:11,current:9,custom:[6,9,10,11],data:[10,11,14],debug:[0,6,7,8,9,10,11],decompress:6,defil:[10,11],defin:[0,4,6,10,11,14],delai:9,delim:11,delimit:11,deprec:[0,6,11],deriv:[7,11],descriptor:11,dest:0,destin:0,determin:[4,7,9,14],dict:14,dictionari:[9,10,11,12],differ:[0,10,11],dimens:8,directli:[10,11],directori:[0,10,11,13,14],disabl:[10,11],displai:11,distribut:[3,12,14],docker:[0,3,5,7,10,11,14],docker_contain:13,dockerfil:0,dockerpars:[4,12],dockerrecip:0,dockerwrit:4,document:0,doe:[0,11],doesn:[7,10,11],don:[7,8,10,11,14],done:[7,8,9,10,11],driver:[10,11],each:[0,7,8,14],effect:14,either:[4,11,12],emb:4,emit:9,emiterror:9,emitoutput:9,empti:[0,11,14],empty_char:9,enabl:9,encod:9,end:14,enhanc:0,entir:[10,11],entri:9,entrypoint:[0,12],env:[0,10,11],environ:[0,3,4,6,8,9,10,11],environment:9,error:[0,9,10,11],error_log:7,etc:8,eventu:0,everi:9,exampl:[11,14],except:14,exec:[0,11],execut:[0,2,3,11],exist:[5,7,11],exit:[9,11],expand:0,expect:[8,10,11],expected_s:9,expos:[6,10,11],express:[7,14],ext3:[6,10,11],ext4:6,ext:[6,10,11],extens:[10,11],fail:0,fals:[0,6,7,8,9,10,11,14],file:[0,3,4,5,6,10,11,12,14],fileio:[2,3],filenam:[11,14],filesystem:[6,10,11],filled_char:9,find:[7,14],first:[5,9,11],fix:[0,10],flag:[0,3,10],flexibl:0,folder:[10,11],follow:11,forc:[0,10,11],forcebl:[7,8],form:[3,12,14],format:[0,14],format_container_nam:14,format_tim:9,found:[10,11,13,14],free:12,from:[0,5,6,7,8,10,11,14],fromhead:0,full:[0,6,10,11,14],full_path:[10,11],fun:[10,11],ged:[10,11],gener:[0,3,7,9,10],generate_bind_list:11,generate_image_command:[6,11],generate_instance_command:8,generate_nam:7,get:[0,5,7,8,10,11,13,14],get_client:10,get_filenam:11,get_hash:5,get_installdir:14,get_log:9,get_logging_level:9,get_pars:4,get_singularity_vers:[7,11,14],get_singularity_version_info:[11,14],get_uri:[7,11],get_user_color_prefer:9,get_userhom:14,get_usernam:14,github:[0,7,10,11],give:[4,5,7,8,10,11],given:[0,6,11],global:11,group:[0,6,8,10,11],guidanc:0,haikun:11,handl:[0,5,7],hang:[0,7,8],hardcod:0,has:[0,9,11],hash:[0,5],have:[0,7,11,14],header:[0,8],help:[2,3,4,11],helpcmd:10,helper:6,here:0,hide:9,highli:[10,11],histori:9,hold:[6,8],home:14,honor:0,host:[10,11],how:0,howev:[10,11],http:[3,7,10,11,12,14],hub:[10,11],ideal:8,ignor:0,imag:[0,1,2,3,4,7,8,10,11,14],image_path:[6,10,11],imagebas:[5,7],imagecli:11,implement:[0,11],import_typ:6,importcmd:[3,5],imprt:6,includ:[0,9,10,11,12],incompat:0,increas:11,index:1,indic:[7,8],info:[0,9],inform:[9,10,11],init:10,init_command:11,init_level:11,initi:[10,11],input:6,input_sourc:6,inspect:[0,2,3,11],inspir:11,instal:[10,11,12,13,14],instanc:[0,1,2,3,11],instance_stopal:11,instead:[10,11],integ:8,integr:[10,11],intend:[5,12],interact:[11,12],interest:[7,14],interpret:9,ipython:4,is_quiet:9,isenabledfor:9,isol:[10,11],issu:[0,7,10,11],issuecom:7,item:0,iter:[9,10,11],iutil:[3,7],join:9,join_newlin:9,json:[0,8,10,11,12,14],json_obj:14,jsonifi:8,just:[7,10,11],kei:9,kill:[0,7,8],know:0,kwarg:7,label:[9,10,11,12],last:0,later:7,launch:11,length:[9,11],level:[0,4,5,6,8,9,11],libexecdir:[10,11],licens:[1,3,12,14],like:[0,7,8],line:[0,7,11,14],lint:11,linux:[10,11],list:[0,7,8,9,10,11,14],list_inst:10,load:[0,5,7,10,11],local:11,locat:[10,11,12],log:[0,7,9,11],logger:[0,1,2,3,10],look:[8,10,11],main:[0,1,2,3,4,6,7,8,9],mainli:6,make:[10,11],manag:11,manual:0,map:[10,11],master:1,match:8,md5:5,mean:[7,10,11,14],merg:0,messag:[0,2,3,4,10,11],messagelevel:[6,8,9],metadata:11,mib:6,migrat:0,min_level:9,miss:0,mkdir:14,mkdir_p:14,mode:[10,14],modul:[1,2],more:[0,10,11],most:10,mount:[10,11],move:0,mozilla:[3,12,14],mpl:[1,3,12,14],much:11,multipl:0,must:[6,8,9,11],name:[0,7,8,9,10,11,14],namespac:[5,7],need:[7,8,10,11,14],newlin:[7,9,14],nicer:14,no_newline_regexp:[7,14],non:[0,7,8,11],none:[5,6,7,8,9,10,11,12,14],normal:11,now:0,number:[8,9],nvidia:[0,10,11],object:[5,7,9,10,11,12,13,14],obtain:[3,12,14],oci:[0,11],one:[0,3,7,10,11,12,14],onli:[0,5,9,10,11],open:14,option:[0,4,7,8,9,10,11,14],orb:0,org:[3,12,14],origin:[0,10,12],other:[7,10,11,14],otherwis:[0,11],out:9,outfil:4,output:[0,4,7,8,10,11,14],output_fil:11,output_log:7,over:11,overrid:[0,10,11],overriden:11,packag:[0,1,2],param:[9,14],paramet:[0,5,6,7,8,10,11,12,14],parent:[7,11,14],pars:[0,3,5,7,8,10,11,14],parse_image_nam:[5,7],parse_label:10,parse_t:8,parse_verbos:11,parser:[0,4,12],part:14,particular:13,pass:[6,7,8,10,11,14],path:[0,5,6,7,8,10,11,14],paus:0,perform:[10,11],persist:11,pid:[8,10,11],pipe:[7,11,14],point:0,poorli:11,popualt:12,port:12,prefer:[10,11],prefix:9,prepar:4,prepare_cli:4,preserv:[10,11],pretti:14,pretty_print:14,print:[0,4,7,9,10,11,12,14],print_log:7,print_pretti:14,println:[0,9,11],prioriti:5,privat:0,process:11,progess:[7,14],programat:7,progress:[2,3,7,14],progressbar:9,prompt:9,properli:[6,14],protocol:14,provid:[6,7,8,10,11,13],pull:[0,2,3,11],pull_fold:[10,11],pwd:[10,11],pypi:0,python:[0,4,11],quiet:[0,6,7,8,9,10,11,14],raw:[10,11],read:[10,11,14],read_fil:[13,14],read_json:14,readlin:14,reason:[5,10,11],recip:[0,2,3,10,11],recommend:[10,11],refactor:0,registri:[5,7],regular:[7,14],rel:[0,10,11],releas:0,relev:0,remov:[0,8,14],remove_row:8,remove_uri:14,renam:0,replac:[0,11],report:14,repositori:0,repres:0,request:0,requir:[0,10,11],respect:[0,12],result:[0,10,11,14],resum:0,return_cod:9,return_json:[8,10,11],return_result:[10,11],revers:0,ride:11,right:0,robot:[7,10,11],robot_nam:[10,11],robotnam:[7,11],root:[10,11],row:[8,9],run:[0,2,3,7,8,9,11,14],run_bpython:4,run_command:[7,11,14],runscript:[0,10,11,12],runtim:[10,11],same:14,sandbox:[10,11],save:[4,5],sci:[10,11],scientif:[10,11],scif:[10,11],screen:[7,10,11],second:[5,7,8,9],section:0,see:[7,10,11],select:9,select_gener:9,self:[6,8,10,11],selftest:11,semant:14,send:[7,10,11,14],send_command:11,sens:[10,11],sequenc:12,serv:[4,10,11],set:[4,7,9,10,11,14],set_verbos:4,setenv:11,setup:0,share:[10,11],shell:[0,2,3,10,11],shortcut:[7,11],should:[0,7,9,10,11,13,14],show:[9,10,11],show_progress:9,shub:14,sif:[10,11],siflist:11,sign:11,signatur:11,silent:11,simag:11,simpli:[5,7],singl:[8,10,11],singular:[0,3,5,6,7,8,10,11,13,14],singularity_cachedir:[10,11],singularity_tmpdir:[10,11],singularitymessag:9,singularitypars:[4,12],singularityrecip:0,singularitywar:[10,11],size:6,sizein:6,skip:[7,14],slash:14,sochat:[3,12,14],softwar:[10,11,13,14],some:[0,11],sourc:[0,3,4,5,6,7,8,9,10,11,12,13,14],special:14,special_charact:14,specif:[10,11],specifi:[6,7,8,9,10,11],sphinx:0,spin:9,spinner:[2,3],spinning_cursor:9,split:[0,5,7,14],split_uri:14,spython:[0,1],src:0,standard:[9,10,11],start:[0,3,7,9,14],state:0,statement:0,stderr:[9,11],stdin:6,stdout:[7,9,11,14],stop:[0,3,7,9,10,11],stopal:10,stream:[0,9,10,11,14],stream_command:14,string:[7,8,10,11,14],strip:0,structur:14,sub:[10,11],subclass:12,subcommand:6,subject:[3,12,14],submodul:[1,2,5,7],subpackag:[1,2],subprocess:[7,14],success:[0,11],sudo:[0,6,7,8,10,11,14],sudo_opt:[7,10,11,14],suffix:9,summari:11,suppli:[7,14],support:[0,6,7,8,9,10,11],suppress:[10,11],sutil:[3,10],sylab:7,symbol:9,system:[6,10,11],tabl:[8,9],table_str:8,take:[7,10,11,14],taken:0,tar:[6,11],tempfil:0,temporari:[6,11],term:[3,12,14],termin:[0,2,3,7,9,11],test:[0,2,3,10,11,12],test_build_from_dock:13,test_check_get_singularity_vers:13,test_check_get_singularity_version_info:13,test_check_instal:13,test_decod:13,test_docker_pul:13,test_execut:13,test_execute_with_return_cod:13,test_export:13,test_get_installdir:13,test_has_no_inst:13,test_inspect:13,test_instance_class:13,test_instance_cmd:13,test_remove_uri:13,test_scopedenvvar:13,test_split_uri:13,test_write_bad_json:13,test_write_json:13,test_write_read_fil:13,testinstancefunc:13,testscript:11,text:[9,10,11],thei:7,them:[0,10,11],thi:[0,3,4,5,7,8,10,11,12,14],those:14,timeout:[0,7,8],tmp:[7,8],tmp_path:13,tmptar:6,tokenchar:11,tokenlength:11,tool:[10,11],top:8,total:9,track:0,trail:14,tupl:[7,8],turn:10,typo:0,ubuntu:[5,7,11],uid:[10,11,14],under:[1,6,9],unset:0,updat:10,uri:[0,5,7,8,10,11,14],url:0,usag:[7,8,11,14],use:[0,6,7,10,11,12,14],usecolor:9,used:[6,9,10,11,13],useful:[5,10,11],user:[4,7,8,9,10,11,12,14],uses:[7,11,14],using:[10,11],usual:9,utf:11,util:[1,2,3,5],valu:[0,10,11],vanessa:[3,12,14],variabl:[0,6,8,9,11],vault:0,verbos:[6,8,9,10,11],verbose1:9,verbose2:9,verbose3:9,verifi:11,version:[0,1,2,4,5,7,11,12,13,14],version_info:[11,13],via:[6,8],volum:[11,12],want:[7,8],warn:[0,9],whatev:6,when:[0,7,8],where:[8,10,11,13,14],which:[9,10,11,14],width:9,within:[10,11],withour:[10,11],without:14,won:[7,14],work:[0,1],workdir:12,wrap:9,wrapper:[4,11],writabl:[0,10,11],write:[9,10,11,12,14],write_fil:[13,14],write_json:14,writer:[0,4,12],x1b:9,yes:11,yet:11,yield:14,you:[3,10,11,12,14],your:[9,10,11]},titles:["CHANGELOG","Welcome to Singularity Python API\u2019s documentation!","spython","spython package","spython.client package","spython.image package","spython.image.cmd package","spython.instance package","spython.instance.cmd package","spython.logger package","spython.main package","spython.main.base package","spython.main.parse package","spython.tests package","spython.utils package"],titleterms:{"export":6,api:1,app:10,base:11,build:10,changelog:0,client:4,cmd:[6,8],command:11,content:[3,4,5,6,7,8,9,10,11,12,13,14],convert:12,creat:6,docker:12,document:1,environ:12,execut:10,fileio:14,flag:11,gener:11,help:10,imag:[5,6],importcmd:6,indic:1,inspect:10,instanc:[7,8,10],iutil:8,logger:[9,11],main:[10,11,12],master:0,messag:9,modul:[3,4,5,6,7,8,9,10,11,12,13,14],packag:[3,4,5,6,7,8,9,10,11,12,13,14],pars:12,progress:9,pull:10,python:1,recip:[4,12],run:10,shell:4,singular:[1,12],spinner:9,spython:[2,3,4,5,6,7,8,9,10,11,12,13,14],start:8,stop:8,submodul:[3,4,6,8,9,10,11,12,13,14],subpackag:[3,5,7,10],sutil:11,tabl:1,termin:14,test:[4,13],test_client:13,test_inst:13,test_util:13,util:[6,14],version:3,welcom:1}})
\ No newline at end of file
+Search.setIndex({docnames:["changelog","index","source/modules","source/spython","source/spython.client","source/spython.image","source/spython.image.cmd","source/spython.instance","source/spython.instance.cmd","source/spython.logger","source/spython.main","source/spython.main.base","source/spython.main.parse","source/spython.tests","source/spython.utils"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":2,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.todo":2,"sphinx.ext.viewcode":1,sphinx:56},filenames:["changelog.md","index.rst","source/modules.rst","source/spython.rst","source/spython.client.rst","source/spython.image.rst","source/spython.image.cmd.rst","source/spython.instance.rst","source/spython.instance.cmd.rst","source/spython.logger.rst","source/spython.main.rst","source/spython.main.base.rst","source/spython.main.parse.rst","source/spython.tests.rst","source/spython.utils.rst"],objects:{"":{spython:[3,0,0,"-"]},"spython.client":{get_parser:[4,1,1,""],main:[4,1,1,""],recipe:[4,0,0,"-"],set_verbosity:[4,1,1,""],shell:[4,0,0,"-"],test:[4,0,0,"-"],version:[4,1,1,""]},"spython.client.recipe":{main:[4,1,1,""]},"spython.client.shell":{ipython:[4,1,1,""],main:[4,1,1,""],prepare_client:[4,1,1,""],python:[4,1,1,""],run_bpython:[4,1,1,""]},"spython.client.test":{main:[4,1,1,""]},"spython.image":{Image:[5,2,1,""],ImageBase:[5,2,1,""],cmd:[6,0,0,"-"]},"spython.image.Image":{get_hash:[5,3,1,""]},"spython.image.ImageBase":{parse_image_name:[5,3,1,""]},"spython.image.cmd":{"export":[6,0,0,"-"],create:[6,0,0,"-"],generate_image_commands:[6,1,1,""],importcmd:[6,0,0,"-"],utils:[6,0,0,"-"]},"spython.image.cmd.create":{create:[6,1,1,""]},"spython.image.cmd.export":{"export":[6,1,1,""]},"spython.image.cmd.importcmd":{importcmd:[6,1,1,""]},"spython.image.cmd.utils":{compress:[6,1,1,""],decompress:[6,1,1,""]},"spython.instance":{Instance:[7,2,1,""],cmd:[8,0,0,"-"]},"spython.instance.Instance":{RobotNamer:[7,4,1,""],debug:[7,4,1,""],error_logs:[7,3,1,""],generate_name:[7,3,1,""],get_uri:[7,3,1,""],instance:[7,4,1,""],output_logs:[7,3,1,""],parse_image_name:[7,3,1,""],quiet:[7,4,1,""],run_command:[7,3,1,""],start:[7,3,1,""],stop:[7,3,1,""],version:[7,3,1,""]},"spython.instance.cmd":{generate_instance_commands:[8,1,1,""],iutils:[8,0,0,"-"],start:[8,0,0,"-"],stop:[8,0,0,"-"]},"spython.instance.cmd.iutils":{get:[8,1,1,""],parse_table:[8,1,1,""]},"spython.instance.cmd.start":{start:[8,1,1,""]},"spython.instance.cmd.stop":{stop:[8,1,1,""]},"spython.logger":{message:[9,0,0,"-"],progress:[9,0,0,"-"],spinner:[9,0,0,"-"]},"spython.logger.message":{SingularityMessage:[9,2,1,""],convert2boolean:[9,1,1,""],get_logging_level:[9,1,1,""],get_user_color_preference:[9,1,1,""]},"spython.logger.message.SingularityMessage":{abort:[9,3,1,""],addColor:[9,3,1,""],critical:[9,3,1,""],custom:[9,3,1,""],debug:[9,3,1,""],emit:[9,3,1,""],emitError:[9,3,1,""],emitOutput:[9,3,1,""],error:[9,3,1,""],exit:[9,3,1,""],get_logs:[9,3,1,""],info:[9,3,1,""],isEnabledFor:[9,3,1,""],is_quiet:[9,3,1,""],log:[9,3,1,""],newline:[9,3,1,""],println:[9,3,1,""],show_progress:[9,3,1,""],spinner:[9,4,1,""],table:[9,3,1,""],useColor:[9,3,1,""],verbose1:[9,3,1,""],verbose2:[9,3,1,""],verbose3:[9,3,1,""],verbose:[9,3,1,""],warning:[9,3,1,""],write:[9,3,1,""]},"spython.logger.progress":{ProgressBar:[9,2,1,""],bar:[9,1,1,""]},"spython.logger.progress.ProgressBar":{done:[9,3,1,""],format_time:[9,3,1,""],show:[9,3,1,""]},"spython.logger.spinner":{Spinner:[9,2,1,""]},"spython.logger.spinner.Spinner":{balloons_cursor:[9,3,1,""],changing_arrows:[9,3,1,""],delay:[9,4,1,""],run:[9,3,1,""],select_generator:[9,3,1,""],spinning:[9,4,1,""],spinning_cursor:[9,3,1,""],start:[9,3,1,""],stop:[9,3,1,""]},"spython.main":{apps:[10,0,0,"-"],base:[11,0,0,"-"],build:[10,0,0,"-"],execute:[10,0,0,"-"],get_client:[10,1,1,""],help:[10,0,0,"-"],inspect:[10,0,0,"-"],instances:[10,0,0,"-"],parse:[12,0,0,"-"],pull:[10,0,0,"-"],run:[10,0,0,"-"]},"spython.main.apps":{apps:[10,1,1,""]},"spython.main.base":{Client:[11,2,1,""],command:[11,0,0,"-"],flags:[11,0,0,"-"],generate:[11,0,0,"-"],logger:[11,0,0,"-"],sutils:[11,0,0,"-"]},"spython.main.base.Client":{"export":[11,3,1,""],RobotNamer:[11,4,1,""],apps:[11,3,1,""],build:[11,3,1,""],debug:[11,4,1,""],execute:[11,3,1,""],help:[11,3,1,""],image:[11,4,1,""],inspect:[11,3,1,""],instance:[11,4,1,""],instance_stopall:[11,3,1,""],instances:[11,3,1,""],load:[11,3,1,""],oci:[11,4,1,""],pull:[11,3,1,""],quiet:[11,4,1,""],run:[11,3,1,""],setenv:[11,3,1,""],shell:[11,3,1,""],version:[11,3,1,""],version_info:[11,3,1,""]},"spython.main.base.command":{generate_bind_list:[11,1,1,""],init_command:[11,1,1,""],run_command:[11,1,1,""],send_command:[11,1,1,""]},"spython.main.base.flags":{parse_verbosity:[11,1,1,""]},"spython.main.base.generate":{RobotNamer:[11,2,1,""],main:[11,1,1,""]},"spython.main.base.generate.RobotNamer":{generate:[11,3,1,""]},"spython.main.base.logger":{init_level:[11,1,1,""],println:[11,1,1,""]},"spython.main.base.sutils":{get_filename:[11,1,1,""],get_uri:[11,1,1,""],load:[11,1,1,""],setenv:[11,1,1,""]},"spython.main.build":{build:[10,1,1,""]},"spython.main.execute":{execute:[10,1,1,""],shell:[10,1,1,""]},"spython.main.help":{helpcmd:[10,1,1,""]},"spython.main.inspect":{inspect:[10,1,1,""],parse_labels:[10,1,1,""]},"spython.main.instances":{list_instances:[10,1,1,""],stopall:[10,1,1,""]},"spython.main.parse":{recipe:[12,0,0,"-"]},"spython.main.parse.recipe":{Recipe:[12,2,1,""]},"spython.main.parse.recipe.Recipe":{json:[12,3,1,""]},"spython.main.pull":{pull:[10,1,1,""]},"spython.main.run":{run:[10,1,1,""]},"spython.utils":{fileio:[14,0,0,"-"],terminal:[14,0,0,"-"]},"spython.utils.fileio":{mkdir_p:[14,1,1,""],read_file:[14,1,1,""],read_json:[14,1,1,""],write_file:[14,1,1,""],write_json:[14,1,1,""]},"spython.utils.terminal":{check_install:[14,1,1,""],format_container_name:[14,1,1,""],get_installdir:[14,1,1,""],get_singularity_version:[14,1,1,""],get_singularity_version_info:[14,1,1,""],get_userhome:[14,1,1,""],get_username:[14,1,1,""],remove_uri:[14,1,1,""],run_command:[14,1,1,""],split_uri:[14,1,1,""],stream_command:[14,1,1,""],which:[14,1,1,""]},spython:{client:[4,0,0,"-"],image:[5,0,0,"-"],instance:[7,0,0,"-"],logger:[9,0,0,"-"],main:[10,0,0,"-"],tests:[13,0,0,"-"],utils:[14,0,0,"-"],version:[3,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","method","Python method"],"4":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method","4":"py:attribute"},terms:{"1024mib":6,"95m":9,"boolean":[0,7,9,10,11],"byte":11,"case":[7,10],"char":11,"class":[5,7,9,11,12],"default":[0,6,7,8,9,10,11,14],"export":[0,3,5,11],"function":[0,4,6,9,10,11,14],"import":[0,6,10],"int":9,"new":[6,11,14],"public":[3,12,14],"return":[0,5,7,8,9,10,11,12,14],"static":9,"true":[6,7,8,9,10,11,14],Added:0,Adding:0,For:[7,10,11,14],The:[0,1,6,8,10,11,12,14],These:6,Will:9,With:[7,8],__init__:6,_setup:0,abil:0,abl:7,abort:9,about:[10,11],accept:0,access:[10,11],account:0,action:[0,11],actual:[5,11],add:[0,7,14],addcolor:9,added:[0,6,7,9,10,11],adding:0,addit:[0,6,11],address:0,adjust:0,advis:[10,11],after:[7,8,11],alia:[7,11],all:[0,9,10,11,14],allow:[10,11],along:7,also:[11,12],ani:[10,11],api:0,app:[2,3,11],appear:11,append:14,applic:[11,14],arbitari:[10,11],aren:0,arg:[0,4,7,8,9,10,11],argpars:11,argument:[0,7,8,10,11],around:4,ascii:9,associ:[10,11],assum:[8,9],attempt:[11,14],attribut:[0,12],automat:[10,11],avail:[11,14],back:[0,11,14],backward:0,balloons_cursor:9,bar:[7,9,14],base:[0,3,4,5,7,9,10,12,14],basic:0,been:0,behaviour:0,being:9,bind:[0,7,8,10,11],bindlist:11,bootstrap:11,both:[4,11],bourn:11,bpython:4,branch:0,bug:0,build:[0,2,3,11,12],build_fold:[10,11],builder:[10,11],built:[10,11],bundl:11,call:[0,7,8,9,10,11],calledprocesserror:0,can:[0,3,4,7,11,12,14],capabl:11,captur:[7,8,10,11,14],carriage_return:9,chang:0,changelog:0,changing_arrow:9,charact:[9,14],check:[0,9,11,14],check_instal:14,cli:0,client:[0,1,2,3,6,7,8,10,11,14],close:[0,14],cmd:[0,3,5,7,11,12,14],code:[0,3,10,11,12,14],coincid:0,col_width:9,color:9,column:[8,9],com:[0,7,10,11],command:[0,3,6,7,8,10,12,14],comment:12,commit:0,commonli:6,complet:[5,7,9,10,11],compos:0,compress:6,condit:0,configur:9,consol:[0,4,7,14],contain:[0,1,7,8,10,11,14],content:[1,2],context:[10,11],continu:0,convers:0,convert2boolean:9,convert:[0,3,4,10,11],copi:[0,3,12,14],copyright:[3,12,14],correct:0,couldn:[10,11],count:9,crash:0,creat:[3,5,7,8,9,10,11,14],criteria:5,critic:[0,9],crypto:11,current:9,custom:[6,9,10,11],data:[10,11,14],debug:[0,6,7,8,9,10,11],decompress:6,defil:[10,11],defin:[0,4,6,10,11,14],delai:9,delim:11,delimit:11,deprec:[0,6,10,11],deriv:[7,11],descriptor:11,dest:0,destin:0,determin:[4,7,9,14],dict:14,dictionari:[9,10,11,12],differ:[0,10,11],dimens:8,directli:[10,11],directori:[0,10,11,14],disabl:[10,11],displai:11,distribut:[3,12,14],docker:[0,3,5,7,10,11,14],dockerfil:0,dockerpars:[4,12],dockerrecip:0,dockerwrit:4,document:0,doe:[0,11],doesn:[7,10,11],don:[7,8,10,11,14],done:[7,8,9,10,11],driver:[10,11],each:[0,7,8,14],effect:14,either:[4,11,12],emb:4,emit:9,emiterror:9,emitoutput:9,empti:[0,11,14],empty_char:9,enabl:9,encod:9,end:14,enhanc:0,entir:[10,11],entri:9,entrypoint:[0,12],env:[0,10,11],environ:[0,3,4,6,8,9,10,11],environment:9,error:[0,9,10,11],error_log:7,etc:8,eventu:0,everi:9,exampl:[11,14],except:14,exec:[0,11],execut:[0,2,3,11],exist:[5,7,11],exit:[9,11],expand:0,expect:[8,10,11],expected_s:9,expos:[6,10,11],express:[0,7,14],ext3:[6,10,11],ext4:6,ext:[6,10,11],extens:[10,11],fail:0,fals:[0,6,7,8,9,10,11,14],file:[0,3,4,5,6,10,11,12,14],fileio:[2,3],filenam:[11,14],filesystem:[6,10,11],filled_char:9,find:[7,14],first:[5,9,11],fix:[0,10],flag:[0,3,10],flexibl:0,folder:[10,11],follow:11,forc:[0,10,11],forcebl:[7,8],form:[3,12,14],format:[0,14],format_container_nam:14,format_tim:9,found:[10,11,14],free:12,from:[0,5,6,7,8,10,11,14],fromhead:0,full:[0,6,10,11,14],full_path:[10,11],fun:[10,11],ged:[10,11],gener:[0,3,7,9,10],generate_bind_list:11,generate_image_command:[6,11],generate_instance_command:8,generate_nam:7,get:[5,7,8,10,11,14],get_client:10,get_filenam:11,get_hash:5,get_installdir:14,get_log:9,get_logging_level:9,get_pars:4,get_singularity_vers:[0,7,11,14],get_singularity_version_info:[11,14],get_uri:[7,11],get_user_color_prefer:9,get_userhom:14,get_usernam:14,github:[0,7,10,11],give:[4,5,7,8,10,11],given:[0,6,11],global:11,group:[0,6,8,10,11],guidanc:0,haikun:11,handl:[0,5,7],hang:[0,7,8],hardcod:0,has:[0,9,11],hash:[0,5],have:[0,7,11,14],header:[0,8],help:[2,3,4,11],helpcmd:10,helper:6,here:0,hide:9,highli:[10,11],histori:9,hold:[6,8],home:14,honor:0,host:[10,11],how:0,howev:[10,11],http:[0,3,7,10,11,12,14],hub:[10,11],ideal:8,ignor:0,imag:[0,1,2,3,4,7,8,10,11,14],image_path:[6,10,11],imagebas:[5,7],imagecli:11,implement:[0,11],import_typ:6,importcmd:[3,5],imprt:6,includ:[0,9,10,11,12],incompat:0,increas:11,index:1,indic:[7,8],info:9,inform:[9,10,11],init:10,init_command:11,init_level:11,initi:[10,11],input:6,input_sourc:6,inspect:[0,2,3,11],inspir:11,instal:[10,11,12,14],instanc:[0,1,2,3,11],instance_stopal:11,instead:[10,11],integ:8,integr:[10,11],intend:[5,12],interact:[11,12],interest:[7,14],interpret:9,ipython:4,is_quiet:9,isenabledfor:9,isol:[10,11],issu:[0,7,10,11],issuecom:7,item:0,iter:[9,10,11],iutil:[3,7],join:9,join_newlin:9,json:[0,8,10,11,12,14],json_obj:14,jsonifi:8,just:[7,10,11],kei:9,kill:[0,7,8],know:0,kwarg:7,label:[9,10,11,12],last:0,later:7,launch:11,length:[9,11],level:[0,4,5,6,8,9,11],libexecdir:[10,11],librari:[0,14],licens:[1,3,12,14],like:[0,7,8],line:[0,7,11,14],lint:11,linux:[10,11],list:[0,6,7,8,9,10,11,14],list_inst:10,load:[0,5,7,10,11],local:11,locat:[10,11,12],log:[0,7,9,11],logger:[0,1,2,3,10],look:[8,10,11],main:[0,1,2,3,4,6,7,8,9],mainli:6,make:[10,11],manag:11,manual:0,map:[10,11],master:0,match:8,md5:5,mean:[7,10,11,14],merg:0,messag:[0,2,3,4,10,11],messagelevel:[6,8,9],metadata:11,mib:6,migrat:0,min_level:9,miss:0,mkdir:14,mkdir_p:14,mode:[10,14],modul:[1,2],more:[0,10,11],most:10,mount:[10,11],move:0,mozilla:[3,12,14],mpl:[1,3,12,14],much:11,multipl:0,multistag:0,must:[6,8,9,11],name:[0,7,8,9,10,11,14],name_by_commit:0,name_by_hash:0,namespac:[5,7],need:[7,8,10,11,14],newlin:[7,9,14],nicer:14,no_newline_regexp:[7,14],non:[0,7,8,11],none:[5,6,7,8,9,10,11,12,14],normal:11,note:[10,11],now:0,number:[8,9],nvidia:[0,10,11],object:[5,7,9,10,11,12,14],obtain:[3,12,14],oci:[0,11],one:[0,3,7,10,11,12,14],onli:[0,5,9,10,11],open:14,option:[0,4,6,7,8,9,10,11,14],orb:0,org:[3,12,14],origin:[0,10,12],other:[7,10,11,14],otherwis:[0,11],out:9,outfil:4,output:[0,4,7,8,10,11,14],output_fil:11,output_log:7,over:11,overrid:[0,10,11],overriden:11,packag:[1,2],package_url:0,param:[9,14],paramet:[0,5,6,7,8,10,11,12,14],parent:[7,11,14],pars:[0,3,5,7,8,10,11,14],parse_image_nam:[5,7],parse_label:10,parse_t:8,parse_verbos:11,parser:[0,4,12],part:14,pass:[6,7,8,10,11,14],path:[0,5,6,7,8,10,11,14],paus:0,perform:[10,11],persist:11,pid:[8,10,11],pipe:[7,11,14],point:0,poorli:11,popualt:12,port:12,prefer:[10,11],prefix:9,prepar:4,prepare_cli:4,preserv:[10,11],pretti:14,pretty_print:14,print:[0,4,7,9,10,11,12,14],print_log:7,print_pretti:14,println:[0,9,11],prioriti:5,privat:0,process:11,progess:[7,14],programat:7,progress:[2,3,7,14],progressbar:9,prompt:9,properli:[6,14],protocol:14,provid:[6,7,8,10,11],pull:[0,2,3,11],pull_fold:[10,11],pwd:[10,11],pypi:0,python:[0,4,11],quiet:[0,6,7,8,9,10,11,14],raw:[10,11],read:[10,11,14],read_fil:14,read_json:14,readlin:14,reason:[5,10,11],recip:[0,2,3,10,11],recommend:[10,11],refactor:0,registri:[5,7],regular:[0,7,14],rel:[0,10,11],releas:0,relev:0,remov:[0,8,14],remove_row:8,remove_uri:14,renam:0,replac:[0,11],report:14,repositori:0,repres:0,request:0,requir:[0,10,11],respect:[0,12],result:[10,11,14],resum:0,return_cod:9,return_json:[8,10,11],return_result:[0,10,11],revers:0,ride:11,right:0,robot:[7,10,11],robot_nam:[10,11],robotnam:[7,11],root:[10,11],row:[8,9],run:[0,2,3,7,8,9,11,14],run_bpython:4,run_command:[0,7,11,14],runscript:[0,10,11,12],runtim:[10,11],same:14,sandbox:[10,11],save:[4,5],sci:[10,11],scientif:[10,11],scif:[10,11],screen:[7,10,11],second:[5,7,8,9],section:0,see:[7,10,11],seem:[10,11],select:9,select_gener:9,self:[6,8,10,11],selftest:11,semant:14,send:[0,7,10,11,14],send_command:11,sens:[10,11],sequenc:12,serv:[4,10,11],set:[4,7,9,10,11,14],set_verbos:4,setenv:11,share:[10,11],shell:[0,2,3,10,11],shortcut:[7,11],should:[0,7,9,10,11,14],show:[9,10,11],show_progress:9,shub:14,sif:[10,11],siflist:11,sign:11,signatur:11,silent:11,simag:11,simpli:[5,7],singl:[8,10,11],singular:[0,3,5,6,7,8,10,11,14],singularity_cachedir:[10,11],singularity_opt:[6,7,8,10,11],singularity_tmpdir:[10,11],singularityhub:0,singularitymessag:9,singularitypars:[4,12],singularityrecip:0,singularitywar:[10,11],size:6,sizein:6,skip:[7,14],slash:14,sochat:[3,12,14],softwar:[10,11,14],some:[0,11],sourc:[0,3,4,5,6,7,8,9,10,11,12,14],special:14,special_charact:14,specif:[10,11],specifi:[6,7,8,9,10,11],sphinx:0,spin:9,spinner:[2,3],spinning_cursor:9,split:[0,5,7,14],split_uri:14,spython:[0,1],src:0,standard:[9,10,11],start:[0,3,7,9,14],state:0,statement:0,stderr:[9,11],stdin:6,stdout:[0,7,9,11,14],stop:[0,3,7,9,10,11],stopal:10,stream:[0,9,10,11,14],stream_command:14,string:[7,8,10,11,14],strip:0,structur:14,sub:[10,11],subclass:12,subcommand:6,subject:[3,12,14],submodul:[1,2,5,7],subpackag:[1,2],subprocess:[7,14],success:[0,11],sudo:[0,6,7,8,10,11,14],sudo_opt:[0,7,10,11,14],suffix:9,summari:11,suppli:[7,14],support:[0,6,7,8,9,10,11],suppress:[10,11],sutil:[3,10],sylab:7,symbol:9,system:[6,10,11],tabl:[8,9],table_str:8,take:[7,10,11,14],taken:0,tar:[6,11],tempfil:0,temporari:[6,11],term:[3,12,14],termin:[0,2,3,7,9,11],test:[0,2,3,10,11,12],testscript:11,text:[9,10,11],thei:7,them:[0,10,11],thi:[0,3,4,5,7,8,10,11,12,14],those:14,timeout:[0,7,8],tmp:[7,8],tmptar:6,tokenchar:11,tokenlength:11,tool:[10,11],top:8,total:9,track:0,trail:14,tree:0,tupl:[7,8],turn:10,typo:0,ubuntu:[5,7,11],uid:[10,11,14],under:[1,6,9],unset:0,updat:10,uri:[0,5,7,8,10,11,14],url:0,usag:[7,8,11,14],use:[0,6,7,10,11,12,14],usecolor:9,used:[6,9,10,11],useful:[5,10,11],user:[0,4,7,8,9,10,11,12,14],uses:[7,11,14],using:[10,11],usual:9,utf:11,util:[1,2,3,5],valu:[0,10,11],vanessa:[3,12,14],variabl:[0,6,8,9,11],vault:0,verbos:[6,8,9,10,11],verbose1:9,verbose2:9,verbose3:9,verifi:11,version:[0,1,2,4,5,7,11,12,14],version_info:[0,11],via:[6,8],volum:12,want:[7,8],warn:[0,9],whatev:6,when:[0,7,8],where:[8,10,11,14],which:[9,10,11,14],width:9,within:[10,11],withour:[10,11],without:14,won:[7,14],work:[0,1],workdir:12,wrap:9,wrapper:[4,11],writabl:[0,10,11],write:[9,10,11,12,14],write_fil:14,write_json:14,writer:[0,4,12],x1b:9,yes:11,yield:14,you:[3,10,11,12,14],your:[9,10,11]},titles:["<no title>","Welcome to Singularity Python API\u2019s documentation!","spython","spython package","spython.client package","spython.image package","spython.image.cmd package","spython.instance package","spython.instance.cmd package","spython.logger package","spython.main package","spython.main.base package","spython.main.parse package","spython.tests package","spython.utils package"],titleterms:{"export":6,api:1,app:10,base:11,build:10,client:4,cmd:[6,8],command:11,content:[3,4,5,6,7,8,9,10,11,12,13,14],convert:12,creat:6,docker:12,document:1,environ:12,execut:10,fileio:14,flag:11,gener:11,help:10,imag:[5,6],importcmd:6,indic:1,inspect:10,instanc:[7,8,10],iutil:8,logger:[9,11],main:[10,11,12],messag:9,modul:[3,4,5,6,7,8,9,10,11,12,13,14],packag:[3,4,5,6,7,8,9,10,11,12,13,14],pars:12,progress:9,pull:10,python:1,recip:[4,12],run:10,shell:4,singular:[1,12],spinner:9,spython:[2,3,4,5,6,7,8,9,10,11,12,13,14],start:8,stop:8,submodul:[3,4,6,8,9,10,11,12,13,14],subpackag:[3,5,7,10],sutil:11,tabl:1,termin:14,test:[4,13],test_client:13,test_inst:13,test_util:13,util:[6,14],version:3,welcom:1}})
\ No newline at end of file
diff --git a/docs/api/source/modules.html b/docs/api/source/modules.html
index 69cc42fb..3e8b443c 100644
--- a/docs/api/source/modules.html
+++ b/docs/api/source/modules.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -84,7 +84,6 @@
diff --git a/docs/api/source/spython.client.html b/docs/api/source/spython.client.html
index bcaeed97..395ba405 100644
--- a/docs/api/source/spython.client.html
+++ b/docs/api/source/spython.client.html
@@ -21,10 +21,10 @@
-
-
-
-
+
+
+
+
@@ -107,7 +107,6 @@
Module contents
-CHANGELOG
@@ -181,9 +180,9 @@ Submodules |