Updated to ACES 1.0.1
[OpenColorIO-Configs.git] / aces_1.0.0 / python / aces_ocio / process.py
diff --git a/aces_1.0.0/python/aces_ocio/process.py b/aces_1.0.0/python/aces_ocio/process.py
deleted file mode 100755 (executable)
index 5758b5e..0000000
+++ /dev/null
@@ -1,751 +0,0 @@
-#!/usr/bin/env python\r
-# -*- coding: utf-8 -*-\r
-\r
-"""\r
-A process wrapper class that maintains the text output and execution status of\r
-a process or a list of other process wrappers which carry such data.\r
-"""\r
-\r
-from __future__ import division\r
-\r
-import os\r
-import sys\r
-import traceback\r
-\r
-__author__ = 'ACES Developers'\r
-__copyright__ = 'Copyright (C) 2014 - 2015 - ACES Developers'\r
-__license__ = ''\r
-__maintainer__ = 'ACES Developers'\r
-__email__ = 'aces@oscars.org'\r
-__status__ = 'Production'\r
-\r
-__all__ = ['read_text',\r
-           'write_text',\r
-           'Process',\r
-           'ProcessList',\r
-           'main']\r
-\r
-\r
-def read_text(text_file):\r
-    """\r
-    Object description.\r
-\r
-    Parameters\r
-    ----------\r
-    parameter : type\r
-        Parameter description.\r
-\r
-    Returns\r
-    -------\r
-    type\r
-         Return value description.\r
-    """\r
-\r
-    # TODO: Investigate if check is needed.\r
-    if not text_file:\r
-        return\r
-\r
-    with open(text_file, 'rb') as fp:\r
-        text = (fp.read())\r
-\r
-    return text\r
-\r
-\r
-def write_text(text, text_file):\r
-    """\r
-    Object description.\r
-\r
-    Parameters\r
-    ----------\r
-    parameter : type\r
-        Parameter description.\r
-\r
-    Returns\r
-    -------\r
-    type\r
-         Return value description.\r
-    """\r
-\r
-    # TODO: Investigate if check is needed.\r
-    if not text_file:\r
-        return\r
-\r
-    with open(text_file, 'wb') as fp:\r
-        fp.write(text)\r
-\r
-    return text\r
-\r
-\r
-class Process:\r
-    """\r
-    A process with logged output.\r
-    """\r
-\r
-    def __init__(self,\r
-                 description=None,\r
-                 cmd=None,\r
-                 args=None,\r
-                 cwd=None,\r
-                 env=None,\r
-                 batch_wrapper=False):\r
-        """\r
-        Initialize the standard class variables.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        if args is None:\r
-            args = []\r
-\r
-        self.cmd = cmd\r
-        if not description:\r
-            self.description = cmd\r
-        else:\r
-            self.description = description\r
-        self.status = None\r
-        self.args = args\r
-        self.start = None\r
-        self.end = None\r
-        self.log = []\r
-        self.echo = True\r
-        self.cwd = cwd\r
-        self.env = env\r
-        self.batch_wrapper = batch_wrapper\r
-        self.process_keys = []\r
-\r
-    def get_elapsed_seconds(self):\r
-        """\r
-        Object description.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        import math\r
-\r
-        if self.end and self.start:\r
-            delta = (self.end - self.start)\r
-            formatted = '%s.%s' % (delta.days * 86400 + delta.seconds,\r
-                                   int(math.floor(delta.microseconds / 1e3)))\r
-        else:\r
-            formatted = None\r
-        return formatted\r
-\r
-    def write_key(self, write_dict, key=None, value=None, start_stop=None):\r
-        """\r
-        Writes a key / value pair in a supported format.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        if key is not None and (value is not None or start_stop is not None):\r
-            indent = '\t' * write_dict['indentationLevel']\r
-            if write_dict['format'] == 'xml':\r
-                if start_stop == 'start':\r
-                    write_dict['logHandle'].write('%s<%s>\n' % (indent, key))\r
-                elif start_stop == 'stop':\r
-                    write_dict['logHandle'].write('%s</%s>\n' % (indent, key))\r
-                else:\r
-                    write_dict['logHandle'].write(\r
-                        '%s<%s>%s</%s>\n' % (indent, key, value, key))\r
-            else:\r
-                write_dict['logHandle'].write(\r
-                    '%s%40s : %s\n' % (indent, key, value))\r
-\r
-    def write_log_header(self, write_dict):\r
-        """\r
-        Object description.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        import platform\r
-\r
-        try:\r
-            user = os.getlogin()\r
-        except:\r
-            try:\r
-                user = os.getenv('USERNAME')\r
-                if user is None:\r
-                    user = os.getenv('USER')\r
-            except:\r
-                user = 'unknown_user'\r
-        try:\r
-            (sysname, nodename, release, version, machine,\r
-             processor) = platform.uname()\r
-        except:\r
-            (sysname, nodename, release, version, machine, processor) = (\r
-                'unknown_sysname', 'unknown_nodename', 'unknown_release',\r
-                'unknown_version', 'unknown_machine', 'unknown_processor')\r
-\r
-        self.write_key(write_dict, 'process', None, 'start')\r
-        write_dict['indentationLevel'] += 1\r
-\r
-        self.write_key(write_dict, 'description', self.description)\r
-        self.write_key(write_dict, 'cmd', self.cmd)\r
-        if self.args:\r
-            self.write_key(write_dict, 'args', ' '.join(self.args))\r
-        self.write_key(write_dict, 'start', self.start)\r
-        self.write_key(write_dict, 'end', self.end)\r
-        self.write_key(write_dict, 'elapsed', self.get_elapsed_seconds())\r
-\r
-        self.write_key(write_dict, 'user', user)\r
-        self.write_key(write_dict, 'sysname', sysname)\r
-        self.write_key(write_dict, 'nodename', nodename)\r
-        self.write_key(write_dict, 'release', release)\r
-        self.write_key(write_dict, 'version', version)\r
-        self.write_key(write_dict, 'machine', machine)\r
-        self.write_key(write_dict, 'processor', processor)\r
-\r
-        if len(self.process_keys) > 0:\r
-            self.write_key(write_dict, 'processKeys', None, 'start')\r
-            for pair in self.process_keys:\r
-                (key, value) = pair\r
-                write_dict['indentationLevel'] += 1\r
-                self.write_key(write_dict, key, value)\r
-                write_dict['indentationLevel'] -= 1\r
-            self.write_key(write_dict, 'processKeys', None, 'stop')\r
-\r
-        self.write_key(write_dict, 'status', self.status)\r
-\r
-    def write_log_footer(self, write_dict):\r
-        """\r
-        Object description.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        write_dict['indentationLevel'] -= 1\r
-        self.write_key(write_dict, 'process', None, 'stop')\r
-\r
-    def write_log(self,\r
-                  log_handle=sys.stdout,\r
-                  indentation_level=0,\r
-                  format='xml'):\r
-        """\r
-        Writes logging information to the specified handle.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        write_dict = {}\r
-        write_dict['logHandle'] = log_handle\r
-        write_dict['indentationLevel'] = indentation_level\r
-        write_dict['format'] = format\r
-\r
-        if log_handle:\r
-            self.write_log_header(write_dict)\r
-\r
-            if self.log:\r
-                self.write_key(write_dict, 'output', None, 'start')\r
-                if format == 'xml':\r
-                    log_handle.write('<![CDATA[\n')\r
-                for line in self.log:\r
-                    log_handle.write('%s%s\n' % ('', line))\r
-                if format == 'xml':\r
-                    log_handle.write(']]>\n')\r
-                self.write_key(write_dict, 'output', None, 'stop')\r
-\r
-            self.write_log_footer(write_dict)\r
-\r
-    def write_log_to_disk(self, log_filename=None, format='xml', header=None):\r
-        """\r
-        Object description.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        if log_filename:\r
-            try:\r
-                # TODO: Review statements.\r
-                # 3.1\r
-                try:\r
-                    log_handle = (\r
-                        open(log_filename, mode='wt', encoding='utf-8'))\r
-                # 2.6\r
-                except:\r
-                    log_handle = open(log_filename, mode='wt')\r
-            except:\r
-                print('Couldn\'t open log : %s' % log_filename)\r
-                log_handle = None\r
-\r
-        if log_handle:\r
-            if header:\r
-                if format == 'xml':\r
-                    log_handle.write('<![CDATA[\n')\r
-                log_handle.write(header)\r
-                if format == 'xml':\r
-                    log_handle.write(']]>\n')\r
-            self.write_log(log_handle, format=format)\r
-            log_handle.close()\r
-\r
-    def log_line(self, line):\r
-        """\r
-        Adds a line of text to the log.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        self.log.append(line.rstrip())\r
-        if self.echo:\r
-            print('%s' % line.rstrip())\r
-\r
-    def execute(self):\r
-        """\r
-        Executes the current process.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        import datetime\r
-        import traceback\r
-\r
-        try:\r
-            import subprocess as sp\r
-        except:\r
-            sp = None\r
-\r
-        self.start = datetime.datetime.now()\r
-\r
-        cmdargs = [self.cmd]\r
-        cmdargs.extend(self.args)\r
-\r
-        if self.echo:\r
-            if sp:\r
-                print(\r
-                    '\n%s : %s\n' % (self.__class__, sp.list2cmdline(cmdargs)))\r
-            else:\r
-                print('\n%s : %s\n' % (self.__class__, ' '.join(cmdargs)))\r
-\r
-        process = None\r
-        tmp_wrapper = None\r
-        stdout = None\r
-        stdin = None\r
-        parentenv = os.environ\r
-        parentcwd = os.getcwd()\r
-\r
-        try:\r
-            # Using *subprocess*.\r
-            if sp:\r
-                if self.batch_wrapper:\r
-                    cmd = ' '.join(cmdargs)\r
-                    tmp_wrapper = os.path.join(self.cwd, 'process.bat')\r
-                    write_text(cmd, tmp_wrapper)\r
-                    print('%s : Running process through wrapper %s\n' % (\r
-                        self.__class__, tmp_wrapper))\r
-                    process = sp.Popen([tmp_wrapper], stdout=sp.PIPE,\r
-                                       stderr=sp.STDOUT,\r
-                                       cwd=self.cwd, env=self.env)\r
-                else:\r
-                    process = sp.Popen(cmdargs, stdout=sp.PIPE,\r
-                                       stderr=sp.STDOUT,\r
-                                       cwd=self.cwd, env=self.env)\r
-\r
-            # using *os.popen4*.\r
-            else:\r
-                if self.env:\r
-                    os.environ = self.env\r
-                if self.cwd:\r
-                    os.chdir(self.cwd)\r
-\r
-                stdin, stdout = os.popen4(cmdargs, 'r')\r
-        except:\r
-            print('Couldn\'t execute command : %s' % cmdargs[0])\r
-            traceback.print_exc()\r
-\r
-        # Using *subprocess*\r
-        if sp:\r
-            if process is not None:\r
-                # pid = process.pid\r
-                # log.logLine('process id %s\n' % pid)\r
-\r
-                try:\r
-                    # This is more proper python, and resolves some issues with\r
-                    # a process ending before all of its output has been\r
-                    # processed, but it also seems to stall when the read\r
-                    # buffer is near or over its limit. This happens\r
-                    # relatively frequently with processes that generate lots\r
-                    # of print statements.\r
-                    for line in process.stdout:\r
-                        self.log_line(line)\r
-\r
-                    # So we go with the, um, uglier option below.\r
-\r
-                    # This is now used to ensure that the process has finished.\r
-                    line = ''\r
-                    while line is not None and process.poll() is None:\r
-                        try:\r
-                            line = process.stdout.readline()\r
-                        except:\r
-                            break\r
-                        # 3.1\r
-                        try:\r
-                            # TODO: Investigate previous eroneous statement.\r
-                            # self.log_line(str(line, encoding='utf-8'))\r
-                            self.log_line(str(line))\r
-                        # 2.6\r
-                        except:\r
-                            self.log_line(line)\r
-                except:\r
-                    self.log_line('Logging error : %s' % sys.exc_info()[0])\r
-\r
-                self.status = process.returncode\r
-\r
-                if self.batch_wrapper and tmp_wrapper:\r
-                    try:\r
-                        os.remove(tmp_wrapper)\r
-                    except:\r
-                        print(\r
-                            'Couldn\'t remove temp wrapper : %s' % tmp_wrapper)\r
-                        traceback.print_exc()\r
-\r
-        # Using *os.popen4*.\r
-        else:\r
-            exit_code = -1\r
-            try:\r
-                stdout_lines = stdout.readlines()\r
-                # TODO: Investigate if this is the good behavior, close() does\r
-                # not return anything / None.\r
-                exit_code = stdout.close()\r
-\r
-                stdout.close()\r
-                stdin.close()\r
-\r
-                if self.env:\r
-                    os.environ = parentenv\r
-                if self.cwd:\r
-                    os.chdir(parentcwd)\r
-\r
-                if len(stdout_lines) > 0:\r
-                    for line in stdout_lines:\r
-                        self.log_line(line)\r
-\r
-                if not exit_code:\r
-                    exit_code = 0\r
-            except:\r
-                self.log_line('Logging error : %s' % sys.exc_info()[0])\r
-\r
-            self.status = exit_code\r
-\r
-        self.end = datetime.datetime.now()\r
-\r
-\r
-class ProcessList(Process):\r
-    """\r
-    A list of processes with logged output.\r
-    """\r
-\r
-    def __init__(self, description, blocking=True, cwd=None, env=None):\r
-        """\r
-        Object description.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        Process.__init__(self, description, None, None, cwd, env)\r
-        'Initialize the standard class variables'\r
-        self.processes = []\r
-        self.blocking = blocking\r
-\r
-    def generate_report(self, write_dict):\r
-        """\r
-        Generates a log based on the success of the child processes.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        if self.processes:\r
-            _status = True\r
-            indent = '\t' * (write_dict['indentationLevel'] + 1)\r
-\r
-            self.log = []\r
-\r
-            for child in self.processes:\r
-                if isinstance(child, ProcessList):\r
-                    child.generate_report(write_dict)\r
-\r
-                key = child.description\r
-                value = child.status\r
-                if write_dict['format'] == 'xml':\r
-                    child_result = (\r
-                        '%s<result description=\'%s\'>%s</result>' % (\r
-                            indent, key, value))\r
-                else:\r
-                    child_result = ('%s%40s : %s' % (indent, key, value))\r
-                self.log.append(child_result)\r
-\r
-                if child.status != 0:\r
-                    _status = False\r
-            if not _status:\r
-                self.status = -1\r
-            else:\r
-                self.status = 0\r
-        else:\r
-            self.log = ['No child processes available to generate a report']\r
-            self.status = -1\r
-\r
-    def write_log_header(self, write_dict):\r
-        """\r
-        Object description.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        self.write_key(write_dict, 'processList', None, 'start')\r
-        write_dict['indentationLevel'] += 1\r
-\r
-        self.write_key(write_dict, 'description', self.description)\r
-        self.write_key(write_dict, 'start', self.start)\r
-        self.write_key(write_dict, 'end', self.end)\r
-        self.write_key(write_dict, 'elapsed', self.get_elapsed_seconds())\r
-\r
-        self.generate_report(write_dict)\r
-\r
-        self.write_key(write_dict, 'status', self.status)\r
-\r
-    def write_log_footer(self, write_dict):\r
-        """\r
-        Object description.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        write_dict['indentationLevel'] -= 1\r
-        self.write_key(write_dict, 'processList', None, 'stop')\r
-\r
-    def write_log(self,\r
-                  log_handle=sys.stdout,\r
-                  indentation_level=0,\r
-                  format='xml'):\r
-        """\r
-        Writes logging information to the specified handle.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        write_dict = {}\r
-        write_dict['logHandle'] = log_handle\r
-        write_dict['indentationLevel'] = indentation_level\r
-        write_dict['format'] = format\r
-\r
-        if log_handle:\r
-            self.write_log_header(write_dict)\r
-\r
-            if self.log:\r
-                self.write_key(write_dict, 'output', None, 'start')\r
-                for line in self.log:\r
-                    log_handle.write('%s%s\n' % ('', line))\r
-                self.write_key(write_dict, 'output', None, 'stop')\r
-\r
-            if self.processes:\r
-                self.write_key(write_dict, 'processes', None, 'start')\r
-                for child in self.processes:\r
-                    child.write_log(log_handle, indentation_level + 1, format)\r
-                self.write_key(write_dict, 'processes', None, 'stop')\r
-\r
-            self.write_log_footer(write_dict)\r
-\r
-    def execute(self):\r
-        """\r
-        Executes the list of processes.\r
-\r
-        Parameters\r
-        ----------\r
-        parameter : type\r
-            Parameter description.\r
-\r
-        Returns\r
-        -------\r
-        type\r
-             Return value description.\r
-        """\r
-\r
-        import datetime\r
-\r
-        self.start = datetime.datetime.now()\r
-\r
-        self.status = 0\r
-        if self.processes:\r
-            for child in self.processes:\r
-                if child:\r
-                    try:\r
-                        child.execute()\r
-                    except:\r
-                        print('%s : caught exception in child class %s' % (\r
-                            self.__class__, child.__class__))\r
-                        traceback.print_exc()\r
-                        child.status = -1\r
-\r
-                    if self.blocking and child.status != 0:\r
-                        print('%s : child class %s finished with an error' % (\r
-                            self.__class__, child.__class__))\r
-                        self.status = -1\r
-                        break\r
-\r
-        self.end = datetime.datetime.now()\r
-\r
-\r
-def main():\r
-    """\r
-    Object description.\r
-\r
-    Parameters\r
-    ----------\r
-    parameter : type\r
-        Parameter description.\r
-\r
-    Returns\r
-    -------\r
-    type\r
-         Return value description.\r
-    """\r
-\r
-    import optparse\r
-\r
-    p = optparse.OptionParser(description='A process logging script',\r
-                              prog='process',\r
-                              version='process 0.1',\r
-                              usage=('%prog [options] '\r
-                                     '[options for the logged process]'))\r
-    p.add_option('--cmd', '-c', default=None)\r
-    p.add_option('--log', '-l', default=None)\r
-\r
-    options, arguments = p.parse_args()\r
-\r
-    cmd = options.cmd\r
-    log_filename = options.log\r
-\r
-    try:\r
-        args_start = sys.argv.index('--') + 1\r
-        args = sys.argv[args_start:]\r
-    except:\r
-        args = []\r
-\r
-    if cmd is None:\r
-        print('process: No command specified')\r
-\r
-    # Testing regular logging.\r
-    process = Process(description='a process', cmd=cmd, args=args)\r
-\r
-    # Testing report generation and writing a log.\r
-    process_list = ProcessList('a process list')\r
-    process_list.processes.append(process)\r
-    process_list.echo = True\r
-    process_list.execute()\r
-\r
-    process_list.write_log_to_disk(log_filename)\r
-\r
-\r
-if __name__ == '__main__':\r
-    main()\r