Salome HOME
merge from master 8B7B
authorChristian Van Wambeke <christian.van-wambeke@cea.fr>
Wed, 27 Jun 2018 09:28:28 +0000 (11:28 +0200)
committerChristian Van Wambeke <christian.van-wambeke@cea.fr>
Wed, 27 Jun 2018 09:28:28 +0000 (11:28 +0200)
109 files changed:
AllTestLauncherSat.py [new file with mode: 0755]
__init__.py [new file with mode: 0644]
commands/__init__.py [new file with mode: 0644]
commands/config.py
commands/doc.py
commands/init.py
commands/job.py
commands/jobs.py
commands/log.py
commands/package.py
commands/run.py
commands/shell.py
data/local_original.pyconf [new file with mode: 0644]
data/local_wambeke_cea.pyconf [new file with mode: 0644]
data/local_wambeke_home.pyconf [new file with mode: 0644]
doc/build/doctrees/commands/apidoc/src.doctree
doc/build/doctrees/commands/doc.doctree
doc/build/doctrees/commands/generate.doctree
doc/build/doctrees/environment.pickle
doc/build/doctrees/index.doctree
doc/build/html/_modules/src/debug.html
doc/build/html/_modules/src/logger.html
doc/build/html/_modules/src/options.html
doc/build/html/_sources/commands/doc.rst.txt
doc/build/html/commands/apidoc/src.html
doc/build/html/commands/config.html
doc/build/html/commands/doc.html
doc/build/html/genindex.html
doc/build/html/objects.inv
doc/build/html/searchindex.js
doc/build/html/usage_of_sat.html
doc/build/latex/salomeTools.aux
doc/build/latex/salomeTools.fdb_latexmk
doc/build/latex/salomeTools.idx
doc/build/latex/salomeTools.ilg
doc/build/latex/salomeTools.ind
doc/build/latex/salomeTools.log
doc/build/latex/salomeTools.out
doc/build/latex/salomeTools.pdf
doc/build/latex/salomeTools.tex
doc/build/latex/salomeTools.toc
doc/src/commands/doc.rst
salomeTools.py
src/debug.py [changed mode: 0644->0755]
src/logger.py [changed mode: 0644->0755]
src/loggingSimple.py [new file with mode: 0755]
src/options.py [changed mode: 0644->0755]
src/returnCode.py [new file with mode: 0644]
src/salomeTools.py [new file with mode: 0755]
src/utilsSat.py [new file with mode: 0644]
src/xmlManager.py
test/APPLI_TEST/APPLI_TEST.pyconf [new file with mode: 0644]
test/README_config_0_3_9.txt [new file with mode: 0644]
test/__init__.py [new file with mode: 0755]
test/_testTools/HTMLTestRunner.py [deleted file]
test/_testTools/tools.py [deleted file]
test/compilation/test_compilation.py [deleted file]
test/compilation/test_configure.py [deleted file]
test/compilation/test_make.py [deleted file]
test/compilation/test_makeinstall.py [deleted file]
test/config/create_user_pyconf.py [deleted file]
test/config/option_copy.py [deleted file]
test/config/option_edit.py [deleted file]
test/config/option_value.py [deleted file]
test/config/option_value_2.py [deleted file]
test/environ/test_environ.py [deleted file]
test/initializeTest.py [new file with mode: 0755]
test/job/test_job.py [deleted file]
test/jobs/test_jobs.py [deleted file]
test/log/launch_browser.py [deleted file]
test/log/launch_browser2.py [deleted file]
test/prepare/test_clean.py [deleted file]
test/prepare/test_patch.py [deleted file]
test/prepare/test_prepare.py [deleted file]
test/prepare/test_source.py [deleted file]
test/run_all.sh [deleted file]
test/shell/test_shell.py [deleted file]
test/test/test_command.py [deleted file]
test/test_020_debug.py [new file with mode: 0755]
test/test_024_logging.py [new file with mode: 0755]
test/test_035_pyconf.py [new file with mode: 0755]
test/test_100_satHelp.py [new file with mode: 0755]
test/test_500_APPLI_TEST.py [new file with mode: 0755]
test/test_501_paramiko.py [new file with mode: 0755]
test/test_sat5_0/README [new file with mode: 0644]
test/test_sat5_0/__init__.py [new file with mode: 0644]
test/test_sat5_0/compilation/test_compilation.py [new file with mode: 0755]
test/test_sat5_0/compilation/test_configure.py [new file with mode: 0755]
test/test_sat5_0/compilation/test_make.py [new file with mode: 0755]
test/test_sat5_0/compilation/test_makeinstall.py [new file with mode: 0755]
test/test_sat5_0/config/test_create_user_pyconf.py [new file with mode: 0755]
test/test_sat5_0/config/test_option_copy.py [new file with mode: 0755]
test/test_sat5_0/config/test_option_edit.py [new file with mode: 0755]
test/test_sat5_0/config/test_option_value.py [new file with mode: 0755]
test/test_sat5_0/config/test_option_value_2.py [new file with mode: 0755]
test/test_sat5_0/environ/test_environ.py [new file with mode: 0755]
test/test_sat5_0/job/test_job.py [new file with mode: 0755]
test/test_sat5_0/jobs/test_jobs.py [new file with mode: 0755]
test/test_sat5_0/log/test_launch_browser.py [new file with mode: 0755]
test/test_sat5_0/log/test_launch_browser2.py [new file with mode: 0755]
test/test_sat5_0/prepare/test_clean.py [new file with mode: 0755]
test/test_sat5_0/prepare/test_patch.py [new file with mode: 0755]
test/test_sat5_0/prepare/test_prepare.py [new file with mode: 0755]
test/test_sat5_0/prepare/test_source.py [new file with mode: 0755]
test/test_sat5_0/run_all.sh [new file with mode: 0755]
test/test_sat5_0/shell/test_shell.py [new file with mode: 0755]
test/test_sat5_0/test/test_command.py [new file with mode: 0755]
unittestpy/HTMLTestRunner.py [new file with mode: 0644]
unittestpy/__init__.py [new file with mode: 0644]

diff --git a/AllTestLauncherSat.py b/AllTestLauncherSat.py
new file mode 100755 (executable)
index 0000000..8b74f2f
--- /dev/null
@@ -0,0 +1,364 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2008-2018  CEA/DEN
+# 
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+# 
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+# 
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# 
+# See http://www.salome-platform.org or email : webmaster.salome@opencascade.com
+
+
+"""
+Test all SAT unittest files (test*.py) existing in subdirectories of a root directory
+
+| Example:
+| >> AllTestLauncherSat.py --rootPath='.' --pattern='test_???_*.py'
+"""
+
+"""
+#### base of algorithm functionality
+
+#see http://www.voidspace.org.uk/python/articles/introduction-to-unittest.shtml
+
+import unittest
+
+import test_something
+import test_something2
+import test_something3
+
+loader = unittest.TestLoader()
+
+suite = loader.loadTestsFromModule(test_something)
+suite.addTests(loader.loadTestsFromModule(test_something2))
+suite.addTests(loader.loadTestsFromModule(test_something3))
+
+runner = unittest.TextTestRunner(verbosity=2)
+result = runner.run(suite)
+"""
+
+
+import os
+import sys
+import unittest
+import traceback
+import argparse as AP
+
+import glob
+import fnmatch
+import pprint as PP #pretty print
+
+debug = False
+verboseImport = True
+
+
+# get path to origin sources
+defaultdir  = os.path.dirname(os.path.realpath(__file__))
+# get path to salomeTools sources
+satdir = defaultdir
+srcdir = os.path.join(satdir, 'src')
+cmdsdir = os.path.join(satdir, 'commands')
+
+# Make the src & commands package accessible from all code
+sys.path.insert(0, satdir)
+sys.path.insert(0, srcdir) # TODO remove that
+sys.path.insert(0, cmdsdir) # TODO remove that
+
+_user = os.environ['USER']
+# wambeke is christian at home
+_developpers = ["christian", "wambeke",] #  ...who wants
+
+def errPrint(aStr):
+  """stderr to avoid write in html or xml file log message"""
+  sys.stderr.write(aStr + '\n')
+
+try:
+  import unittestpy.HTMLTestRunner as HTST
+except:
+  HTST = None
+  errPrint("""
+WARNING: no HTML output available.
+         try find 'test/unittestpy/HTMLTestRunner.py'.
+""")
+
+
+try:
+  import xmlrunner as XTST
+except:
+  XTST = None
+  errPrint("""
+WARNING: no XML output available for unittest.
+         try 'pip install unittest-xml-reporting'.
+""")
+
+
+###################################################################
+def locate(pattern, root=os.curdir):
+  """
+  Locate all files matching supplied filename pattern in and below
+  supplied root directory.
+  """
+  result = []
+  for path, dirs, files in os.walk(os.path.abspath(root)):
+    for filename in fnmatch.filter(files, pattern):
+      result.append( os.path.join(path, filename) )
+  return result
+
+def printEnv(search=""):
+  """
+  list all environment variables which name contains search string
+  example: 
+    import AllTestLauncher as ATL
+    ATL.printEnv("ROOT_")
+  """
+  env=os.environ
+  for i in sorted(env):
+    if search in i:
+      print(i) 
+
+def grepInEnv(search=""):
+  """
+  list all environment variables which contains search string
+  example: 
+    import AllTestLauncher as ATL
+    ATL.grepInEnv("XDATA")
+  """
+  env=os.environ
+  for i in sorted(env):
+     done=False
+     for j in env[i].split(":"):
+       if search in j:
+           if not done:
+             print(i+" contains ") 
+             done=True
+           print("  "+j)
+      
+def format_exception(msg, limit=None, trace=None):
+    """
+    Format a stack trace and the exception information.
+    as traceback.format_exception(),
+    with all traceback only if user in ._developpers
+    """
+    etype, value, tb = sys.exc_info()
+    if _user in _developpers:
+      res = "\n" + msg
+      if tb:
+          res += "\nTraceback (most recent call last):\n"
+          res += "".join(traceback.format_tb(tb, limit)) #[:-1])
+      res += "\n<"
+      res += "\n".join(traceback.format_exception_only(etype, value))
+      return res
+    else:
+      res = "\n" + msg
+      if tb:
+          res += "\nTraceback:\n"
+          res += "".join(traceback.format_tb(tb, limit)[-1:]) #[:-1])
+      res += "\n<"
+      res += "".join(traceback.format_exception_only(etype, value))
+      return res
+
+###################################################################
+def runOnArgs(args):
+  """
+  launch tests on args.pattern files
+  """
+  fromFileOrPath = args.rootPath
+  fileTestPattern = args.pattern
+  if fromFileOrPath == None:
+    directory, name = os.path.split( os.path.realpath( __file__ ) )
+  else:
+    if os.path.isdir(fromFileOrPath):
+      directory, name = (fromFileOrPath, None)
+      fileTestPatternCurrent = fileTestPattern
+    elif os.path.isfile(fromFileOrPath):
+      directory, name = os.path.split( os.path.realpath( fromFileOrPath ) )
+      fileTestPatternCurrent = name
+    else:
+      mess = "Cannot get file or directory '%s'" % fromFileOrPath
+      errPrint("ERROR: " + mess)
+      return None
+      #raise Exception("Cannot get file or directory '%s'" % fromFileOrPath)
+
+  #files = glob.glob(os.path.join(directory, "*Test.py"))
+  files = sorted(locate(fileTestPatternCurrent, directory))
+
+  filesForTest={}
+
+  for aFile in files:
+    aDir, aName = os.path.split(aFile)
+    aImport, ext = os.path.splitext(aName)
+    
+    try:
+      if aFile in list(filesForTest.keys()):
+        print("WARNING: imported yet: "+aFile)
+      else:
+        sys.path.insert(0, aDir)
+        done = True
+        if verboseImport: errPrint("try import '%s'" % aImport)
+        aModule = __import__(aImport, globals(), locals(), []) 
+        del sys.path[0]
+        done = False
+        filesForTest[aFile] = (aImport, aModule)
+    except Exception as e:
+      if done: 
+        del sys.path[0] #attention of sys.path appends
+        done = False
+      msg = "ERROR: AllTestLauncher: import '%s':" % aFile
+      err = format_exception(msg)
+      errPrint(err)
+      continue
+
+  listfilesForTest = sorted(filesForTest.keys())
+  result = None
+
+  errPrint("AllTestLauncher test files:\n %s" % PP.pformat(listfilesForTest))
+  
+  if len(listfilesForTest) == 0: 
+    if debug: errPrint("WARNING: AllTestLauncher: empty list of test files")
+    return None
+
+  loader = unittest.TestLoader()
+  suite = None
+
+  for i,k in enumerate(listfilesForTest):
+    if debug: errPrint("Test: %s %s" % (i, k))
+    if i == 0:
+      suite = loader.loadTestsFromModule( filesForTest[k][1] )
+      pass
+    else:
+      suite.addTests( loader.loadTestsFromModule( filesForTest[k][1] ) )
+      pass
+
+  if args.type == "std": 
+    runner = unittest.TextTestRunner(verbosity=args.verbosity)
+  elif args.type == "html": 
+    runner = HTST.HTMLTestRunner(verbosity=args.verbosity, )
+  elif args.type == "xml": 
+    if args.name == 'stdout':
+      #all-in-one xml output at 'sys.stdout' for pipe redirection
+      runner = XTST.XMLTestRunner(verbosity=args.verbosity, output=sys.stdout)
+    else:
+      #one file xml per test in suite in args.name directory
+      runner = XTST.XMLTestRunner(verbosity=args.verbosity, output=args.name)
+  else:
+    errPrint("ERROR: unknown type of output: '%s'" % args.type)
+    return None    
+    
+  if suite != None: result = runner.run(suite)
+  return result
+
+###################################################################
+def runFromEnvVar(envVar, fileTestPattern="*Test.py"):
+  """
+  example: 
+    import AllTestLauncher as ATL
+    ATL.runFromEnvVar("MICROGEN_ROOT_DIR")
+    ATL.runFromEnvVar("MICROGEN_ROOT_DIR", "aggregate_*GJKTest.py")
+  """
+  env=os.environ
+  res = []
+  for i in sorted(env):
+    if envVar in i:
+      res.append(i)
+  if len(res) > 1:
+    mess = "multiple environment variable for '%s': %s" % (envVar, str(res))
+    errPrint("ERROR: " + mess)
+    return None
+  if len(res) < 1:
+    mess = "no environment variable for '%s'" % (envVar)
+    errPrint("ERROR: " + mess)
+    return None
+  res = res[0]
+  tmp = env[res].split(":")
+  if len(tmp) > 1:
+    mess = "need only one path in environment variable '%s'" % (res)
+    errPrint("ERROR: " + mess)
+    return None  
+  run(fromFileOrPath=env[res], fileTestPattern=fileTestPattern)
+
+
+###################################################################
+def getParser():
+  parser = AP.ArgumentParser(description='launch All salomeTools python tests', argument_default=None)
+
+  parser.add_argument(
+    '-d', '--debug', 
+    help='set debug mode, more verbose',
+    action='store_true',
+  )
+  parser.add_argument(
+    '-v', '--verbosity', 
+    help='set verbosity of unittests [0|1|2...]',
+    default=2,
+    metavar='int'
+  )
+  parser.add_argument(
+    '-r', '--rootPath', 
+    help="""\
+dir name with absolute or relative path stand for root directory
+of recursive searching unittest python files
+""",
+   default=defaultdir,
+   metavar='dirPath'
+  )
+  parser.add_argument(
+    '-p', '--pattern', 
+    help="file pattern for unittest files ['test_*.py'|'*Test.py'...]",
+    default="test_???_*.py", # as alphabetical ordered test site
+    metavar='filePattern'
+  )
+  parser.add_argument(
+    '-t', '--type', 
+    help="type of output: ['std'(standart ascii)|'xml'|'html']",
+    default="std",
+    choices=['std', 'xml', 'html'],
+    metavar='outputType'
+  )
+  parser.add_argument(
+    '-n', '--name', 
+    help="""\
+(only for type xml)
+name of directory output: ['test_reports'|...].
+If name = 'stdout' then all-in-one xml output at 'sys.stdout'. For pipe redirection:
+'>> AllTestLauncher.py -t xml -n stdout > tmp.xml'
+""",
+    default="test_reports",
+    metavar='dirName'
+  )
+  return parser
+
+#export PATH=defaultdir:${PATH}
+
+###################################################################
+if __name__ == '__main__':
+  # Make the src & command package accessible from all code
+  # as export PYTHONPATH=defaultdir:${PYTHONPATH}
+  # https://docs.python.org/2/library/os.html
+  # On some platforms, including FreeBSD and Mac OS X, 
+  # setting environ may cause memory leak
+  # so use sys.path
+  # errPrint("INFO    : AllTestLauncher sys.path:\n'%s'" % PP.pformat(sys.path)
+  if defaultdir not in sys.path[0]:
+    sys.path.insert(0, defaultdir)
+    errPrint("WARNING : sys.path prepend '%s'\n" % defaultdir)
+
+  args = getParser().parse_args(sys.argv[1:])
+  debug = args.debug
+  directory = os.path.realpath(args.rootPath)
+  if debug: print("INFO: args:\n  %s" % PP.pformat(args))
+  sys.path.insert(0, directory) #supposed to be root of a package
+  
+  runOnArgs(args)
+
+
diff --git a/__init__.py b/__init__.py
new file mode 100644 (file)
index 0000000..2646961
--- /dev/null
@@ -0,0 +1 @@
+__all__ = ['src', 'commands', "test", "unittestpy", ]
\ No newline at end of file
diff --git a/commands/__init__.py b/commands/__init__.py
new file mode 100644 (file)
index 0000000..c3aa9d1
--- /dev/null
@@ -0,0 +1,41 @@
+
+"""
+import os
+import gettext
+
+# get path to salomeTools sources
+satdir  = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+srcdir = os.path.join(satdir, 'src')
+cmdsdir = os.path.join(satdir, 'commands')
+
+# load resources for internationalization
+gettext.install("salomeTools", os.path.join(srcdir, "i18n"))
+
+import application
+import check
+import clean
+import compile
+import config
+import configure
+import doc
+import environ
+import find_duplicates
+import generate
+import init
+import job
+import jobs
+import launcher
+import log
+import make
+import makeinstall
+import package
+import patch
+import prepare
+import profile
+import run
+import script
+import shell
+import source
+import template
+import test
+"""
index 547fd9e503c890eca295f12bd46600f36af997ed..4a216d2d6cc7d93f342442d818b654a8cf9d32ef 100644 (file)
@@ -27,7 +27,7 @@ import src
 import src.debug as DBG
 
 # internationalization
-satdir  = os.path.dirname(os.path.realpath(__file__))
+satdir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
 gettext.install('salomeTools', os.path.join(satdir, 'src', 'i18n'))
 
 # Define all possible option for config command :  sat config <options>
@@ -340,6 +340,7 @@ class ConfigManager:
         cfg.addMapping("PATHS", src.pyconf.Mapping(cfg), "The paths\n")
         cfg.PATHS["APPLICATIONPATH"] = src.pyconf.Sequence(cfg.PATHS)
         cfg.PATHS.APPLICATIONPATH.append(cfg.VARS.personal_applications_dir, "")
+
         
         cfg.PATHS["PRODUCTPATH"] = src.pyconf.Sequence(cfg.PATHS)
         cfg.PATHS.PRODUCTPATH.append(cfg.VARS.personal_products_dir, "")
@@ -369,6 +370,11 @@ class ConfigManager:
         for rule in self.get_command_line_overrides(options, ["PATHS"]):
             exec('cfg.' + rule) # this cannot be factorized because of the exec
 
+        # AT END append APPLI_TEST directory in APPLICATIONPATH, for unittest
+        appli_test_dir = os.path.join(satdir, "test", "APPLI_TEST")
+        if appli_test_dir not in cfg.PATHS.APPLICATIONPATH:
+          cfg.PATHS.APPLICATIONPATH.append(appli_test_dir, "unittest APPLI_TEST path")
+
         # =====================================================================
         # Load APPLICATION config file
         if application is not None:
@@ -379,8 +385,8 @@ class ConfigManager:
             try:
                 application_cfg = src.pyconf.Config(application + '.pyconf')
             except IOError as e:
-                raise src.SatException(_("%s, use 'config --list' to get the"
-                                         " list of available applications.") %e)
+                raise src.SatException(
+                   _("%s, use 'config --list' to get the list of available applications.") % e)
             except src.pyconf.ConfigError as e:
                 if (not ('-e' in parser.parse_args()[1]) 
                                          or ('--edit' in parser.parse_args()[1]) 
@@ -882,7 +888,7 @@ def run(args, runner, logger):
                        'open_application' not in runner.cfg): # edit user pyconf
             usercfg = os.path.join(runner.cfg.VARS.personalDir, 
                                    'SAT.pyconf')
-            logger.write(_("Openning %s\n" % usercfg), 3)
+            logger.write(_("Opening %s\n" % usercfg), 3)
             src.system.show_in_editor(editor, usercfg, logger)
         else:
             # search for file <application>.pyconf and open it
@@ -890,7 +896,7 @@ def run(args, runner, logger):
                 pyconf_path = os.path.join(path, 
                                     runner.cfg.VARS.application + ".pyconf")
                 if os.path.exists(pyconf_path):
-                    logger.write(_("Openning %s\n" % pyconf_path), 3)
+                    logger.write(_("Opening %s\n" % pyconf_path), 3)
                     src.system.show_in_editor(editor, pyconf_path, logger)
                     break
     
index 0fc1fb34d4c6477f28a56c00b55ef12059b4a73a..4ffd3a0be9aef8090ba726a25cd8ea55fdec8f1d 100644 (file)
@@ -21,7 +21,7 @@ import src
 
 # Define all possible option for log command :  sat doc <options>
 parser = src.options.Options()
-parser.add_option('h', 'html', 'boolean', 'html', "Open sat html documentation in browser", None)
+parser.add_option('x', 'xml', 'boolean', 'xml', "Open sat xml/html documentation in browser (x as firefoX)", None)
 parser.add_option('p', 'pdf', 'boolean', 'pdf', "Open sat pdf documentation in viewer", False)
 parser.add_option('e', 'edit', 'boolean', 'edit', "edit/modify source dodumentation rst files", False)
 parser.add_option('c', 'compile', 'boolean', 'compile', "how to compile html/pdf doc", False)
@@ -33,12 +33,13 @@ def description():
     :rtype: str
     """
     return _("""\
-    Gives access to the sat documentation.
+The doc command gives access to the sat documentation.
     
-    example:
-    >> sat doc         # --html as default
-    >> sat doc --html
-    >> sat doc --pdf""")
+example:
+>> sat doc         # --xml as default
+>> sat doc --xml
+>> sat doc --pdf
+""")
 
 def run(args, runner, logger):
     '''method that is called when salomeTools is called with log parameter.
@@ -58,7 +59,7 @@ def run(args, runner, logger):
     logger.write("docdir %s\n" % docDir, 6)
     logger.write("options %s\n" % options, 6)
 
-    if options.html:
+    if options.xml:
         src.system.show_in_editor(runner.cfg.USER.browser, htmlFile, logger)
     if options.pdf:
         src.system.show_in_editor(runner.cfg.USER.pdf_viewer, pdfFile, logger)
index 03325576c40fea486332e4d7390a8e10ec140f5e..5a35eb4ff2d8e4bfe9b67b06eb6560bac9c45665 100644 (file)
@@ -120,7 +120,7 @@ def description():
     :return: The text to display for the init command description.
     :rtype: str
     '''
-    return _("Changes the local settings of SAT.")
+    return _("The init command Changes the local settings of SAT.")
   
 def run(args, runner, logger):
     '''method that is called when salomeTools is called with init parameter.
index cca442d56c1d2d30f605bd032aa26b26a4237da2..f5805feaa557dcaf65007cdf09ed75c8a5f1ef6d 100644 (file)
@@ -19,7 +19,7 @@
 import os
 
 import src
-import salomeTools
+import src.salomeTools
 
 # Define all possible option for the make command :  sat make <options>
 parser = src.options.Options()
@@ -35,9 +35,12 @@ def description():
     :return: The text to display for the job command description.
     :rtype: str
     '''
-    return _("Executes the commands of the job defined"
-             " in the jobs configuration file\n\nexample:\nsat job "
-             "--jobs_config my_jobs --name my_job")
+    return _("""\
+The job command executes the commands of the job defined in the jobs configuration file
+
+example:
+>> sat job --jobs_config my_jobs --name my_job
+""")
   
 def run(args, runner, logger):
     '''method that is called when salomeTools is called with job parameter.
@@ -114,7 +117,7 @@ def run(args, runner, logger):
         cmd_exe = command.split(" ")[0] # first part
         if cmd_exe == "sat":
             # use the salomeTools parser to get the options of the command
-            sat_parser = salomeTools.parser
+            sat_parser = src.salomeTools.parser
             input_parser = src.remove_item_from_list(command.split(' ')[1:], "")
             (options, argus) = sat_parser.parse_args(input_parser)
             # Verify if there is a changed option
index 3d6540e6cd0bbec69645ec9f42fed1d6cc4150c1..6c9b230400d619f4bd95cfb1f645c8b3a0656d4d 100644 (file)
@@ -26,7 +26,13 @@ import csv
 import shutil
 import itertools
 import re
-import paramiko
+
+# generate problem
+try:
+  import paramiko
+except:
+  paramiko = "import paramiko impossible"
+  pass
 
 import src
 import src.ElementTree as etree
index 01164bf5033bebb5c5ff8e6c350ffa28afcc6083..d8def14303da1197ca3abf5f33a2a00c8714a310 100644 (file)
@@ -193,8 +193,12 @@ def description():
     :return: The text to display for the log command description.
     :rtype: str
     '''
-    return _("Gives access to the logs produced by the salomeTools commands.\n"
-             "\nexample:\nsat log")    
+    return _("""\
+The log command gives access to the logs produced by the salomeTools commands.
+
+example:
+>> sat log
+""")
 
 def run(args, runner, logger):
     '''method that is called when salomeTools is called with log parameter.
index a41c6a4bd9667648c4c8d4e8ee7ba19a4e14ac33..40914e4dbe2a302794e51212054431dc8ccfe31a 100644 (file)
@@ -1458,7 +1458,7 @@ Please add it in file:
       shutil.rmtree(tmp_local_working_dir)
 
     # to decide...
-    DBG.tofix("make shutil.rmtree(%s) effective" % tmp_working_dir, "", True)   
+    DBG.tofix("make shutil.rmtree('%s') effective" % tmp_working_dir, "", True)
     
     # Print again the path of the package
     logger.write("\n", 2)
index fa08cb930f3ede395d0f35a108c2c801ae5b312d..c6138e5087e18db34ab8fb1fbb3021dc15102e87 100644 (file)
@@ -21,6 +21,9 @@ import subprocess
 
 import src
 
+# Define all possible option for log command :  sat run <options>
+parser = src.options.Options()
+# no option more than -h as generic default
 
 def description():
     '''method that is called when salomeTools is called with --help option.
@@ -28,8 +31,12 @@ def description():
     :return: The text to display for the run command description.
     :rtype: str
     '''
-    return _("This command runs the application launcher"
-             " with the given arguments.\n\nexample:\nsat run SALOME-master")
+    return _("""\
+The run command runs the application launcher with the given arguments.
+
+example:
+>> sat run SALOME-master
+""")
 
 def run(args, runner, logger):
     '''method that is called when salomeTools is called with run parameter.
index e01d32b7802f690f259b4a7384871ed6a565c2a1..c2139755c3b373d66b2a1ab64b1a4be4cc03dee2 100644 (file)
@@ -31,8 +31,11 @@ def description():
     :return: The text to display for the shell command description.
     :rtype: str
     '''
-    return _("Executes the shell command passed as argument.\n\nexample:"
-             "\nsat shell --command \"ls \\-l /tmp\"")
+    return _("""\
+The shell command executes the shell commands passed as argument.
+
+example:
+>> sat shell --command "ls -l /tmp" """)
   
 def run(args, runner, logger):
     '''method that is called when salomeTools is called with shell parameter.
diff --git a/data/local_original.pyconf b/data/local_original.pyconf
new file mode 100644 (file)
index 0000000..7755af0
--- /dev/null
@@ -0,0 +1,16 @@
+
+  LOCAL :
+  {
+    base : 'default'
+    workdir : 'default'
+    log_dir : 'default'
+    archive_dir : 'default'
+    VCS : None
+    tag : None
+  }
+  PROJECTS :
+  {
+    project_file_paths :
+    [
+    ]
+  }
diff --git a/data/local_wambeke_cea.pyconf b/data/local_wambeke_cea.pyconf
new file mode 100644 (file)
index 0000000..e62c609
--- /dev/null
@@ -0,0 +1,21 @@
+
+  LOCAL :
+  {
+    base : 'default'
+    workdir : 'default'
+    log_dir : 'default'
+    archive_dir : 'default'
+    VCS : None
+    tag : None
+  }
+  PROJECTS :
+  {
+    project_file_paths :
+    [
+    "/volatile/wambeke/SAT5/SAT5_S840_MATIX24/SAT_SALOME/salome.pyconf",
+    # "/home/uranietm/proJET/saTJOBS/saT5/uranie.pyconf",
+    # cloned 2017/12 for matix 
+    # "/home/matix/GitRepo/uranie/saT5/uranie.pyconf",
+    # "/volatile/wambeke/SAT5/SAT_MATIX/matix.pyconf"
+    ]
+  }
diff --git a/data/local_wambeke_home.pyconf b/data/local_wambeke_home.pyconf
new file mode 100644 (file)
index 0000000..c91da53
--- /dev/null
@@ -0,0 +1,18 @@
+
+  LOCAL :
+  {
+    base : 'default'
+    workdir : 'default'
+    log_dir : 'default'
+    archive_dir : 'default'
+    VCS : None
+    tag : None
+  }
+  PROJECTS :
+  {
+    project_file_paths :
+    [
+    "/home/christian/SAT_SALOME/salome.pyconf"
+    "/home/christian/SAT_MATIX/matix.pyconf"
+    ]
+  }
index 7297f92a10974d824da0fb81c16e8b27d3646d89..f4ed64ecfb25a62b2d4ded514aa7a2c3b8b7c60c 100644 (file)
Binary files a/doc/build/doctrees/commands/apidoc/src.doctree and b/doc/build/doctrees/commands/apidoc/src.doctree differ
index c0dd8704cd6e6a41a90d3ca46ad63f730ef40299..9e1bad5b8cffee02ee308b6f30c099fe2ebe2dc0 100644 (file)
Binary files a/doc/build/doctrees/commands/doc.doctree and b/doc/build/doctrees/commands/doc.doctree differ
index 8527f47af134dcefbe0f2c848e2197fefae27ba2..91b6c824d025cf8d343136f35056685bee6131ce 100644 (file)
Binary files a/doc/build/doctrees/commands/generate.doctree and b/doc/build/doctrees/commands/generate.doctree differ
index 4f13c70b5a5d8e1cbe9542cac7f0f66b01fe5672..8ecb325ab50cd77e94509a384b4db86592e801d9 100644 (file)
Binary files a/doc/build/doctrees/environment.pickle and b/doc/build/doctrees/environment.pickle differ
index c12cdee3123ded77d8d7f86c76bc4cdb632fdd1c..bc6543bff5ccdae6a2dfcdec2197ec8061c82abf 100644 (file)
Binary files a/doc/build/doctrees/index.doctree and b/doc/build/doctrees/index.doctree differ
index d54195a146332a86022c76649244411b5ef52153..cd0ed9ecd02620d795c495770fd5684b832f7b08 100644 (file)
 <span class="c1">#  License along with this library; if not, write to the Free Software</span>
 <span class="c1">#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA</span>
 
-<span class="sd">&quot;&quot;&quot;\</span>
-<span class="sd">This file assume DEBUG functionalities use</span>
-
-<span class="sd">- print debug messages in sys.stderr for salomeTools</span>
-<span class="sd">- show pretty print debug representation from instances of SAT classes</span>
-<span class="sd">  (pretty print src.pyconf.Config), and python dict/list etc. (as &#39;aVariable&#39;)</span>
-
-<span class="sd">WARNING: obviously supposedly show messages in SAT development phase, not production</span>
-
-<span class="sd">usage:</span>
-<span class="sd">&gt;&gt; import debug as DBG</span>
-<span class="sd">&gt;&gt; DBG.write(&quot;aTitle&quot;, aVariable)        # not shown in production </span>
-<span class="sd">&gt;&gt; DBG.write(&quot;aTitle&quot;, aVariable, True)  # unconditionaly shown (as show=True)</span>
-
-<span class="sd">to set show message as development phase:</span>
-<span class="sd">&gt;&gt; DBG.push_debug(True)</span>
-
-<span class="sd">to set no show message as production phase:</span>
-<span class="sd">&gt;&gt; DBG.push_debug(False)</span>
-
-<span class="sd">to set show message temporary as development phase, only in a method:</span>
-<span class="sd">&gt;&gt; def aMethodToDebug(...):</span>
-<span class="sd">&gt;&gt;   DBG.push_debug(True)              #force show as appended status</span>
-<span class="sd">&gt;&gt;   etc. method code with some DBG.write()</span>
-<span class="sd">&gt;&gt;   DBG.pop_debug()                   #restore previous status (show or not show)</span>
-<span class="sd">&gt;&gt;   return</span>
-
-<span class="sd">to set a message for future fix, as temporary problem to not forget:</span>
-<span class="sd">DBG.tofix(&quot;aTitle&quot;, aVariable, True/False) #True/False in production shown, or not</span>
-
-<span class="sd">in command line interface you could redirect stderr to file &#39;myDebug.log&#39;:</span>
-<span class="sd">&gt;&gt; sat compile ... 2&gt; myDebug.log   # only stderr</span>
-<span class="sd">&gt;&gt; sat compile ... &amp;&gt; myDebug.log   # stdout and stderr</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This file assume DEBUG functionalities use.</span>
+<span class="sd">Print salomeTools debug messages in sys.stderr.</span>
+<span class="sd">Show pretty print debug representation from instances of SAT classes </span>
+<span class="sd">(pretty print src.pyconf.Config)</span>
+
+<span class="sd">| Warning: supposedly show messages in SAT development phase, not production</span>
+<span class="sd">| </span>
+<span class="sd">| Usage:</span>
+<span class="sd">| &gt;&gt; import debug as DBG</span>
+<span class="sd">| &gt;&gt; DBG.write(&quot;aTitle&quot;, aVariable)        # not shown in production </span>
+<span class="sd">| &gt;&gt; DBG.write(&quot;aTitle&quot;, aVariable, True)  # unconditionaly shown (as show=True)</span>
+<span class="sd">| </span>
+<span class="sd">| to set show message as development phase:</span>
+<span class="sd">| &gt;&gt; DBG.push_debug(True)</span>
+<span class="sd">| </span>
+<span class="sd">| to set no show message as production phase:</span>
+<span class="sd">| &gt;&gt; DBG.push_debug(False)</span>
+<span class="sd">| </span>
+<span class="sd">| to set show message temporary as development phase, only in a method:</span>
+<span class="sd">| &gt;&gt; def aMethodToDebug(...):</span>
+<span class="sd">| &gt;&gt;   DBG.push_debug(True)              #force show as appended status</span>
+<span class="sd">| &gt;&gt;   etc. method code with some DBG.write()</span>
+<span class="sd">| &gt;&gt;   DBG.pop_debug()                   #restore previous status (show or not show)</span>
+<span class="sd">| &gt;&gt;   return</span>
+<span class="sd">| </span>
+<span class="sd">| to set a message for future fix, as temporary problem to not forget:</span>
+<span class="sd">| DBG.tofix(&quot;aTitle&quot;, aVariable, True/False) #True/False in production shown, or not</span>
+<span class="sd">| </span>
+<span class="sd">| in command line interface you could redirect stderr to file &#39;myDebug.log&#39;:</span>
+<span class="sd">| &gt;&gt; sat compile ... 2&gt; myDebug.log   # only stderr</span>
+<span class="sd">| &gt;&gt; sat compile ... &amp;&gt; myDebug.log   # stdout and stderr</span>
 <span class="sd">&quot;&quot;&quot;</span>
 
 <span class="kn">import</span> <span class="nn">os</span>
 <span class="kn">import</span> <span class="nn">sys</span>
+<span class="kn">import</span> <span class="nn">traceback</span>
 <span class="kn">import</span> <span class="nn">StringIO</span> <span class="k">as</span> <span class="nn">SIO</span>
 <span class="kn">import</span> <span class="nn">pprint</span> <span class="k">as</span> <span class="nn">PP</span>
 
 <span class="n">_debug</span> <span class="o">=</span> <span class="p">[</span><span class="kc">False</span><span class="p">]</span> <span class="c1">#support push/pop for temporary activate debug outputs</span>
 
+<span class="n">_user</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;USER&#39;</span><span class="p">]</span>
+<span class="c1"># wambeke is christian at home</span>
+<span class="n">_developpers</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;christian&quot;</span><span class="p">,</span> <span class="s2">&quot;wambeke&quot;</span><span class="p">,</span> <span class="s2">&quot;crouzet&quot;</span><span class="p">]</span> <span class="c1"># crouzet, kloss ...</span>
+
+
 <div class="viewcode-block" id="indent"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.indent">[docs]</a><span class="k">def</span> <span class="nf">indent</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">amount</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">ch</span><span class="o">=</span><span class="s1">&#39; &#39;</span><span class="p">):</span>
     <span class="sd">&quot;&quot;&quot;indent multi lines message&quot;&quot;&quot;</span>
     <span class="n">padding</span> <span class="o">=</span> <span class="n">amount</span> <span class="o">*</span> <span class="n">ch</span>
     <span class="k">return</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">padding</span> <span class="o">+</span> <span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">text</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="kc">True</span><span class="p">))</span></div>
 
+<div class="viewcode-block" id="isTypeConfig"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.isTypeConfig">[docs]</a><span class="k">def</span> <span class="nf">isTypeConfig</span><span class="p">(</span><span class="n">var</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;To know if var is instance from Config/pyconf&quot;&quot;&quot;</span>
+    <span class="n">typ</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">var</span><span class="p">))</span>
+    <span class="c1"># print &quot;isTypeConfig&quot; ,type, dir(var)</span>
+    <span class="k">if</span> <span class="s2">&quot;.pyconf.Config&quot;</span> <span class="ow">in</span> <span class="n">typ</span><span class="p">:</span> <span class="k">return</span> <span class="kc">True</span>
+    <span class="k">if</span> <span class="s2">&quot;.pyconf.Mapping&quot;</span> <span class="ow">in</span> <span class="n">typ</span><span class="p">:</span> <span class="k">return</span> <span class="kc">True</span>
+    <span class="k">if</span> <span class="s2">&quot;.pyconf.Sequence&quot;</span> <span class="ow">in</span> <span class="n">typ</span><span class="p">:</span> <span class="k">return</span> <span class="kc">True</span>
+    <span class="c1"># print &quot;NOT isTypeConfig %s&quot; % typ</span>
+    <span class="k">return</span> <span class="kc">False</span></div>
+    
 <div class="viewcode-block" id="write"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.write">[docs]</a><span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">var</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">force</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">#### DEBUG: </span><span class="si">%s</span><span class="s2">:</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">):</span>
     <span class="sd">&quot;&quot;&quot;write sys.stderr a message if _debug[-1]==True or optionaly force=True&quot;&quot;&quot;</span>
     <span class="k">if</span> <span class="n">_debug</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">or</span> <span class="n">force</span><span class="p">:</span>
-        <span class="k">if</span> <span class="s1">&#39;src.pyconf.&#39;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">var</span><span class="p">)):</span> 
-            <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fmt</span> <span class="o">%</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">indent</span><span class="p">(</span><span class="n">getStrConfigDbg</span><span class="p">(</span><span class="n">var</span><span class="p">))))</span>
-        <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">var</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">str</span><span class="p">:</span>
-            <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fmt</span> <span class="o">%</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">indent</span><span class="p">(</span><span class="n">PP</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">var</span><span class="p">))))</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fmt</span> <span class="o">%</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">indent</span><span class="p">(</span><span class="n">var</span><span class="p">)))</span>
+      <span class="n">tvar</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
+      <span class="n">typ</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">tvar</span><span class="p">)</span>
+      <span class="k">if</span> <span class="n">isTypeConfig</span><span class="p">(</span><span class="n">var</span><span class="p">):</span>
+        <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fmt</span> <span class="o">%</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">indent</span><span class="p">(</span><span class="n">COLS</span><span class="o">.</span><span class="n">toColor</span><span class="p">(</span><span class="n">getStrConfigDbg</span><span class="p">(</span><span class="n">var</span><span class="p">)))))</span>
+        <span class="k">return</span>
+      <span class="k">if</span> <span class="s1">&#39;UnittestStream&#39;</span> <span class="ow">in</span> <span class="n">typ</span><span class="p">:</span>
+        <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fmt</span> <span class="o">%</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">indent</span><span class="p">(</span><span class="n">var</span><span class="o">.</span><span class="n">getLogs</span><span class="p">())))</span>
+        <span class="k">return</span>  
+      <span class="k">if</span> <span class="n">tvar</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">str</span> <span class="ow">and</span> <span class="n">tvar</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">unicode</span><span class="p">:</span>
+        <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fmt</span> <span class="o">%</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">indent</span><span class="p">(</span><span class="n">PP</span><span class="o">.</span><span class="n">pformat</span><span class="p">(</span><span class="n">var</span><span class="p">))))</span>
+        <span class="k">return</span>
+      <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">fmt</span> <span class="o">%</span> <span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">indent</span><span class="p">(</span><span class="n">var</span><span class="p">)))</span>
+      <span class="k">return</span>
     <span class="k">return</span></div>
 
 <div class="viewcode-block" id="tofix"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.tofix">[docs]</a><span class="k">def</span> <span class="nf">tofix</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">var</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="n">force</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
-    <span class="sd">&quot;&quot;&quot;\</span>
+    <span class="sd">&quot;&quot;&quot;</span>
 <span class="sd">    write sys.stderr a message if _debug[-1]==True or optionaly force=True</span>
-<span class="sd">    use this only if no logger accessible for classic </span>
-<span class="sd">    logger.warning(message) or logger.debug(message)</span>
+<span class="sd">    use this only if no logger accessible for classic logger.warning(message)</span>
 <span class="sd">    &quot;&quot;&quot;</span>
     <span class="n">fmt</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">#### TOFIX: </span><span class="si">%s</span><span class="s2">:</span><span class="se">\n</span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span>
     <span class="n">write</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">force</span><span class="p">,</span> <span class="n">fmt</span><span class="p">)</span></div>
         <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">ERROR: pop_debug: too much pop.&quot;</span><span class="p">)</span>
         <span class="k">return</span> <span class="kc">None</span></div>
 
+
+<div class="viewcode-block" id="format_exception"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.format_exception">[docs]</a><span class="k">def</span> <span class="nf">format_exception</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">trace</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Format a stack trace and the exception information.</span>
+<span class="sd">  as traceback.format_exception(), without color</span>
+<span class="sd">  with traceback only if (_debug) or (DBG._user in DBG._developpers)</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">etype</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
+  <span class="k">if</span> <span class="p">(</span><span class="n">_debug</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="ow">or</span> <span class="p">(</span><span class="n">_user</span> <span class="ow">in</span> <span class="n">_developpers</span><span class="p">):</span>
+    <span class="n">res</span> <span class="o">=</span> <span class="n">msg</span>
+    <span class="k">if</span> <span class="n">tb</span><span class="p">:</span>
+      <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Traceback (most recent call last):</span><span class="se">\n</span><span class="s2">&quot;</span>
+      <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_tb</span><span class="p">(</span><span class="n">tb</span><span class="p">,</span> <span class="n">limit</span><span class="p">))</span>  <span class="c1"># [:-1])</span>
+    <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span>
+    <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception_only</span><span class="p">(</span><span class="n">etype</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
+    <span class="k">return</span> <span class="n">res</span>
+  <span class="k">else</span><span class="p">:</span>
+    <span class="n">res</span> <span class="o">=</span> <span class="n">msg</span>
+    <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception_only</span><span class="p">(</span><span class="n">etype</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
+    <span class="k">return</span> <span class="n">res</span></div>
+
+<div class="viewcode-block" id="format_color_exception"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.format_color_exception">[docs]</a><span class="k">def</span> <span class="nf">format_color_exception</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">trace</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">  Format a stack trace and the exception information.</span>
+<span class="sd">  as traceback.format_exception(), with color</span>
+<span class="sd">  with traceback only if (_debug) or (DBG._user in DBG._developpers)</span>
+<span class="sd">  &quot;&quot;&quot;</span>
+  <span class="n">etype</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()</span>
+  <span class="k">if</span> <span class="p">(</span><span class="n">_debug</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="ow">or</span> <span class="p">(</span><span class="n">_user</span> <span class="ow">in</span> <span class="n">_developpers</span><span class="p">):</span>
+    <span class="n">res</span> <span class="o">=</span> <span class="s2">&quot;&lt;red&gt;&quot;</span> <span class="o">+</span> <span class="n">msg</span>
+    <span class="k">if</span> <span class="n">tb</span><span class="p">:</span>
+      <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;&lt;yellow&gt;</span><span class="se">\n</span><span class="s2">Traceback (most recent call last):</span><span class="se">\n</span><span class="s2">&quot;</span>
+      <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_tb</span><span class="p">(</span><span class="n">tb</span><span class="p">,</span> <span class="n">limit</span><span class="p">))</span>  <span class="c1"># [:-1])</span>
+    <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&lt;red&gt;&quot;</span>
+    <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception_only</span><span class="p">(</span><span class="n">etype</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
+    <span class="k">return</span> <span class="n">res</span> <span class="o">+</span> <span class="s2">&quot;&lt;reset&gt;&quot;</span>
+  <span class="k">else</span><span class="p">:</span>
+    <span class="n">res</span> <span class="o">=</span> <span class="s2">&quot;&lt;red&gt;&quot;</span> <span class="o">+</span> <span class="n">msg</span>  <span class="c1"># + &quot;&lt;bright&gt;&quot;</span>
+    <span class="n">res</span> <span class="o">+=</span> <span class="s2">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">traceback</span><span class="o">.</span><span class="n">format_exception_only</span><span class="p">(</span><span class="n">etype</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
+    <span class="k">return</span> <span class="n">res</span> <span class="o">+</span> <span class="s2">&quot;&lt;reset&gt;&quot;</span></div>
+
+
 <span class="c1">###############################################</span>
 <span class="c1"># utilitaires divers pour debug</span>
 <span class="c1">###############################################</span>
 
 <div class="viewcode-block" id="OutStream"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.OutStream">[docs]</a><span class="k">class</span> <span class="nc">OutStream</span><span class="p">(</span><span class="n">SIO</span><span class="o">.</span><span class="n">StringIO</span><span class="p">):</span>
-    <span class="sd">&quot;&quot;&quot;utility class for pyconf.Config output iostream&quot;&quot;&quot;</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    utility class for pyconf.Config output iostream</span>
+<span class="sd">    &quot;&quot;&quot;</span>
 <div class="viewcode-block" id="OutStream.close"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.OutStream.close">[docs]</a>    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-      <span class="sd">&quot;&quot;&quot;because Config.__save__ calls close() stream as file</span>
+      <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">      because Config.__save__ calls close() stream as file</span>
 <span class="sd">      keep value before lost as self.value</span>
 <span class="sd">      &quot;&quot;&quot;</span>
       <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
     <span class="k">return</span> <span class="n">outStream</span><span class="o">.</span><span class="n">value</span></div>
 
 <div class="viewcode-block" id="getStrConfigDbg"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.getStrConfigDbg">[docs]</a><span class="k">def</span> <span class="nf">getStrConfigDbg</span><span class="p">(</span><span class="n">config</span><span class="p">):</span>
-    <span class="sd">&quot;&quot;&quot;\</span>
+    <span class="sd">&quot;&quot;&quot;</span>
 <span class="sd">    set string as saveConfigDbg, </span>
 <span class="sd">    as (path expression evaluation) for debug</span>
 <span class="sd">    &quot;&quot;&quot;</span>
 
 <div class="viewcode-block" id="saveConfigDbg"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.debug.saveConfigDbg">[docs]</a><span class="k">def</span> <span class="nf">saveConfigDbg</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
     <span class="sd">&quot;&quot;&quot;pyconf returns multilines (path expression evaluation) for debug&quot;&quot;&quot;</span>
-    <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span>
+    <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
     <span class="n">aStream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="c1"># as config.__save__()</span></div>
 
-<span class="k">def</span> <span class="nf">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
+<span class="k">def</span> <span class="nf">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">nb</span><span class="p">):</span>
     <span class="sd">&quot;&quot;&quot;pyconf inspired from Mapping.__save__&quot;&quot;&quot;</span>
     <span class="n">debug</span> <span class="o">=</span> <span class="kc">False</span>
+    <span class="n">nbp</span> <span class="o">=</span> <span class="n">nb</span> <span class="o">+</span> <span class="mi">1</span> <span class="c1"># depth recursive</span>
     <span class="k">if</span> <span class="n">indent</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span> 
       <span class="n">indentp</span> <span class="o">=</span> <span class="mi">0</span>
     <span class="k">else</span><span class="p">:</span>
-      <span class="n">indentp</span> <span class="o">=</span> <span class="n">indentp</span> <span class="o">+</span> <span class="mi">2</span>
+      <span class="n">indentp</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">+</span> <span class="mi">2</span>
+      
+    <span class="k">if</span> <span class="n">nbp</span> <span class="o">&gt;</span> <span class="mi">10</span><span class="p">:</span> <span class="c1"># protection</span>
+      <span class="c1"># raise Exception(&quot;!!! ERROR: Circular reference after %s&quot; % aStream.getvalue())</span>
+      <span class="c1"># raise Exception(&quot;!!! ERROR: Circular reference %s&quot; % path)</span>
+      <span class="n">aStream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;&lt;red&gt;!!! ERROR: Circular reference after </span><span class="si">%s</span><span class="s2">&lt;reset&gt;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">path</span><span class="p">)</span>
+      <span class="k">return</span>
+    
     <span class="n">indstr</span> <span class="o">=</span> <span class="n">indent</span> <span class="o">*</span> <span class="s1">&#39; &#39;</span> <span class="c1"># &#39;&#39;:no indent, &#39; &#39;:indent</span>
     <span class="n">strType</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">config</span><span class="p">))</span>
+    <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="nb">print</span> <span class="s2">&quot;saveDbg Type&quot;</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">strType</span>
+    
     <span class="k">if</span> <span class="s2">&quot;Sequence&quot;</span> <span class="ow">in</span> <span class="n">strType</span><span class="p">:</span>
       <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">config</span><span class="p">)):</span>
-        <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">config</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indentp</span><span class="p">,</span> <span class="n">path</span><span class="o">+</span><span class="s2">&quot;[</span><span class="si">%i</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="n">i</span><span class="p">)</span>
+        <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">config</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indentp</span><span class="p">,</span> <span class="n">path</span><span class="o">+</span><span class="s2">&quot;[</span><span class="si">%i</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="n">i</span><span class="p">,</span> <span class="n">nbp</span><span class="p">)</span>
       <span class="k">return</span>
-    <span class="k">try</span><span class="p">:</span> 
+    <span class="sd">&#39;&#39;&#39;</span>
+<span class="sd">    if &quot;Reference&quot; in strType:</span>
+<span class="sd">      try:</span>
+<span class="sd">        #evaluate = value.resolve(config)</span>
+<span class="sd">        aStream.write(&quot;&lt;header&gt;%s%s&lt;reset&gt; : %s &lt;yellow&gt;--&gt; &#39;%s&#39;&lt;reset&gt;\n&quot; % (indstr, path, config, str(config)))</span>
+<span class="sd">      except Exception as e:  </span>
+<span class="sd">        aStream.write(&quot;&lt;header&gt;%s%s&lt;reset&gt; : &lt;red&gt;!!! ERROR: %s !!!&lt;reset&gt;\n&quot; % (indstr, path, e.message))     </span>
+<span class="sd">      return</span>
+<span class="sd">    &#39;&#39;&#39;</span>
+    
+    <span class="k">try</span><span class="p">:</span> <span class="c1">#type config, mapping</span>
       <span class="n">order</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="s1">&#39;order&#39;</span><span class="p">)</span>
       <span class="n">data</span> <span class="o">=</span> <span class="nb">object</span><span class="o">.</span><span class="fm">__getattribute__</span><span class="p">(</span><span class="n">config</span><span class="p">,</span> <span class="s1">&#39;data&#39;</span><span class="p">)</span>
     <span class="k">except</span><span class="p">:</span>
       <span class="n">aStream</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%s%s</span><span class="s2"> : &#39;</span><span class="si">%s</span><span class="s2">&#39;</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indstr</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">config</span><span class="p">)))</span>
       <span class="k">return</span>     
-    <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">order</span><span class="p">):</span>
+    <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">data</span><span class="p">):</span> <span class="c1">#order): # data as sort alphabetical, order as initial order</span>
       <span class="n">value</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
       <span class="n">strType</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
-      <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="nb">print</span> <span class="n">indstr</span> <span class="o">+</span> <span class="s1">&#39;strType = </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">strType</span><span class="p">,</span> <span class="n">key</span>
+      <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="nb">print</span> <span class="s1">&#39;strType&#39;</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">strType</span>
       <span class="k">if</span> <span class="s2">&quot;Config&quot;</span> <span class="ow">in</span> <span class="n">strType</span><span class="p">:</span>
-        <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indentp</span><span class="p">,</span> <span class="n">path</span><span class="o">+</span><span class="s2">&quot;.&quot;</span><span class="o">+</span><span class="n">key</span><span class="p">)</span>
+        <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indentp</span><span class="p">,</span> <span class="n">path</span><span class="o">+</span><span class="s2">&quot;.&quot;</span><span class="o">+</span><span class="n">key</span><span class="p">,</span> <span class="n">nbp</span><span class="p">)</span>
         <span class="k">continue</span>
       <span class="k">if</span> <span class="s2">&quot;Mapping&quot;</span> <span class="ow">in</span> <span class="n">strType</span><span class="p">:</span>
-        <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indentp</span><span class="p">,</span> <span class="n">path</span><span class="o">+</span><span class="s2">&quot;.&quot;</span><span class="o">+</span><span class="n">key</span><span class="p">)</span>
+        <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indentp</span><span class="p">,</span> <span class="n">path</span><span class="o">+</span><span class="s2">&quot;.&quot;</span><span class="o">+</span><span class="n">key</span><span class="p">,</span> <span class="n">nbp</span><span class="p">)</span>
         <span class="k">continue</span>
       <span class="k">if</span> <span class="s2">&quot;Sequence&quot;</span> <span class="ow">in</span> <span class="n">strType</span><span class="p">:</span>
         <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)):</span>
-          <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indentp</span><span class="p">,</span> <span class="n">path</span><span class="o">+</span><span class="s2">&quot;.&quot;</span><span class="o">+</span><span class="n">key</span><span class="o">+</span><span class="s2">&quot;[</span><span class="si">%i</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="n">i</span><span class="p">)</span>
+          <span class="n">_saveConfigRecursiveDbg</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">aStream</span><span class="p">,</span> <span class="n">indentp</span><span class="p">,</span> <span class="n">path</span><span class="o">+</span><span class="s2">&quot;.&quot;</span><span class="o">+</span><span class="n">key</span><span class="o">+</span><span class="s2">&quot;[</span><span class="si">%i</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="n">i</span><span class="p">,</span> <span class="n">nbp</span><span class="p">)</span>
         <span class="k">continue</span>
       <span class="k">if</span> <span class="s2">&quot;Expression&quot;</span> <span class="ow">in</span> <span class="n">strType</span><span class="p">:</span>
         <span class="k">try</span><span class="p">:</span>
index 6665d59789c034ce49b8a5e3f9c4ca56fa7fc0d1..b0678faa174cfcd09fcb551fbdd69b11eb82068a 100644 (file)
 <span class="kn">import</span> <span class="nn">tempfile</span>
 
 <span class="kn">import</span> <span class="nn">src</span>
-<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">printcolors</span>
-<span class="kn">from</span> <span class="nn">.</span> <span class="k">import</span> <span class="n">xmlManager</span>
+<span class="kn">import</span> <span class="nn">printcolors</span>
+<span class="kn">import</span> <span class="nn">xmlManager</span>
+
+<span class="kn">import</span> <span class="nn">src.debug</span> <span class="k">as</span> <span class="nn">DBG</span>
 
 <span class="n">log_macro_command_file_expression</span> <span class="o">=</span> <span class="s2">&quot;^[0-9]</span><span class="si">{8}</span><span class="s2">_+[0-9]</span><span class="si">{6}</span><span class="s2">_+.*\.xml$&quot;</span>
 <span class="n">log_all_command_file_expression</span> <span class="o">=</span> <span class="s2">&quot;^.*[0-9]</span><span class="si">{8}</span><span class="s2">_+[0-9]</span><span class="si">{6}</span><span class="s2">_+.*\.xml$&quot;</span>
@@ -71,7 +73,7 @@
 <span class="sd">    Class to handle log mechanism.</span>
 <span class="sd">    &quot;&quot;&quot;</span>
     <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
-                 <span class="n">config</span><span class="p">,</span>
+                 <span class="n">config</span><span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
                  <span class="n">silent_sysstd</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
                  <span class="n">all_in_terminal</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
                  <span class="n">micro_command</span> <span class="o">=</span> <span class="kc">False</span><span class="p">):</span>
@@ -81,6 +83,7 @@
 <span class="sd">        :param silent_sysstd boolean: if True, do not write anything</span>
 <span class="sd">                                      in terminal.</span>
 <span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">DBG</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;src.logger.Logger&quot;</span><span class="p">,</span> <span class="nb">id</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">config</span> <span class="o">=</span> <span class="n">config</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">default_level</span> <span class="o">=</span> <span class="mi">3</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">silentSysStd</span> <span class="o">=</span> <span class="n">silent_sysstd</span>
 <span class="sd">                          to the message 0 &lt; level &lt; 6.</span>
 <span class="sd">        :param screenOnly boolean: if True, do not write in log file.</span>
 <span class="sd">        &quot;&quot;&quot;</span>
+        <span class="c1"># avoid traces if unittest</span>
+        <span class="k">if</span> <span class="n">isCurrentLoggerUnittest</span><span class="p">():</span>
+            <span class="c1"># print(&quot;doing unittest&quot;)</span>
+            <span class="n">sendMessageToCurrentLogger</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">level</span><span class="p">)</span>
+            <span class="k">return</span>
+
         <span class="c1"># do not write message starting with \r to log file</span>
         <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\r</span><span class="s2">&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">screenOnly</span><span class="p">:</span>
             <span class="bp">self</span><span class="o">.</span><span class="n">xmlFile</span><span class="o">.</span><span class="n">append_node_text</span><span class="p">(</span><span class="s2">&quot;Log&quot;</span><span class="p">,</span> 
     
     <span class="c1"># Write the file on the hard drive</span>
     <span class="n">xmlHat</span><span class="o">.</span><span class="n">write_tree</span><span class="p">(</span><span class="s1">&#39;hat.xsl&#39;</span><span class="p">)</span></div>
+
+
+<span class="c1"># TODO for future</span>
+<span class="c1"># prepare skip to logging logger sat5.1</span>
+<span class="c1"># suppose only one logger in sat5.1</span>
+<span class="n">_currentLogger</span> <span class="o">=</span> <span class="p">[]</span>
+
+<div class="viewcode-block" id="getCurrentLogger"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.logger.getCurrentLogger">[docs]</a><span class="k">def</span> <span class="nf">getCurrentLogger</span><span class="p">():</span>
+  <span class="sd">&quot;&quot;&quot;get current logging logger, set as DefaultLogger if not set yet&quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">_currentLogger</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+    <span class="kn">import</span> <span class="nn">src.loggingSimple</span> <span class="k">as</span> <span class="nn">LOGSI</span>
+    <span class="n">logger</span> <span class="o">=</span> <span class="n">LOGSI</span><span class="o">.</span><span class="n">getDefaultLogger</span><span class="p">()</span>
+    <span class="n">_currentLogger</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;set by default current logger as </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">logger</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+  <span class="k">return</span> <span class="n">_currentLogger</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
+
+<div class="viewcode-block" id="getDefaultLogger"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.logger.getDefaultLogger">[docs]</a><span class="k">def</span> <span class="nf">getDefaultLogger</span><span class="p">():</span>
+  <span class="sd">&quot;&quot;&quot;get simple logging logger DefaultLogger, set it as current&quot;&quot;&quot;</span>
+  <span class="kn">import</span> <span class="nn">src.loggingSimple</span> <span class="k">as</span> <span class="nn">LOGSI</span>
+  <span class="n">logger</span> <span class="o">=</span> <span class="n">LOGSI</span><span class="o">.</span><span class="n">getDefaultLogger</span><span class="p">()</span>
+  <span class="n">setCurrentLogger</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span> <span class="c1"># set it as current</span>
+  <span class="k">return</span> <span class="n">logger</span></div>
+
+<div class="viewcode-block" id="getUnittestLogger"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.logger.getUnittestLogger">[docs]</a><span class="k">def</span> <span class="nf">getUnittestLogger</span><span class="p">():</span>
+  <span class="sd">&quot;&quot;&quot;get simple logging logger UnittestLogger, set it as current&quot;&quot;&quot;</span>
+  <span class="kn">import</span> <span class="nn">src.loggingSimple</span> <span class="k">as</span> <span class="nn">LOGSI</span>
+  <span class="n">logger</span> <span class="o">=</span> <span class="n">LOGSI</span><span class="o">.</span><span class="n">getUnittestLogger</span><span class="p">()</span>
+  <span class="n">setCurrentLogger</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span> <span class="c1"># set it as current</span>
+  <span class="k">return</span> <span class="n">logger</span></div>
+
+<div class="viewcode-block" id="setCurrentLogger"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.logger.setCurrentLogger">[docs]</a><span class="k">def</span> <span class="nf">setCurrentLogger</span><span class="p">(</span><span class="n">logger</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;temporary send all in stdout as simple logging logger&quot;&quot;&quot;</span>
+  <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">_currentLogger</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+    <span class="n">_currentLogger</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;set current logger as </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">logger</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+  <span class="k">else</span><span class="p">:</span>
+    <span class="k">if</span> <span class="n">_currentLogger</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> <span class="o">!=</span> <span class="n">logger</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+      <span class="c1"># logger.debug(&quot;quit current logger as default %s&quot; % _currentLogger[0].name)</span>
+      <span class="n">_currentLogger</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">logger</span>
+      <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;change current logger as </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">logger</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
+  <span class="k">return</span> <span class="n">_currentLogger</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
+
+<div class="viewcode-block" id="isCurrentLoggerUnittest"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.logger.isCurrentLoggerUnittest">[docs]</a><span class="k">def</span> <span class="nf">isCurrentLoggerUnittest</span><span class="p">():</span>
+    <span class="n">logger</span> <span class="o">=</span> <span class="n">getCurrentLogger</span><span class="p">()</span>
+    <span class="k">if</span> <span class="s2">&quot;Unittest&quot;</span> <span class="ow">in</span> <span class="n">logger</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
+      <span class="n">res</span> <span class="o">=</span> <span class="kc">True</span>
+    <span class="k">else</span><span class="p">:</span>
+      <span class="n">res</span> <span class="o">=</span> <span class="kc">False</span>
+    <span class="n">DBG</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;isCurrentLoggerUnittest </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">logger</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">res</span></div>
+
+<div class="viewcode-block" id="sendMessageToCurrentLogger"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.logger.sendMessageToCurrentLogger">[docs]</a><span class="k">def</span> <span class="nf">sendMessageToCurrentLogger</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">level</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    assume relay from obsolescent</span>
+<span class="sd">    logger.write(msg, 1/2/3...) to future</span>
+<span class="sd">    logging.critical/warning/info...(msg) (as logging package tips)</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">logger</span> <span class="o">=</span> <span class="n">getCurrentLogger</span><span class="p">()</span>
+    <span class="k">if</span> <span class="n">level</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+      <span class="n">lev</span> <span class="o">=</span> <span class="mi">2</span>
+    <span class="k">else</span><span class="p">:</span>
+      <span class="n">lev</span> <span class="o">=</span> <span class="n">level</span>
+    <span class="k">if</span> <span class="n">lev</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
+      <span class="n">logger</span><span class="o">.</span><span class="n">critical</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+      <span class="k">return</span>
+    <span class="k">if</span> <span class="n">lev</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
+      <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+      <span class="k">return</span>
+    <span class="k">if</span> <span class="n">lev</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
+      <span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+      <span class="k">return</span>
+    <span class="k">if</span> <span class="n">lev</span> <span class="o">==</span> <span class="mi">4</span><span class="p">:</span>
+      <span class="n">logger</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+      <span class="k">return</span>
+    <span class="k">if</span> <span class="n">lev</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span>
+      <span class="n">logger</span><span class="o">.</span><span class="n">trace</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+      <span class="k">return</span>
+    <span class="k">if</span> <span class="n">lev</span> <span class="o">&gt;=</span> <span class="mi">6</span><span class="p">:</span>
+      <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+      <span class="k">return</span>
+    <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;What is this level: &#39;</span><span class="si">%s</span><span class="s2">&#39; for message:</span><span class="se">\n</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">level</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
+    <span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+    <span class="k">return</span></div>
 </pre></div>
 
           </div>
index f76e6ae5adb2421f7c28540b6db454282122f1e7..3dd905b58332875e76699062efd8746f12a7966e 100644 (file)
 <span class="sd">        &quot;&quot;&quot;</span>
         <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
         <span class="c1"># Do nothing if there are no options</span>
-        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">options</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-            <span class="k">return</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;No available options.&quot;</span><span class="p">)</span>
+
+        <span class="c1">#there is -h option, always</span>
+        <span class="c1">#if len(self.options) == 0:</span>
+        <span class="c1">#    return _(&quot;No available options.&quot;)</span>
 
         <span class="c1"># for all options, gets its values. </span>
         <span class="c1"># &quot;shortname&quot; is an mandatory field of the options, could be &#39;&#39; </span>
             <span class="n">msg</span> <span class="o">+=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">ooh</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
         <span class="k">return</span> <span class="n">msg</span></div>
 
-<div class="viewcode-block" id="Options.print_help"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.options.Options.print_help">[docs]</a>    <span class="k">def</span> <span class="nf">print_help</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Method that display all options stored in self.options and there help</span>
-<span class="sd">        </span>
-<span class="sd">        :return: None</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_help</span><span class="p">())</span>
-        <span class="k">return</span></div>
-
 <div class="viewcode-block" id="Options.indent"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.options.Options.indent">[docs]</a>    <span class="k">def</span> <span class="nf">indent</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="n">car</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">):</span>
         <span class="sd">&quot;&quot;&quot;indent multi lines message&quot;&quot;&quot;</span>
         <span class="n">padding</span> <span class="o">=</span> <span class="n">amount</span> <span class="o">*</span> <span class="n">car</span>
         
 <div class="viewcode-block" id="Options.filterLevel"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.options.Options.filterLevel">[docs]</a>    <span class="k">def</span> <span class="nf">filterLevel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aLevel</span><span class="p">):</span>
       <span class="sd">&quot;&quot;&quot;filter level logging values&quot;&quot;&quot;</span>
-      <span class="kn">import</span> <span class="nn">src.loggingSat</span> <span class="k">as</span> <span class="nn">LOG</span>
+      <span class="kn">import</span> <span class="nn">src.loggingSimple</span> <span class="k">as</span> <span class="nn">LOG</span>
       <span class="n">aLev</span> <span class="o">=</span> <span class="n">aLevel</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
       <span class="n">knownLevels</span> <span class="o">=</span> <span class="n">LOG</span><span class="o">.</span><span class="n">_knownLevels</span>
       <span class="n">maxLen</span> <span class="o">=</span> <span class="nb">max</span><span class="p">([</span><span class="nb">len</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">knownLevels</span><span class="p">])</span>
 <div class="viewcode-block" id="Options.filterList2"><a class="viewcode-back" href="../../commands/apidoc/src.html#src.options.Options.filterList2">[docs]</a>    <span class="k">def</span> <span class="nf">filterList2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">aStr</span><span class="p">):</span>
       <span class="sd">&quot;&quot;&quot;filter a list as &#39;KERNEL,YACS,etc.&#39;&quot;&quot;&quot;</span>
       <span class="n">aList</span> <span class="o">=</span> <span class="n">aStr</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;,&quot;</span><span class="p">)</span>
+      <span class="c1"># fix list leading &#39;,&#39; as &#39;,KERNEL,...&#39;</span>
+      <span class="n">aList</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">aList</span> <span class="k">if</span> <span class="n">i</span> <span class="o">!=</span> <span class="s2">&quot;&quot;</span><span class="p">]</span> <span class="c1"># split old list leadin &quot;,&quot; as &quot;,KERNEL,ETC...&quot;</span>
       <span class="k">return</span> <span class="n">aList</span></div>
       
 
index b3038cfe97d62f10d7101ccacdc9bf41cab793b2..f985c3295231fdf574985043730befa9eff01a55 100644 (file)
@@ -10,9 +10,9 @@ The **doc** command displays sat documentation.
 
 Usage
 =====
-* Show (in a web browser) the sat documentation: ::
+* Show (in a web browser) the sat documentation in format xml/html: ::
 
-    sat doc --html
+    sat doc --xml
 
 * Show (in evince, for example) the (same) sat documentation in format pdf: ::
 
index bab9fb926d0abb8b57c5c60a6dc471d6f8c41e92..c9c101b74d79779316acf10aec56bf44acb1b78e 100644 (file)
@@ -433,32 +433,38 @@ distribution correlation table contained in codes variable.</td>
 </div>
 <div class="section" id="module-src.debug">
 <span id="src-debug-module"></span><h2>src.debug module<a class="headerlink" href="#module-src.debug" title="Permalink to this headline">¶</a></h2>
-<p>This file assume DEBUG functionalities use</p>
-<ul class="simple">
-<li>print debug messages in sys.stderr for salomeTools</li>
-<li>show pretty print debug representation from instances of SAT classes
-(pretty print src.pyconf.Config), and python dict/list etc. (as ‘aVariable’)</li>
-</ul>
-<p>WARNING: obviously supposedly show messages in SAT development phase, not production</p>
-<p>usage:
-&gt;&gt; import debug as DBG
-&gt;&gt; DBG.write(“aTitle”, aVariable)        # not shown in production 
-&gt;&gt; DBG.write(“aTitle”, aVariable, True)  # unconditionaly shown (as show=True)</p>
-<p>to set show message as development phase:
-&gt;&gt; DBG.push_debug(True)</p>
-<p>to set no show message as production phase:
-&gt;&gt; DBG.push_debug(False)</p>
-<p>to set show message temporary as development phase, only in a method:
-&gt;&gt; def aMethodToDebug(…):
-&gt;&gt;   DBG.push_debug(True)              #force show as appended status
-&gt;&gt;   etc. method code with some DBG.write()
-&gt;&gt;   DBG.pop_debug()                   #restore previous status (show or not show)
-&gt;&gt;   return</p>
-<p>to set a message for future fix, as temporary problem to not forget:
-DBG.tofix(“aTitle”, aVariable, True/False) #True/False in production shown, or not</p>
-<p>in command line interface you could redirect stderr to file ‘myDebug.log’:
-&gt;&gt; sat compile … 2&gt; myDebug.log   # only stderr
-&gt;&gt; sat compile … &amp;&gt; myDebug.log   # stdout and stderr</p>
+<p>This file assume DEBUG functionalities use.
+Print salomeTools debug messages in sys.stderr.
+Show pretty print debug representation from instances of SAT classes 
+(pretty print src.pyconf.Config)</p>
+<div class="line-block">
+<div class="line">Warning: supposedly show messages in SAT development phase, not production</div>
+<div class="line"><br /></div>
+<div class="line">Usage:</div>
+<div class="line">&gt;&gt; import debug as DBG</div>
+<div class="line">&gt;&gt; DBG.write(“aTitle”, aVariable)        # not shown in production </div>
+<div class="line">&gt;&gt; DBG.write(“aTitle”, aVariable, True)  # unconditionaly shown (as show=True)</div>
+<div class="line"><br /></div>
+<div class="line">to set show message as development phase:</div>
+<div class="line">&gt;&gt; DBG.push_debug(True)</div>
+<div class="line"><br /></div>
+<div class="line">to set no show message as production phase:</div>
+<div class="line">&gt;&gt; DBG.push_debug(False)</div>
+<div class="line"><br /></div>
+<div class="line">to set show message temporary as development phase, only in a method:</div>
+<div class="line">&gt;&gt; def aMethodToDebug(…):</div>
+<div class="line">&gt;&gt;   DBG.push_debug(True)              #force show as appended status</div>
+<div class="line">&gt;&gt;   etc. method code with some DBG.write()</div>
+<div class="line">&gt;&gt;   DBG.pop_debug()                   #restore previous status (show or not show)</div>
+<div class="line">&gt;&gt;   return</div>
+<div class="line"><br /></div>
+<div class="line">to set a message for future fix, as temporary problem to not forget:</div>
+<div class="line">DBG.tofix(“aTitle”, aVariable, True/False) #True/False in production shown, or not</div>
+<div class="line"><br /></div>
+<div class="line">in command line interface you could redirect stderr to file ‘myDebug.log’:</div>
+<div class="line">&gt;&gt; sat compile … 2&gt; myDebug.log   # only stderr</div>
+<div class="line">&gt;&gt; sat compile … &amp;&gt; myDebug.log   # stdout and stderr</div>
+</div>
 <dl class="class">
 <dt id="src.debug.InStream">
 <em class="property">class </em><code class="descclassname">src.debug.</code><code class="descname">InStream</code><span class="sig-paren">(</span><em>buf=''</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/debug.html#InStream"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.debug.InStream" title="Permalink to this definition">¶</a></dt>
@@ -480,6 +486,22 @@ keep value before lost as self.value</p>
 
 </dd></dl>
 
+<dl class="function">
+<dt id="src.debug.format_color_exception">
+<code class="descclassname">src.debug.</code><code class="descname">format_color_exception</code><span class="sig-paren">(</span><em>msg</em>, <em>limit=None</em>, <em>trace=None</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/debug.html#format_color_exception"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.debug.format_color_exception" title="Permalink to this definition">¶</a></dt>
+<dd><p>Format a stack trace and the exception information.
+as traceback.format_exception(), with color
+with traceback only if (_debug) or (DBG._user in DBG._developpers)</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="src.debug.format_exception">
+<code class="descclassname">src.debug.</code><code class="descname">format_exception</code><span class="sig-paren">(</span><em>msg</em>, <em>limit=None</em>, <em>trace=None</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/debug.html#format_exception"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.debug.format_exception" title="Permalink to this definition">¶</a></dt>
+<dd><p>Format a stack trace and the exception information.
+as traceback.format_exception(), without color
+with traceback only if (_debug) or (DBG._user in DBG._developpers)</p>
+</dd></dl>
+
 <dl class="function">
 <dt id="src.debug.getLocalEnv">
 <code class="descclassname">src.debug.</code><code class="descname">getLocalEnv</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/debug.html#getLocalEnv"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.debug.getLocalEnv" title="Permalink to this definition">¶</a></dt>
@@ -505,6 +527,12 @@ as (path expression evaluation) for debug</p>
 <dd><p>indent multi lines message</p>
 </dd></dl>
 
+<dl class="function">
+<dt id="src.debug.isTypeConfig">
+<code class="descclassname">src.debug.</code><code class="descname">isTypeConfig</code><span class="sig-paren">(</span><em>var</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/debug.html#isTypeConfig"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.debug.isTypeConfig" title="Permalink to this definition">¶</a></dt>
+<dd><p>To know if var is instance from Config/pyconf</p>
+</dd></dl>
+
 <dl class="function">
 <dt id="src.debug.pop_debug">
 <code class="descclassname">src.debug.</code><code class="descname">pop_debug</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/debug.html#pop_debug"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.debug.pop_debug" title="Permalink to this definition">¶</a></dt>
@@ -533,8 +561,7 @@ as (path expression evaluation) for debug</p>
 <dt id="src.debug.tofix">
 <code class="descclassname">src.debug.</code><code class="descname">tofix</code><span class="sig-paren">(</span><em>title</em>, <em>var=''</em>, <em>force=None</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/debug.html#tofix"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.debug.tofix" title="Permalink to this definition">¶</a></dt>
 <dd><p>write sys.stderr a message if _debug[-1]==True or optionaly force=True
-use this only if no logger accessible for classic 
-logger.warning(message) or logger.debug(message)</p>
+use this only if no logger accessible for classic logger.warning(message)</p>
 </dd></dl>
 
 <dl class="function">
@@ -2143,7 +2170,7 @@ to append or prepend.</p>
 <p>Implements the classes and method relative to the logging</p>
 <dl class="class">
 <dt id="src.logger.Logger">
-<em class="property">class </em><code class="descclassname">src.logger.</code><code class="descname">Logger</code><span class="sig-paren">(</span><em>config</em>, <em>silent_sysstd=False</em>, <em>all_in_terminal=False</em>, <em>micro_command=False</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#Logger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.Logger" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="descclassname">src.logger.</code><code class="descname">Logger</code><span class="sig-paren">(</span><em>config=None</em>, <em>silent_sysstd=False</em>, <em>all_in_terminal=False</em>, <em>micro_command=False</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#Logger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.Logger" title="Permalink to this definition">¶</a></dt>
 <dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
 <p>Class to handle log mechanism.</p>
 <dl class="method">
@@ -2256,6 +2283,29 @@ returns list year, mon, day, hour, minutes, seconds</p>
 </table>
 </dd></dl>
 
+<dl class="function">
+<dt id="src.logger.getCurrentLogger">
+<code class="descclassname">src.logger.</code><code class="descname">getCurrentLogger</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#getCurrentLogger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.getCurrentLogger" title="Permalink to this definition">¶</a></dt>
+<dd><p>get current logging logger, set as DefaultLogger if not set yet</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="src.logger.getDefaultLogger">
+<code class="descclassname">src.logger.</code><code class="descname">getDefaultLogger</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#getDefaultLogger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.getDefaultLogger" title="Permalink to this definition">¶</a></dt>
+<dd><p>get simple logging logger DefaultLogger, set it as current</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="src.logger.getUnittestLogger">
+<code class="descclassname">src.logger.</code><code class="descname">getUnittestLogger</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#getUnittestLogger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.getUnittestLogger" title="Permalink to this definition">¶</a></dt>
+<dd><p>get simple logging logger UnittestLogger, set it as current</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="src.logger.isCurrentLoggerUnittest">
+<code class="descclassname">src.logger.</code><code class="descname">isCurrentLoggerUnittest</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#isCurrentLoggerUnittest"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.isCurrentLoggerUnittest" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
 <dl class="function">
 <dt id="src.logger.list_log_file">
 <code class="descclassname">src.logger.</code><code class="descname">list_log_file</code><span class="sig-paren">(</span><em>dirPath</em>, <em>expression</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#list_log_file"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.list_log_file" title="Permalink to this definition">¶</a></dt>
@@ -2280,6 +2330,20 @@ returns list year, mon, day, hour, minutes, seconds</p>
 </table>
 </dd></dl>
 
+<dl class="function">
+<dt id="src.logger.sendMessageToCurrentLogger">
+<code class="descclassname">src.logger.</code><code class="descname">sendMessageToCurrentLogger</code><span class="sig-paren">(</span><em>message</em>, <em>level</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#sendMessageToCurrentLogger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.sendMessageToCurrentLogger" title="Permalink to this definition">¶</a></dt>
+<dd><p>assume relay from obsolescent
+logger.write(msg, 1/2/3…) to future
+logging.critical/warning/info…(msg) (as logging package tips)</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="src.logger.setCurrentLogger">
+<code class="descclassname">src.logger.</code><code class="descname">setCurrentLogger</code><span class="sig-paren">(</span><em>logger</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#setCurrentLogger"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.setCurrentLogger" title="Permalink to this definition">¶</a></dt>
+<dd><p>temporary send all in stdout as simple logging logger</p>
+</dd></dl>
+
 <dl class="function">
 <dt id="src.logger.show_command_log">
 <code class="descclassname">src.logger.</code><code class="descname">show_command_log</code><span class="sig-paren">(</span><em>logFilePath</em>, <em>cmd</em>, <em>application</em>, <em>notShownCommands</em><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/logger.html#show_command_log"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.logger.show_command_log" title="Permalink to this definition">¶</a></dt>
@@ -2473,20 +2537,6 @@ args is the full raw list of passed options</td>
 </table>
 </dd></dl>
 
-<dl class="method">
-<dt id="src.options.Options.print_help">
-<code class="descname">print_help</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../../_modules/src/options.html#Options.print_help"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#src.options.Options.print_help" title="Permalink to this definition">¶</a></dt>
-<dd><p>Method that display all options stored in self.options and there help</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">None</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
 </dd></dl>
 
 </div>
index e2d8291db5c78320799b2afd287ce4fcefe2b3fa..3d9458532be1ad93d42bc91c23b73c1d86bcd55e 100644 (file)
@@ -17,7 +17,7 @@
     <link rel="index" title="Index" href="../genindex.html" />
     <link rel="search" title="Search" href="../search.html" />
     <link rel="next" title="Command prepare" href="prepare.html" />
-    <link rel="prev" title="Usage of SAlomeTools" href="../usage_of_sat.html" />
+    <link rel="prev" title="Command doc" href="doc.html" />
    
   <link rel="stylesheet" href="../_static/custom.css" type="text/css" />
   
@@ -147,7 +147,7 @@ sat config SALOME-xx --info qt
 <h3>Related Topics</h3>
 <ul>
   <li><a href="../index.html">Documentation overview</a><ul>
-      <li>Previous: <a href="../usage_of_sat.html" title="previous chapter">Usage of SAlomeTools</a></li>
+      <li>Previous: <a href="doc.html" title="previous chapter">Command doc</a></li>
       <li>Next: <a href="prepare.html" title="next chapter">Command prepare</a></li>
   </ul></li>
 </ul>
index 389181619068366e11836dcb1aa77b5f2635cdde..2970d08210c1048f31c0fd17d2244a7e1b9bddcf 100644 (file)
@@ -41,8 +41,8 @@
 <div class="section" id="usage">
 <h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline">¶</a></h2>
 <ul>
-<li><p class="first">Show (in a web browser) the sat documentation:</p>
-<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sat</span> <span class="n">doc</span> <span class="o">--</span><span class="n">html</span>
+<li><p class="first">Show (in a web browser) the sat documentation in format xml/html:</p>
+<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">sat</span> <span class="n">doc</span> <span class="o">--</span><span class="n">xml</span>
 </pre></div>
 </div>
 </li>
index 8376dc38b7f2325c12c6158ea7aba8dba0d0c215..527afe98c4f5d21edf6681ad97b2370646a6f76c 100644 (file)
 </li>
       <li><a href="commands/apidoc/src.html#src.ElementTree.ElementTree.findtext">findtext() (src.ElementTree.ElementTree method)</a>
 </li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="commands/apidoc/src.html#src.environment.SalomeEnviron.finish">finish() (src.environment.SalomeEnviron method)</a>
 
       <ul>
         <li><a href="commands/apidoc/src.html#src.fileEnviron.LauncherFileEnviron.finish">(src.fileEnviron.LauncherFileEnviron method)</a>
 </li>
       </ul></li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="commands/apidoc/src.html#src.logger.Logger.flush">flush() (src.logger.Logger method)</a>
 
       <ul>
 </li>
       </ul></li>
       <li><a href="commands/apidoc/src.colorama.html#src.colorama.winterm.WinTerm.fore">fore() (src.colorama.winterm.WinTerm method)</a>
+</li>
+      <li><a href="commands/apidoc/src.html#src.debug.format_color_exception">format_color_exception() (in module src.debug)</a>
+</li>
+      <li><a href="commands/apidoc/src.html#src.debug.format_exception">format_exception() (in module src.debug)</a>
 </li>
       <li><a href="commands/apidoc/src.colorama.html#src.colorama.ansi.AnsiCursor.FORWARD">FORWARD() (src.colorama.ansi.AnsiCursor method)</a>
 </li>
 </li>
       <li><a href="commands/apidoc/src.html#src.product.get_product_config">get_product_config() (in module src.product)</a>
 </li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="commands/apidoc/src.html#src.product.get_product_dependencies">get_product_dependencies() (in module src.product)</a>
 </li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="commands/apidoc/src.html#src.product.get_product_section">get_product_section() (in module src.product)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.product.get_products_infos">get_products_infos() (in module src.product)</a>
 </li>
       </ul></li>
       <li><a href="commands/apidoc/src.html#src.pyconf.ConfigReader.getChar">getChar() (src.pyconf.ConfigReader method)</a>
+</li>
+      <li><a href="commands/apidoc/src.html#src.logger.getCurrentLogger">getCurrentLogger() (in module src.logger)</a>
+</li>
+      <li><a href="commands/apidoc/src.html#src.logger.getDefaultLogger">getDefaultLogger() (in module src.logger)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.options.Options.getDetailOption">getDetailOption() (src.options.Options method)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.test_module.getTmpDirDEFAULT">getTmpDirDEFAULT() (in module src.test_module)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.pyconf.ConfigReader.getToken">getToken() (src.pyconf.ConfigReader method)</a>
+</li>
+      <li><a href="commands/apidoc/src.html#src.logger.getUnittestLogger">getUnittestLogger() (in module src.logger)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.system.git_extract">git_extract() (in module src.system)</a>
 </li>
       <li><a href="commands/apidoc/src.colorama.html#src.colorama.ansitowin32.is_stream_closed">is_stream_closed() (in module src.colorama.ansitowin32)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.architecture.is_windows">is_windows() (in module src.architecture)</a>
+</li>
+      <li><a href="commands/apidoc/src.html#src.logger.isCurrentLoggerUnittest">isCurrentLoggerUnittest() (in module src.logger)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.Path.isdir">isdir() (src.Path method)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.Path.isfile">isfile() (src.Path method)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.Path.islink">islink() (src.Path method)</a>
+</li>
+      <li><a href="commands/apidoc/src.html#src.debug.isTypeConfig">isTypeConfig() (in module src.debug)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.pyconf.isWord">isWord() (in module src.pyconf)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="commands/apidoc/src.html#src.printcolors.print_color_range">print_color_range() (in module src.printcolors)</a>
-</li>
-      <li><a href="commands/apidoc/src.html#src.options.Options.print_help">print_help() (src.options.Options method)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.print_info">print_info() (in module src)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.fileEnviron.ScreenEnviron">ScreenEnviron (class in src.fileEnviron)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.test_module.Test.search_known_errors">search_known_errors() (src.test_module.Test method)</a>
+</li>
+      <li><a href="commands/apidoc/src.html#src.logger.sendMessageToCurrentLogger">sendMessageToCurrentLogger() (in module src.logger)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.pyconf.Sequence">Sequence (class in src.pyconf)</a>
 </li>
 </li>
       </ul></li>
       <li><a href="commands/apidoc/src.colorama.html#src.colorama.win32.SetConsoleTextAttribute">SetConsoleTextAttribute() (in module src.colorama.win32)</a>
+</li>
+      <li><a href="commands/apidoc/src.html#src.logger.setCurrentLogger">setCurrentLogger() (in module src.logger)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.pyconf.Container.setPath">setPath() (src.pyconf.Container method)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.pyconf.ConfigReader.setStream">setStream() (src.pyconf.ConfigReader method)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.environment.Shell">Shell (class in src.environment)</a>
-</li>
-      <li><a href="commands/apidoc/src.colorama.html#src.colorama.ansitowin32.AnsiToWin32.should_wrap">should_wrap() (src.colorama.ansitowin32.AnsiToWin32 method)</a>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
+      <li><a href="commands/apidoc/src.colorama.html#src.colorama.ansitowin32.AnsiToWin32.should_wrap">should_wrap() (src.colorama.ansitowin32.AnsiToWin32 method)</a>
+</li>
       <li><a href="commands/apidoc/src.html#src.logger.show_command_log">show_command_log() (in module src.logger)</a>
 </li>
       <li><a href="commands/apidoc/src.html#src.system.show_in_editor">show_in_editor() (in module src.system)</a>
index 25e309c90990babeb432e1b85a88a3820095f564..477227f00c880d0073afa89803dd253f7e602f6b 100644 (file)
Binary files a/doc/build/html/objects.inv and b/doc/build/html/objects.inv differ
index 3c722c8b5b7da9760856c3129b102838130fa440..711cdcde6ff22c8bd77ddbf4abe120ea967af833 100644 (file)
@@ -1 +1 @@
-Search.setIndex({docnames:["commands/apidoc/modules","commands/apidoc/src","commands/apidoc/src.colorama","commands/application","commands/clean","commands/compile","commands/config","commands/doc","commands/environ","commands/generate","commands/launcher","commands/log","commands/package","commands/prepare","configuration","index","installation_of_sat","release_notes/release_notes_5.0.0","usage_of_sat","write_command"],envversion:52,filenames:["commands/apidoc/modules.rst","commands/apidoc/src.rst","commands/apidoc/src.colorama.rst","commands/application.rst","commands/clean.rst","commands/compile.rst","commands/config.rst","commands/doc.rst","commands/environ.rst","commands/generate.rst","commands/launcher.rst","commands/log.rst","commands/package.rst","commands/prepare.rst","configuration.rst","index.rst","installation_of_sat.rst","release_notes/release_notes_5.0.0.rst","usage_of_sat.rst","write_command.rst"],objects:{"":{src:[1,0,0,"-"]},"src.ElementTree":{Comment:[1,1,1,""],Element:[1,1,1,""],ElementTree:[1,2,1,""],PI:[1,1,1,""],ProcessingInstruction:[1,1,1,""],QName:[1,2,1,""],SubElement:[1,1,1,""],TreeBuilder:[1,2,1,""],XML:[1,1,1,""],XMLTreeBuilder:[1,2,1,""],dump:[1,1,1,""],fromstring:[1,1,1,""],iselement:[1,1,1,""],iterparse:[1,2,1,""],parse:[1,1,1,""],tostring:[1,1,1,""]},"src.ElementTree.ElementTree":{find:[1,3,1,""],findall:[1,3,1,""],findtext:[1,3,1,""],getiterator:[1,3,1,""],getroot:[1,3,1,""],parse:[1,3,1,""],write:[1,3,1,""]},"src.ElementTree.TreeBuilder":{close:[1,3,1,""],data:[1,3,1,""],end:[1,3,1,""],start:[1,3,1,""]},"src.ElementTree.XMLTreeBuilder":{close:[1,3,1,""],doctype:[1,3,1,""],feed:[1,3,1,""]},"src.ElementTree.iterparse":{next:[1,3,1,""]},"src.Path":{base:[1,3,1,""],chmod:[1,3,1,""],copy:[1,3,1,""],copydir:[1,3,1,""],copyfile:[1,3,1,""],copylink:[1,3,1,""],dir:[1,3,1,""],exists:[1,3,1,""],isdir:[1,3,1,""],isfile:[1,3,1,""],islink:[1,3,1,""],list:[1,3,1,""],make:[1,3,1,""],readlink:[1,3,1,""],rm:[1,3,1,""],smartcopy:[1,3,1,""],symlink:[1,3,1,""]},"src.architecture":{get_distrib_version:[1,1,1,""],get_distribution:[1,1,1,""],get_nb_proc:[1,1,1,""],get_python_version:[1,1,1,""],get_user:[1,1,1,""],is_windows:[1,1,1,""]},"src.colorama":{ansi:[2,0,0,"-"],ansitowin32:[2,0,0,"-"],initialise:[2,0,0,"-"],win32:[2,0,0,"-"],winterm:[2,0,0,"-"]},"src.colorama.ansi":{AnsiBack:[2,2,1,""],AnsiCodes:[2,2,1,""],AnsiCursor:[2,2,1,""],AnsiFore:[2,2,1,""],AnsiStyle:[2,2,1,""],clear_line:[2,1,1,""],clear_screen:[2,1,1,""],code_to_chars:[2,1,1,""],set_title:[2,1,1,""]},"src.colorama.ansi.AnsiBack":{BLACK:[2,5,1,""],BLUE:[2,5,1,""],CYAN:[2,5,1,""],GREEN:[2,5,1,""],LIGHTBLACK_EX:[2,5,1,""],LIGHTBLUE_EX:[2,5,1,""],LIGHTCYAN_EX:[2,5,1,""],LIGHTGREEN_EX:[2,5,1,""],LIGHTMAGENTA_EX:[2,5,1,""],LIGHTRED_EX:[2,5,1,""],LIGHTWHITE_EX:[2,5,1,""],LIGHTYELLOW_EX:[2,5,1,""],MAGENTA:[2,5,1,""],RED:[2,5,1,""],RESET:[2,5,1,""],WHITE:[2,5,1,""],YELLOW:[2,5,1,""]},"src.colorama.ansi.AnsiCursor":{BACK:[2,3,1,""],DOWN:[2,3,1,""],FORWARD:[2,3,1,""],POS:[2,3,1,""],UP:[2,3,1,""]},"src.colorama.ansi.AnsiFore":{BLACK:[2,5,1,""],BLUE:[2,5,1,""],CYAN:[2,5,1,""],GREEN:[2,5,1,""],LIGHTBLACK_EX:[2,5,1,""],LIGHTBLUE_EX:[2,5,1,""],LIGHTCYAN_EX:[2,5,1,""],LIGHTGREEN_EX:[2,5,1,""],LIGHTMAGENTA_EX:[2,5,1,""],LIGHTRED_EX:[2,5,1,""],LIGHTWHITE_EX:[2,5,1,""],LIGHTYELLOW_EX:[2,5,1,""],MAGENTA:[2,5,1,""],RED:[2,5,1,""],RESET:[2,5,1,""],WHITE:[2,5,1,""],YELLOW:[2,5,1,""]},"src.colorama.ansi.AnsiStyle":{BRIGHT:[2,5,1,""],DIM:[2,5,1,""],NORMAL:[2,5,1,""],RESET_ALL:[2,5,1,""]},"src.colorama.ansitowin32":{AnsiToWin32:[2,2,1,""],StreamWrapper:[2,2,1,""],is_a_tty:[2,1,1,""],is_stream_closed:[2,1,1,""]},"src.colorama.ansitowin32.AnsiToWin32":{ANSI_CSI_RE:[2,5,1,""],ANSI_OSC_RE:[2,5,1,""],call_win32:[2,3,1,""],convert_ansi:[2,3,1,""],convert_osc:[2,3,1,""],extract_params:[2,3,1,""],get_win32_calls:[2,3,1,""],reset_all:[2,3,1,""],should_wrap:[2,3,1,""],write:[2,3,1,""],write_and_convert:[2,3,1,""],write_plain_text:[2,3,1,""]},"src.colorama.ansitowin32.StreamWrapper":{write:[2,3,1,""]},"src.colorama.initialise":{colorama_text:[2,1,1,""],deinit:[2,1,1,""],init:[2,1,1,""],reinit:[2,1,1,""],reset_all:[2,1,1,""],wrap_stream:[2,1,1,""]},"src.colorama.win32":{SetConsoleTextAttribute:[2,1,1,""],winapi_test:[2,1,1,""]},"src.colorama.winterm":{WinColor:[2,2,1,""],WinStyle:[2,2,1,""],WinTerm:[2,2,1,""]},"src.colorama.winterm.WinColor":{BLACK:[2,5,1,""],BLUE:[2,5,1,""],CYAN:[2,5,1,""],GREEN:[2,5,1,""],GREY:[2,5,1,""],MAGENTA:[2,5,1,""],RED:[2,5,1,""],YELLOW:[2,5,1,""]},"src.colorama.winterm.WinStyle":{BRIGHT:[2,5,1,""],BRIGHT_BACKGROUND:[2,5,1,""],NORMAL:[2,5,1,""]},"src.colorama.winterm.WinTerm":{back:[2,3,1,""],cursor_adjust:[2,3,1,""],erase_line:[2,3,1,""],erase_screen:[2,3,1,""],fore:[2,3,1,""],get_attrs:[2,3,1,""],get_position:[2,3,1,""],reset_all:[2,3,1,""],set_attrs:[2,3,1,""],set_console:[2,3,1,""],set_cursor_position:[2,3,1,""],set_title:[2,3,1,""],style:[2,3,1,""]},"src.compilation":{Builder:[1,2,1,""]},"src.compilation.Builder":{build_configure:[1,3,1,""],check:[1,3,1,""],cmake:[1,3,1,""],complete_environment:[1,3,1,""],configure:[1,3,1,""],do_batch_script_build:[1,3,1,""],do_default_build:[1,3,1,""],do_python_script_build:[1,3,1,""],do_script_build:[1,3,1,""],hack_libtool:[1,3,1,""],install:[1,3,1,""],log:[1,3,1,""],log_command:[1,3,1,""],make:[1,3,1,""],prepare:[1,3,1,""],put_txt_log_in_appli_log_dir:[1,3,1,""],wmake:[1,3,1,""]},"src.debug":{InStream:[1,2,1,""],OutStream:[1,2,1,""],getLocalEnv:[1,1,1,""],getStrConfigDbg:[1,1,1,""],getStrConfigStd:[1,1,1,""],indent:[1,1,1,""],pop_debug:[1,1,1,""],push_debug:[1,1,1,""],saveConfigDbg:[1,1,1,""],saveConfigStd:[1,1,1,""],tofix:[1,1,1,""],write:[1,1,1,""]},"src.debug.OutStream":{close:[1,3,1,""]},"src.environment":{Environ:[1,2,1,""],FileEnvWriter:[1,2,1,""],SalomeEnviron:[1,2,1,""],Shell:[1,2,1,""],load_environment:[1,1,1,""]},"src.environment.Environ":{append:[1,3,1,""],append_value:[1,3,1,""],command_value:[1,3,1,""],get:[1,3,1,""],is_defined:[1,3,1,""],prepend:[1,3,1,""],prepend_value:[1,3,1,""],set:[1,3,1,""]},"src.environment.FileEnvWriter":{write_cfgForPy_file:[1,3,1,""],write_env_file:[1,3,1,""]},"src.environment.SalomeEnviron":{add_comment:[1,3,1,""],add_line:[1,3,1,""],add_warning:[1,3,1,""],append:[1,3,1,""],dump:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],get_names:[1,3,1,""],is_defined:[1,3,1,""],load_cfg_environment:[1,3,1,""],prepend:[1,3,1,""],run_env_script:[1,3,1,""],run_simple_env_script:[1,3,1,""],set:[1,3,1,""],set_a_product:[1,3,1,""],set_application_env:[1,3,1,""],set_cpp_env:[1,3,1,""],set_full_environ:[1,3,1,""],set_products:[1,3,1,""],set_python_libdirs:[1,3,1,""],set_salome_generic_product_env:[1,3,1,""],set_salome_minimal_product_env:[1,3,1,""]},"src.fileEnviron":{BashFileEnviron:[1,2,1,""],BatFileEnviron:[1,2,1,""],ContextFileEnviron:[1,2,1,""],FileEnviron:[1,2,1,""],LauncherFileEnviron:[1,2,1,""],ScreenEnviron:[1,2,1,""],get_file_environ:[1,1,1,""],special_path_separator:[1,1,1,""]},"src.fileEnviron.BashFileEnviron":{command_value:[1,3,1,""],finish:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.BatFileEnviron":{add_comment:[1,3,1,""],command_value:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.ContextFileEnviron":{add_echo:[1,3,1,""],add_warning:[1,3,1,""],append_value:[1,3,1,""],command_value:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],prepend_value:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.FileEnviron":{add_comment:[1,3,1,""],add_echo:[1,3,1,""],add_line:[1,3,1,""],add_warning:[1,3,1,""],append:[1,3,1,""],append_value:[1,3,1,""],command_value:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],is_defined:[1,3,1,""],prepend:[1,3,1,""],prepend_value:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.LauncherFileEnviron":{add:[1,3,1,""],add_comment:[1,3,1,""],add_echo:[1,3,1,""],add_line:[1,3,1,""],add_warning:[1,3,1,""],append:[1,3,1,""],append_value:[1,3,1,""],change_to_launcher:[1,3,1,""],command_value:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],is_defined:[1,3,1,""],prepend:[1,3,1,""],prepend_value:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.ScreenEnviron":{add_comment:[1,3,1,""],add_echo:[1,3,1,""],add_line:[1,3,1,""],add_warning:[1,3,1,""],append:[1,3,1,""],command_value:[1,3,1,""],get:[1,3,1,""],is_defined:[1,3,1,""],prepend:[1,3,1,""],run_env_script:[1,3,1,""],set:[1,3,1,""],write:[1,3,1,""]},"src.fork":{batch:[1,1,1,""],batch_salome:[1,1,1,""],launch_command:[1,1,1,""],show_progress:[1,1,1,""],write_back:[1,1,1,""]},"src.logger":{Logger:[1,2,1,""],date_to_datetime:[1,1,1,""],list_log_file:[1,1,1,""],show_command_log:[1,1,1,""],timedelta_total_seconds:[1,1,1,""],update_hat_xml:[1,1,1,""]},"src.logger.Logger":{add_link:[1,3,1,""],end_write:[1,3,1,""],error:[1,3,1,""],flush:[1,3,1,""],put_initial_xml_fields:[1,3,1,""],write:[1,3,1,""]},"src.options":{OptResult:[1,2,1,""],Options:[1,2,1,""]},"src.options.Options":{add_option:[1,3,1,""],debug_write:[1,3,1,""],filterLevel:[1,3,1,""],filterList2:[1,3,1,""],getDetailOption:[1,3,1,""],get_help:[1,3,1,""],indent:[1,3,1,""],parse_args:[1,3,1,""],print_help:[1,3,1,""]},"src.printcolors":{cleancolor:[1,1,1,""],print_color_map:[1,1,1,""],print_color_range:[1,1,1,""],print_value:[1,1,1,""],printc:[1,1,1,""],printcError:[1,1,1,""],printcHeader:[1,1,1,""],printcHighlight:[1,1,1,""],printcInfo:[1,1,1,""],printcLabel:[1,1,1,""],printcSuccess:[1,1,1,""],printcWarning:[1,1,1,""]},"src.product":{check_config_exists:[1,1,1,""],check_installation:[1,1,1,""],check_source:[1,1,1,""],get_base_install_dir:[1,1,1,""],get_install_dir:[1,1,1,""],get_product_components:[1,1,1,""],get_product_config:[1,1,1,""],get_product_dependencies:[1,1,1,""],get_product_section:[1,1,1,""],get_products_infos:[1,1,1,""],product_compiles:[1,1,1,""],product_has_env_script:[1,1,1,""],product_has_logo:[1,1,1,""],product_has_patches:[1,1,1,""],product_has_salome_gui:[1,1,1,""],product_has_script:[1,1,1,""],product_is_autotools:[1,1,1,""],product_is_cmake:[1,1,1,""],product_is_cpp:[1,1,1,""],product_is_debug:[1,1,1,""],product_is_dev:[1,1,1,""],product_is_fixed:[1,1,1,""],product_is_generated:[1,1,1,""],product_is_mpi:[1,1,1,""],product_is_native:[1,1,1,""],product_is_salome:[1,1,1,""],product_is_smesh_plugin:[1,1,1,""],product_is_vcs:[1,1,1,""],product_is_verbose:[1,1,1,""]},"src.pyconf":{Config:[1,2,1,""],ConfigError:[1,4,1,""],ConfigFormatError:[1,4,1,""],ConfigInputStream:[1,2,1,""],ConfigList:[1,2,1,""],ConfigMerger:[1,2,1,""],ConfigOutputStream:[1,2,1,""],ConfigReader:[1,2,1,""],ConfigResolutionError:[1,4,1,""],Container:[1,2,1,""],Expression:[1,2,1,""],Mapping:[1,2,1,""],Reference:[1,2,1,""],Sequence:[1,2,1,""],deepCopyMapping:[1,1,1,""],defaultMergeResolve:[1,1,1,""],defaultStreamOpener:[1,1,1,""],isWord:[1,1,1,""],makePath:[1,1,1,""],overwriteMergeResolve:[1,1,1,""]},"src.pyconf.Config":{Namespace:[1,2,1,""],addNamespace:[1,3,1,""],getByPath:[1,3,1,""],load:[1,3,1,""],removeNamespace:[1,3,1,""]},"src.pyconf.ConfigInputStream":{close:[1,3,1,""],read:[1,3,1,""],readline:[1,3,1,""]},"src.pyconf.ConfigList":{getByPath:[1,3,1,""]},"src.pyconf.ConfigMerger":{handleMismatch:[1,3,1,""],merge:[1,3,1,""],mergeMapping:[1,3,1,""],mergeSequence:[1,3,1,""],overwriteKeys:[1,3,1,""]},"src.pyconf.ConfigOutputStream":{close:[1,3,1,""],flush:[1,3,1,""],write:[1,3,1,""]},"src.pyconf.ConfigReader":{getChar:[1,3,1,""],getToken:[1,3,1,""],load:[1,3,1,""],location:[1,3,1,""],match:[1,3,1,""],parseFactor:[1,3,1,""],parseKeyValuePair:[1,3,1,""],parseMapping:[1,3,1,""],parseMappingBody:[1,3,1,""],parseReference:[1,3,1,""],parseScalar:[1,3,1,""],parseSequence:[1,3,1,""],parseSuffix:[1,3,1,""],parseTerm:[1,3,1,""],parseValue:[1,3,1,""],setStream:[1,3,1,""]},"src.pyconf.Container":{evaluate:[1,3,1,""],setPath:[1,3,1,""],writeToStream:[1,3,1,""],writeValue:[1,3,1,""]},"src.pyconf.Expression":{evaluate:[1,3,1,""]},"src.pyconf.Mapping":{addMapping:[1,3,1,""],get:[1,3,1,""],iteritems:[1,3,1,""],iterkeys:[1,3,1,""],keys:[1,3,1,""],writeToStream:[1,3,1,""]},"src.pyconf.Reference":{addElement:[1,3,1,""],findConfig:[1,3,1,""],resolve:[1,3,1,""]},"src.pyconf.Sequence":{SeqIter:[1,2,1,""],append:[1,3,1,""],writeToStream:[1,3,1,""]},"src.pyconf.Sequence.SeqIter":{next:[1,3,1,""]},"src.system":{archive_extract:[1,1,1,""],cvs_extract:[1,1,1,""],git_extract:[1,1,1,""],show_in_editor:[1,1,1,""],svn_extract:[1,1,1,""]},"src.template":{MyTemplate:[1,2,1,""],substitute:[1,1,1,""]},"src.template.MyTemplate":{delimiter:[1,5,1,""],pattern:[1,5,1,""]},"src.test_module":{Test:[1,2,1,""],getTmpDirDEFAULT:[1,1,1,""]},"src.test_module.Test":{generate_launching_commands:[1,3,1,""],generate_script:[1,3,1,""],get_test_timeout:[1,3,1,""],get_tmp_dir:[1,3,1,""],prepare_testbase:[1,3,1,""],prepare_testbase_from_dir:[1,3,1,""],prepare_testbase_from_git:[1,3,1,""],prepare_testbase_from_svn:[1,3,1,""],read_results:[1,3,1,""],run_all_tests:[1,3,1,""],run_grid_tests:[1,3,1,""],run_script:[1,3,1,""],run_session_tests:[1,3,1,""],run_testbase_tests:[1,3,1,""],run_tests:[1,3,1,""],search_known_errors:[1,3,1,""],write_test_margin:[1,3,1,""]},"src.xmlManager":{ReadXmlFile:[1,2,1,""],XmlLogFile:[1,2,1,""],add_simple_node:[1,1,1,""],append_node_attrib:[1,1,1,""],find_node_by_attrib:[1,1,1,""],write_report:[1,1,1,""]},"src.xmlManager.ReadXmlFile":{getRootAttrib:[1,3,1,""],get_attrib:[1,3,1,""],get_node_text:[1,3,1,""]},"src.xmlManager.XmlLogFile":{add_simple_node:[1,3,1,""],append_node_attrib:[1,3,1,""],append_node_text:[1,3,1,""],write_tree:[1,3,1,""]},src:{ElementTree:[1,0,0,"-"],Path:[1,2,1,""],SatException:[1,4,1,""],activate_mesa_property:[1,1,1,""],architecture:[1,0,0,"-"],check_config_has_application:[1,1,1,""],check_config_has_profile:[1,1,1,""],colorama:[2,0,0,"-"],compilation:[1,0,0,"-"],config_has_application:[1,1,1,""],debug:[1,0,0,"-"],deepcopy_list:[1,1,1,""],ensure_path_exists:[1,1,1,""],environment:[1,0,0,"-"],fileEnviron:[1,0,0,"-"],find_file_in_lpath:[1,1,1,""],fork:[1,0,0,"-"],get_base_path:[1,1,1,""],get_cfg_param:[1,1,1,""],get_launcher_name:[1,1,1,""],get_log_path:[1,1,1,""],get_property_in_product_cfg:[1,1,1,""],get_salome_version:[1,1,1,""],get_tmp_filename:[1,1,1,""],handleRemoveReadonly:[1,1,1,""],logger:[1,0,0,"-"],merge_dicts:[1,1,1,""],only_numbers:[1,1,1,""],options:[1,0,0,"-"],parse_date:[1,1,1,""],print_info:[1,1,1,""],printcolors:[1,0,0,"-"],product:[1,0,0,"-"],pyconf:[1,0,0,"-"],read_config_from_a_file:[1,1,1,""],remove_item_from_list:[1,1,1,""],replace_in_file:[1,1,1,""],system:[1,0,0,"-"],template:[1,0,0,"-"],test_module:[1,0,0,"-"],xmlManager:[1,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","exception","Python exception"],"5":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method","4":"py:exception","5":"py:attribute"},terms:{"0x36fa5f0":[],"0x37b8f90":[],"0x37f8420":[],"0x44e4620":[],"0x4986ff0":[],"16be":1,"16le":1,"9abc":1,"boolean":[1,19],"case":1,"char":1,"class":[1,2,19],"default":[1,3,5,6,8,10,11,12,13,18,19],"export":13,"final":[1,6,13],"float":1,"function":[1,2,19],"import":[1,8,19],"int":[1,11],"long":[1,4],"new":[1,13,19],"return":[1,8,19],"short":1,"true":[1,2],"try":1,"var":[1,8,19],And:[1,6,8],But:19,CVS:12,For:[1,8,13,15,19],Has:1,One:1,POS:2,The:[1,3,4,5,6,7,8,9,10,11,12,13,14,15,18,19],Then:[13,14],There:14,These:8,Theses:4,Use:[3,4,5,6,8,9,10,13],Used:1,Useful:18,VCS:[4,12],__init__:[],__save__:1,__setattr__:1,_appli:3,_blank:1,_build:8,_debug:1,_launch:8,_ld_library_path:8,_sre:[1,2],a_b_c_:1,abool:1,about:[1,14],absolut:12,access:[1,2,11],account:8,act:[1,2],action:1,activ:[1,13],activate_mesa_properti:1,actual:[1,2,16],add:[1,5,15],add_com:1,add_echo:1,add_lin:1,add_link:1,add_opt:[1,19],add_simple_nod:1,add_warn:1,added:1,addel:1,adding:19,addit:[1,5,14],additional_dir:1,additional_env:1,addmap:1,addnamespac:1,adequ:1,adot:1,advanc:1,affect:2,afil:1,after:[1,5,16],again:1,agent:13,aim:1,alevel:1,algorithm:19,all:[1,2,4,6,8,9,13,14,18,19],all_in_termin:1,allow:[1,5,6,9,15,18],alphanumer:1,alreadi:[12,19],also:[1,8,13,14,19],alter:13,amethodtodebug:1,amount:1,ani:[1,2,6,11,13],anoth:[1,14],ansi:[0,1],ansi_csi_r:2,ansi_escape_cod:2,ansi_osc_r:2,ansiback:2,ansicod:2,ansicursor:2,ansifor:2,ansistyl:2,ansitowin32:[0,1],apart:2,api:1,append:[1,8,12],append_node_attrib:1,append_node_text:1,append_valu:1,appli:[1,6,9,13],applic:[1,4,5,6,8,9,10,11,13,15,19],application_nam:3,appropri:1,arch:12,architectur:[0,12,14],archiv:[1,12,13],archive_extract:1,archive_info:13,arg:[1,2,19],arglist:1,argument:[1,19],ascii:[1,7],ask:1,assign:1,assum:1,astr:1,astream:1,atitl:1,attibut:1,attr:[1,2],attrib:1,attribut:[1,2],authent:13,author:1,automat:[6,8],autoreset:2,autotool:[1,5],avail:6,avari:1,avoid:13,award:1,back:2,backtick:1,base:[1,2,14],bash:[1,8,13],bashfileenviron:1,bat:[1,8],batch:1,batch_salom:1,batfileenviron:1,becaus:1,been:[1,2],befor:[1,5],begin:1,behavior:19,being:1,belong:1,below:8,between:[1,19],bienvenu:1,big:5,bigger:1,bin:8,binari:12,black:2,blogmatrix:1,blue:2,bom:1,bonjour:19,bool:1,both:[1,8,9],bracket:1,branch:13,bright:2,bright_background:2,bring:[9,13],browser:[1,6,7,11,14],buf:1,build:[1,4,5,8,14],build_conf_opt:1,build_configur:1,build_sourc:5,builder:1,built:1,call:[1,2,8,10,19],call_win32:2,callabl:1,can:[1,3,8,13,14,15,19],cannot:1,car:1,care:4,carri:1,catalog:[3,10],cfg:[1,8,19],cfg_env:1,cfgforpi:1,chang:[1,3,18,19],change_to_launch:1,charact:[1,2],charg:10,check:[1,5,8],check_config_exist:1,check_config_has_appl:1,check_config_has_profil:1,check_instal:1,check_sourc:1,check_src:1,checkout:[1,13],chmod:1,choic:6,circumst:1,clash:1,classic:1,clean:[1,5,11,15],clean_al:[5,18],clean_build_aft:5,clean_instal:5,cleancolor:1,clear_lin:2,clear_screen:2,cli:[11,18],cli_:19,client:1,clone:13,close:1,closest:1,cmake:[1,5],cmake_opt:5,cmd:1,co7:12,code:[1,2,8],code_to_char:2,color:[1,2],colorama:[0,1],colorama_text:2,column:1,com:1,come:6,command:[1,2,14,16,18],command_nam:1,command_opt:18,command_r:1,command_valu:1,comment:[1,14],commentari:1,commit:4,common:1,commonli:1,compat:1,compil:[0,7,8,9,11,13,15],compil_script:5,complementari:8,complet:[5,6,13,14],complete_environ:1,compon:[1,3,9],componon:9,compress:12,comput:[1,9,12],concaten:1,concern:13,config:[1,13,14,15,18],config_has_appl:1,configerror:1,configformaterror:1,configinputstream:1,configlist:1,configmerg:1,configoutputstream:1,configread:1,configresolutionerror:1,configur:[1,15,19],configure_opt:1,configut:3,conflict:1,conform:9,consist:1,consol:1,construct:[1,15,17],contain:[1,14,19],content:0,context:[1,18],contextfileenviron:1,continu:1,control:12,conveni:1,convert:2,convert_ansi:2,convert_osc:2,copi:[1,3,6,10,18],copydir:1,copyfil:1,copylink:1,copyright:1,corba:9,correct:1,correl:1,correspond:[1,8,11,13],could:[1,4,8,16],cpp:[1,9],creat:[1,3,4,8,10,12,13,14,15],creation:12,current:[1,6,14,18,19],cursor_adjust:2,cvs:1,cvs_extract:1,cvs_info:13,cvspass:13,cwd:1,cyan:2,dai:1,data:[1,6,19],date:[1,14],date_to_datetim:1,datetim:1,david:1,dbg:1,debug:[0,6,8,13],debug_writ:1,decid:1,declar:13,deep:1,deepcopy_list:1,deepcopymap:1,def:[1,8,19],default_valu:1,defaultmergeresolv:1,defaultstreamopen:1,defin:[1,4,5,6,8,9,14,19],definit:1,deinit:2,delai:1,delaiapp:1,deleg:2,delet:12,delimit:1,delta:1,depend:[1,5,12],deriv:1,describ:1,descript:[1,19],design:1,destnam:1,detail:1,detar:16,detect:1,determin:1,dev:1,develop:[1,4,6,8,13,19],dict:1,dict_arg:1,dictionari:[1,14],differ:8,dim:2,dir:[1,6,13],dir_info:13,directli:[8,11,16],directori:[1,3,4,5,6,8,10,11,12,13,14,16,18,19],dirpath:1,displai:[1,5,6,7,11,19],distant:3,distinguish:8,distrib:1,distribut:[1,3,9],divis:1,dixt:1,do_batch_script_build:1,do_default_build:1,do_python_script_build:1,do_script_build:1,doc:15,doctyp:1,document:[7,9,14,19],doe:[1,8,13],dollar:1,don:9,done:[8,18],dot:1,dove:1,down:2,download:[1,13],drive:1,dst:1,due:1,dump:1,duplic:5,dure:13,dynam:14,each:[1,3,10,13,14],earlier:1,earliest:1,echo:1,edit:[6,7,13],editor:[1,6,7,14],eearch:1,either:[1,8],eleg:1,elem:1,element:1,element_factori:1,elementtre:0,els:[1,19],embed:12,empti:1,enable_simple_env_script:1,enclos:1,encod:1,end:[1,2,8],end_writ:1,ensur:1,ensure_path_exist:1,entri:1,env:8,env_build:8,env_info:1,env_launch:8,env_script:8,environ:[0,9,14,15],equal:5,eras:11,erase_lin:2,erase_screen:2,error:1,etc:[1,14,15],etre:1,eval:1,evalu:1,event:1,everyth:5,evinc:7,exactli:1,exampl:[1,4,5,6,7,8,12,13,15,18],exc:1,except:[1,13,18],execut:[1,5,13,18],exhaust:[14,18],exist:[1,12,13,18],exot:1,expect:1,explain:8,explicitli:1,explor:6,express:[1,6],extens:[1,19],extra:1,extract:1,extract_param:2,fact:19,factor:1,factori:1,fail:[1,5],fals:[1,2],far:1,favorit:6,feed:1,field:1,file:[1,3,5,6,7,8,10,11,12,13,14,15,19],file_nam:1,file_path:1,fileenviron:0,fileenvwrit:1,filein:1,filenam:1,filepath:1,filter:[1,4],filterlevel:1,filterlist2:1,fin:1,find:[1,6,15,16],find_file_in_lpath:1,find_node_by_attrib:1,findal:1,findconfig:1,findtext:1,finish:1,firefox:[7,11,14],first:[1,8,13,19],fix:1,flag:5,flush:1,fmt:1,follow:[1,8,19],for_packag:1,forbuild:1,forc:[1,12,13],force_patch:13,fore:2,forget:1,fork:0,form:1,format:[1,7,8,14],forward:[2,3,10],found:1,four:8,french:19,from:[1,2,6,7,8,9,12,13,19],from_what:1,fromstr:1,full:1,full_launched_command:1,fun:6,func:1,futur:1,gdb:8,gedit:7,gencat:[3,10],gener:[1,2,3,8,10,15,18],generate_launching_command:1,generate_script:1,generic_opt:18,geom:5,get:[1,6,7,13,14,19],get_attr:2,get_attrib:1,get_base_install_dir:1,get_base_path:1,get_cfg_param:1,get_distrib_vers:1,get_distribut:1,get_file_environ:1,get_help:1,get_install_dir:1,get_launcher_nam:1,get_log_path:1,get_method:13,get_nam:1,get_nb_proc:1,get_node_text:1,get_posit:2,get_product_compon:1,get_product_config:1,get_product_depend:1,get_product_sect:1,get_products_info:1,get_property_in_product_cfg:1,get_python_vers:1,get_salome_vers:1,get_test_timeout:1,get_tmp_dir:1,get_tmp_filenam:1,get_us:1,get_win32_cal:2,getbypath:1,getchar:1,getdetailopt:1,getiter:1,getlocalenv:1,getroot:1,getrootattrib:1,getstrconfigdbg:1,getstrconfigstd:1,gettmpdir:1,gettmpdirdefault:1,gettoken:1,git:[1,12],git_extract:1,git_info:13,gitconfig:13,give:[1,3,14,19],given:[1,2,3,8,10],global:1,goe:1,green:2,grei:2,grep:6,grid:1,gui:1,hack_libtool:1,had:1,handl:[1,2,8],handlemismatch:1,handleremovereadonli:1,hard:1,harri:1,has:[1,2,8,19],has_salome_hui:1,has_timed_out:1,hat:1,have:[1,3,4,9,10,13],header:1,help:[1,19],helpstr:1,here:[1,8,14,19],hierarchi:1,highlight:1,himself:8,hold:10,home:6,hour:1,how:[1,7,8,13,14],html:[1,7],http:[1,2],hxx2salom:9,ident:1,identifi:1,ignor:[1,9],ignorelist:1,imag:13,implement:[1,2,8],includ:[1,8,12,14],indent:1,index:1,indic:1,indirect:1,info:[1,6,13],inform:[1,6,7,12,13,14],init:[1,2],initi:1,initialis:[0,1],inmap:1,input:1,input_list:1,insid:13,instal:[1,4,5,14,15,18],install_dir:8,instanc:[1,2,19],instanti:1,instead:1,instream:1,instruct:[1,14],intal:12,interact:11,interfac:[1,18],intern:1,invalid:1,ioerror:1,iostream:1,is_a_tti:2,is_defin:1,is_salome_modul:[4,8],is_stream_clos:2,is_window:1,isdir:1,isel:1,isfil:1,islink:1,issu:2,isword:1,item:1,iter:1,iteritem:1,iterkei:1,iterpars:1,its:[1,5,6,8,14],ivar:1,jane:1,job:5,join:8,just:[1,5],keep:1,kei:[1,8,13],kernel:[1,6,18],killsalom:1,know:[1,13],known:12,kwarg:2,kwd:2,label:[1,6],lanch:1,lapack:8,lapack_root_dir:8,last:[1,8,11],last_termin:11,later:12,latter:1,launch:[1,8],launch_command:1,launcher:[1,3,8,15],launcher_nam:10,launcherfileenviron:1,layer:9,ld_library_path:8,left:8,level:[1,18,19],lhs:1,lib:8,librari:1,light:2,lightblack_ex:2,lightblue_ex:2,lightcyan_ex:2,lightgreen_ex:2,lightmagenta_ex:2,lightred_ex:2,lightwhite_ex:2,lightyellow_ex:2,like:[1,2,3,5,6,10,14],line:[1,6,18],link:[1,13],list:[1,3,4,6,10,14],list_log_fil:1,list_of_product:9,listtest:1,llvm:[3,10],load:[1,14],load_cfg_environ:1,load_environ:1,local:[6,7],locat:1,log:[1,5,15,19],log_command:1,log_dir:11,log_file_nam:1,logdir:1,logfilepath:1,logger:0,login:13,logo:[1,10],lome:15,longnam:1,lost:1,lpath:1,lproduct:1,machin:[1,3,9,10,12],machine1:3,machine2:3,machine3:3,magenta:2,mai:13,main:5,make:[1,5],make_flag:5,make_opt:1,makepath:1,manag:[1,6,13],manipul:[1,6],map1:1,map2:1,map:1,match:1,max:1,mechan:[1,8],med:5,memori:[3,10],menu:11,merg:1,merge:1,merge_dict:1,mergemap:1,mergesequ:1,mesa:[1,3,10],messag:[1,19],method:[1,2,5,8,13,19],micro_command:1,minim:1,minut:1,mismatch:1,miss:[3,5],mistak:13,mode:[1,2,4,6,8,11,18],model:19,modifi:[1,7,8,13],modul:[0,3,5,9,10,13,14,15],mon:1,mond:19,more:[1,18],most:[1,8,19],multi:1,multilin:1,multipl:1,must:[1,19],my_application_directori:3,my_application_nam:3,my_tag:13,mycommand:19,mydebug:1,myoption:19,myspecificnam:12,mytempl:1,name:[1,3,4,6,8,10,12,13,14,18,19],name_nod:1,namespac:1,nativ:[1,8],nb_line:1,nb_proc:[1,5],need:[1,2,3,9,13],new_nam:6,next:1,nfirst:1,no_label:6,node:1,node_nam:1,non:2,none:[1,2],nor:2,normal:[1,2],note:[1,3,8,10,14],noth:[1,12],notimplementederror:1,notion:1,notshowncommand:1,number:[1,3,5,10,11],number_of_proc:1,obj1:1,obj2:1,object:[1,2,14],obtain:1,obvious:1,occur:1,ode:1,old:1,older:11,on_stderr:2,onc:13,one:[1,6],onli:[1,3,4,5,6,8,9,10,11,13,18],only_numb:1,ool:15,open:1,openggl:[3,10],openmpi:1,oper:[1,6,15],operand:1,opt_nb_proc:1,option:[0,2,3,5,6,8,9,10,11,12,13,14,19],optionali:1,optiontyp:1,optresult:1,order:[1,13,14,19],org:2,other:[1,8,12,14],otherwis:[1,13],our:2,out:1,out_dir:1,output:[1,2],output_verbose_level:1,outstream:1,overrid:[1,3],overwrit:1,overwritekei:1,overwritemergeresolv:1,overwritten:1,own:1,packag:[0,15,16],page:8,pair:1,param:[1,2],param_nam:1,paramet:[1,6,14,19],parameter_path:6,paramstr:2,paravi:[3,10],parent:1,parma:1,pars:[1,19],parse_arg:[1,19],parse_d:1,parseargu:1,parsefactor:1,parsekeyvaluepair:1,parsemap:1,parsemappingbodi:1,parser:[1,19],parserefer:1,parsescalar:1,parsesequ:1,parsesuffix:1,parseterm:1,parsevalu:1,part:[1,3,8,10],particular:1,pass:[1,14,19],passphras:13,password:13,patch:[1,6,13],path:[1,8,10],path_to_catalog:3,path_to_yacsgen:9,pattern:1,pdf:[6,7,15],pdf_viewer:7,pend:4,pendant:1,perform:[13,15],person:6,phase:1,platform:[2,8],pleas:[8,9],plugin:[1,5],pluma:[7,14],point:[1,19],pop_debug:1,popul:1,posit:2,possibl:[1,8,13,19],potenti:1,pprty:1,preced:1,prefer:[6,7,14],prefix:[1,8,14],prepar:[1,15,19],prepare_testbas:1,prepare_testbase_from_dir:1,prepare_testbase_from_git:1,prepare_testbase_from_svn:1,prepend:[1,8],prepend_valu:1,prereq_dir:8,prerequisit:[8,12,14,15,18],presenc:1,preset:1,pretti:1,previou:1,previous:4,print:[1,2,6,11],print_color_map:1,print_color_rang:1,print_help:1,print_info:1,print_valu:1,printc:1,printcerror:1,printchead:1,printchighlight:1,printcinfo:1,printclabel:1,printcolor:0,printcsuccess:1,printcwarn:1,problem:[1,3,10],procedur:1,process:13,processinginstruct:1,processor:[1,3,10],prod_dir:1,prod_info:1,produc:1,product1:[5,8,13],product2:[5,8,13],product:[0,4,5,6,8,9,10,12,13,15,19],product_cfg:1,product_compil:1,product_has_env_script:1,product_has_logo:1,product_has_patch:1,product_has_salome_gui:1,product_has_script:1,product_info:1,product_is_autotool:1,product_is_cmak:1,product_is_cpp:1,product_is_debug:1,product_is_dev:1,product_is_fix:1,product_is_gener:1,product_is_mpi:1,product_is_n:1,product_is_salom:1,product_is_sampl:[],product_is_smesh_plugin:1,product_is_vc:1,product_is_verbos:1,product_nam:1,profil:[1,10],program:1,programmat:8,progress:1,project:[6,8],properti:[1,4,8,9],protocol:[1,3],provid:[1,8,19],proxi:2,pubid:1,push:13,push_debug:1,put:1,put_initial_xml_field:1,put_txt_log_in_appli_log_dir:1,pv_plugin_path:1,pwd:1,pyconf:[0,5,6,8,13,14,19],python:[1,8,10,14,15,16,19],python_config:1,pythonpath:8,pythonpath_:8,qname:1,queri:[3,10],rais:[1,18],rang:1,raw:1,read:1,read_config_from_a_fil:1,read_result:1,reader:1,readi:13,readlin:1,readlink:1,readxmlfil:1,recurs:[1,6],red:[1,2],redefin:1,redirect:1,ref:1,refer:[1,9,14],reflect:1,regard:1,regular:1,reinit:[1,2],rel:[1,12],remain:[11,16],remainderarg:1,remark:3,remor:9,remot:[1,12],remov:[1,4,5,13],remove_item_from_list:1,removenamespac:1,renam:1,renint:1,replac:[1,3],replace_in_fil:1,report:1,repositori:[1,13],repres:1,represent:1,request:2,requir:[1,2,8,9],reserv:1,reset:2,reset_al:2,resolut:1,resolv:1,resourc:[3,10],respect:8,restor:[1,4],result:1,retriev:1,rhs:1,right:[1,8],root:[1,19],root_nod:1,rootnam:1,rst:7,rtype:1,run:[1,8,14,15,19],run_all_test:1,run_env_script:1,run_grid_test:1,run_script:1,run_session_test:1,run_simple_env_script:1,run_test:1,run_testbase_test:1,runappli:3,runner:19,ruud:1,sajip:1,salom:[1,3,4,5,6,8,9,10,12,14,16],salome_modul:1,salome_session_serv:1,salome_xx:[4,12,16,18],salome_xx_:12,salomecontext:1,salomeenviron:1,salometool:[1,3,6,8,12,14,15,16],same:[1,7],sampl:18,sat:[1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,19],satexcept:1,save:8,saveconfigdbg:1,saveconfigstd:1,scalar:1,screenenviron:1,screenonli:1,script:[1,5,6,8,10,14,15,16],script_nam:1,script_path:1,search:1,search_known_error:1,second:[1,8,19],section:[1,3,8,13],secur:13,see:[1,2,14,18],seen:1,select:12,self:1,semant:1,sep:[1,8],separ:1,seq1:1,seq2:1,seq:1,seqit:1,sequenc:[1,2],server:[1,13],servic:19,session:1,set:[1,3,4,8,10,14,15,19],set_a_product:1,set_application_env:1,set_attr:2,set_consol:2,set_cpp_env:1,set_cursor_posit:2,set_env:[1,8],set_env_build:8,set_env_launch:8,set_full_environ:1,set_native_env:[1,8],set_product:1,set_python_libdir:1,set_salome_generic_product_env:1,set_salome_minimal_product_env:1,set_titl:2,setconsoletextattribut:2,setpath:1,setstream:1,sever:[8,14],shallow:1,shell:[1,8],shortcut:1,shortnam:1,should:[1,8,9],should_wrap:2,show:[1,5,7,11],show_command_log:1,show_desktop:1,show_in_editor:1,show_patch:6,show_progress:1,show_warn:1,showinfo:1,shown:[1,5],sign:1,silent_sysstd:1,similar:1,simpl:[1,18,19],sinc:1,site:1,size:1,smaller:1,smart:1,smartcopi:1,smesh:1,softwar:13,some:[1,8,10,14,19],someon:8,sometim:4,sommeil:1,soon:5,sourc:[1,2,4,6,7,12,13],sources_without_dev:4,special_path_separ:1,specif:[1,3,4,8,9,10,12,14,18],specifi:[1,3,8,9,10,13],splashscreen:10,src:19,src_root:1,sre_pattern:[1,2],ssh:[3,10,13],stack:18,start:[1,2,3,5,10],statu:1,stderr:1,stdout:[1,2],step:1,stop:5,stop_first_fail:5,store:[1,5,6,11,13,14],str:1,str_num:1,stream:[1,2],streamopen:1,streamorfil:1,streamwrapp:2,strin:1,string:1,stringio:1,strip:2,strout:1,structur:14,stuff:[1,10],style:[1,2],stylesheet:1,sub:[1,14],subclass:1,subel:1,submodul:0,subpackag:0,subsect:8,subset:12,subst_dic:1,substitut:1,subtract:1,success:[1,5],successfulli:1,suffici:8,suffix:1,suit:15,suitabl:1,support:1,supposedli:1,suppress:4,svn:[1,12],svn_extract:1,svn_info:13,symlink:1,syntax:[1,4],sys:1,system:[0,12],tab:1,tabl:1,tag:[1,13],take:[1,4],taken:[1,8],tar:[12,16],target:[1,3,8],tcllibpath:1,templat:0,template_fil:1,temporari:1,term:1,termin:[1,2,5,11,19],test:[1,5,15],test_base_nam:1,test_config:1,test_grid:1,test_modul:0,test_nam:1,test_sess:1,testbas:1,testbase_bas:1,testbase_dir:1,testbase_nam:1,testbase_tag:1,text:[1,2,7,18],text_or_uri:1,tgz:[12,16],thank:1,thei:[4,6,8,13],them:[2,13],thi:[1,2,3,5,6,8,9,10,12,13,14,15,19],thing:19,those:9,through:[3,8,10,11],thrown:1,time:[1,4,8,13,14],timedelta:1,timedelta_total_second:1,titl:[1,2],tklibpath:1,tmp_working_dir:1,tofix:1,token:1,token_typ:1,token_valu:1,top:1,tostr:1,total_second:1,tout:19,trace:18,transform:1,transpar:2,tree:1,treebuild:1,trust_root_dir:8,tty:2,tupl:1,turn:1,tutori:1,two:[1,8],txt:1,type:[1,13],typeerror:1,unabl:1,unchang:1,unconditionali:[1,18],under:[1,15],underscor:[1,8],unicod:1,unit:5,unless:[2,13],updat:1,update_hat_xml:1,updatehatxml:1,urllib2:1,urlopen:1,usag:[1,15],use:[1,3,5,8,10,11,12,13,14,16],use_mesa:[3,10],used:[1,3,5,6,7,8,11,12,13,14,15],useful:[8,10,19],user:[1,6,7,8,11,12,16,18],usernam:1,uses:[1,8,9,13,14],using:[1,2,9],usr:8,usual:[4,9,12,14,16,18],utf:[1,8],util:[1,12,15],valid:1,valu:[1,2,3,4,6,13,14],variabl:[1,8,9,19],vcs:1,verbos:[1,19],verifi:[1,13],version:[1,8,9,12,14,15],via:1,viewer:[6,7],vinai:1,virtual:[1,3],virtual_app:3,visualis:8,wai:[1,5,19],want:[1,4,8,19],warn:[1,5],web:[6,7,11,14],welcom:1,welkom:1,well:1,were:1,what:[1,4],when:[1,3,8,13,14,19],whenev:1,where:[1,3,5,6,12],which:[1,2,8,9,14,19],white:2,who:9,wiki:2,wikipedia:2,wil:8,win32:[0,1],winapi_test:2,wincolor:2,window:[1,2,8],winstyl:2,winterm:[0,1],with_children:5,with_commerci:1,with_fath:5,with_install_dir:1,with_vc:12,within:8,without:[1,6,13],without_properti:12,wmake:1,word:1,work:[1,6,12,13,14],workdir:[1,3,6,10,12,14,18,19],world:19,would:1,wrap:2,wrap_stream:2,writabl:1,write:[1,2,19],write_and_convert:2,write_back:1,write_cfgforpy_fil:1,write_env_fil:1,write_plain_text:2,write_report:1,write_test_margin:1,write_tre:1,writetostream:1,writevalu:1,written:19,www:1,xa4:1,xc2:1,xml:[1,19],xmllogfil:1,xmlmanag:0,xmlroot:1,xmltreebuild:1,xxx:[4,14],xxx_root_dir:1,xxx_src_dir:1,yac:1,yacsgen:[1,9],yacsgen_root_dir:9,year:1,yellow:2,yes:[1,4,8,9,13],yet:18,yield:1,you:[1,3,4,8,10,13,15,19],your:[1,7,8,13,18,19],yourspecificnam:12,yve:1,yyi:14,yyyi:1,yyyymmdd_hhmmss:1,yyyymmdd_hhmmss_namecmd:1,zelaunch:10,zero:1,zerodivideerror:1},titles:["src","src package","src.colorama package","Command application","Command clean","Command compile","Command config","Command doc","Command environ","Command generate","Command launcher","Command log","Command package","Command prepare","Configuration","Salome Tools","Installation","Release notes","Usage of SAlomeTools","Add a user custom command"],titleterms:{"var":14,VCS:13,access:19,add:19,ansi:2,ansitowin32:2,applic:[3,14],architectur:1,avail:[4,18],base:13,basic:19,build:18,clean:4,code:15,colorama:2,command:[3,4,5,6,7,8,9,10,11,12,13,15,19],compil:[1,5,18],config:[6,19],configur:[3,4,5,6,7,8,10,11,12,13,14],content:[1,2],custom:19,cvs:13,debug:[1,18],descript:[3,4,5,6,7,8,9,10,11,12,13,14],dev:13,develop:15,doc:7,document:15,elementtre:1,environ:[1,8],exampl:19,fileenviron:1,fork:1,gener:9,get:18,git:13,hello:19,help:18,howto:19,initialis:2,instal:16,introduct:19,launcher:10,list:[15,18],log:11,logger:[1,19],mode:13,modul:[1,2],note:[15,17],option:[1,4,18],other:19,packag:[1,2,12],path:[3,4,5,6,7,11,12,13],prepar:[13,18],printcolor:1,product:[1,14,18],pyconf:1,quick:15,releas:[15,17],remark:[9,13],requir:19,salom:[15,18],salometool:[18,19],sat:18,section:14,some:[3,4,5,6,7,11,12,13],sourc:18,src:[0,1,2],start:15,submodul:[1,2],subpackag:1,svn:13,syntax:14,system:1,templat:1,test_modul:1,tool:15,usag:[3,4,5,6,7,8,9,10,11,12,13,18],useful:[3,4,5,6,7,11,12,13],user:[14,19],verbos:18,win32:2,winterm:2,xmlmanag:1}})
\ No newline at end of file
+Search.setIndex({docnames:["commands/apidoc/modules","commands/apidoc/src","commands/apidoc/src.colorama","commands/application","commands/clean","commands/compile","commands/config","commands/doc","commands/environ","commands/generate","commands/launcher","commands/log","commands/package","commands/prepare","configuration","index","installation_of_sat","release_notes/release_notes_5.0.0","usage_of_sat","write_command"],envversion:52,filenames:["commands/apidoc/modules.rst","commands/apidoc/src.rst","commands/apidoc/src.colorama.rst","commands/application.rst","commands/clean.rst","commands/compile.rst","commands/config.rst","commands/doc.rst","commands/environ.rst","commands/generate.rst","commands/launcher.rst","commands/log.rst","commands/package.rst","commands/prepare.rst","configuration.rst","index.rst","installation_of_sat.rst","release_notes/release_notes_5.0.0.rst","usage_of_sat.rst","write_command.rst"],objects:{"":{src:[1,0,0,"-"]},"src.ElementTree":{Comment:[1,1,1,""],Element:[1,1,1,""],ElementTree:[1,2,1,""],PI:[1,1,1,""],ProcessingInstruction:[1,1,1,""],QName:[1,2,1,""],SubElement:[1,1,1,""],TreeBuilder:[1,2,1,""],XML:[1,1,1,""],XMLTreeBuilder:[1,2,1,""],dump:[1,1,1,""],fromstring:[1,1,1,""],iselement:[1,1,1,""],iterparse:[1,2,1,""],parse:[1,1,1,""],tostring:[1,1,1,""]},"src.ElementTree.ElementTree":{find:[1,3,1,""],findall:[1,3,1,""],findtext:[1,3,1,""],getiterator:[1,3,1,""],getroot:[1,3,1,""],parse:[1,3,1,""],write:[1,3,1,""]},"src.ElementTree.TreeBuilder":{close:[1,3,1,""],data:[1,3,1,""],end:[1,3,1,""],start:[1,3,1,""]},"src.ElementTree.XMLTreeBuilder":{close:[1,3,1,""],doctype:[1,3,1,""],feed:[1,3,1,""]},"src.ElementTree.iterparse":{next:[1,3,1,""]},"src.Path":{base:[1,3,1,""],chmod:[1,3,1,""],copy:[1,3,1,""],copydir:[1,3,1,""],copyfile:[1,3,1,""],copylink:[1,3,1,""],dir:[1,3,1,""],exists:[1,3,1,""],isdir:[1,3,1,""],isfile:[1,3,1,""],islink:[1,3,1,""],list:[1,3,1,""],make:[1,3,1,""],readlink:[1,3,1,""],rm:[1,3,1,""],smartcopy:[1,3,1,""],symlink:[1,3,1,""]},"src.architecture":{get_distrib_version:[1,1,1,""],get_distribution:[1,1,1,""],get_nb_proc:[1,1,1,""],get_python_version:[1,1,1,""],get_user:[1,1,1,""],is_windows:[1,1,1,""]},"src.colorama":{ansi:[2,0,0,"-"],ansitowin32:[2,0,0,"-"],initialise:[2,0,0,"-"],win32:[2,0,0,"-"],winterm:[2,0,0,"-"]},"src.colorama.ansi":{AnsiBack:[2,2,1,""],AnsiCodes:[2,2,1,""],AnsiCursor:[2,2,1,""],AnsiFore:[2,2,1,""],AnsiStyle:[2,2,1,""],clear_line:[2,1,1,""],clear_screen:[2,1,1,""],code_to_chars:[2,1,1,""],set_title:[2,1,1,""]},"src.colorama.ansi.AnsiBack":{BLACK:[2,5,1,""],BLUE:[2,5,1,""],CYAN:[2,5,1,""],GREEN:[2,5,1,""],LIGHTBLACK_EX:[2,5,1,""],LIGHTBLUE_EX:[2,5,1,""],LIGHTCYAN_EX:[2,5,1,""],LIGHTGREEN_EX:[2,5,1,""],LIGHTMAGENTA_EX:[2,5,1,""],LIGHTRED_EX:[2,5,1,""],LIGHTWHITE_EX:[2,5,1,""],LIGHTYELLOW_EX:[2,5,1,""],MAGENTA:[2,5,1,""],RED:[2,5,1,""],RESET:[2,5,1,""],WHITE:[2,5,1,""],YELLOW:[2,5,1,""]},"src.colorama.ansi.AnsiCursor":{BACK:[2,3,1,""],DOWN:[2,3,1,""],FORWARD:[2,3,1,""],POS:[2,3,1,""],UP:[2,3,1,""]},"src.colorama.ansi.AnsiFore":{BLACK:[2,5,1,""],BLUE:[2,5,1,""],CYAN:[2,5,1,""],GREEN:[2,5,1,""],LIGHTBLACK_EX:[2,5,1,""],LIGHTBLUE_EX:[2,5,1,""],LIGHTCYAN_EX:[2,5,1,""],LIGHTGREEN_EX:[2,5,1,""],LIGHTMAGENTA_EX:[2,5,1,""],LIGHTRED_EX:[2,5,1,""],LIGHTWHITE_EX:[2,5,1,""],LIGHTYELLOW_EX:[2,5,1,""],MAGENTA:[2,5,1,""],RED:[2,5,1,""],RESET:[2,5,1,""],WHITE:[2,5,1,""],YELLOW:[2,5,1,""]},"src.colorama.ansi.AnsiStyle":{BRIGHT:[2,5,1,""],DIM:[2,5,1,""],NORMAL:[2,5,1,""],RESET_ALL:[2,5,1,""]},"src.colorama.ansitowin32":{AnsiToWin32:[2,2,1,""],StreamWrapper:[2,2,1,""],is_a_tty:[2,1,1,""],is_stream_closed:[2,1,1,""]},"src.colorama.ansitowin32.AnsiToWin32":{ANSI_CSI_RE:[2,5,1,""],ANSI_OSC_RE:[2,5,1,""],call_win32:[2,3,1,""],convert_ansi:[2,3,1,""],convert_osc:[2,3,1,""],extract_params:[2,3,1,""],get_win32_calls:[2,3,1,""],reset_all:[2,3,1,""],should_wrap:[2,3,1,""],write:[2,3,1,""],write_and_convert:[2,3,1,""],write_plain_text:[2,3,1,""]},"src.colorama.ansitowin32.StreamWrapper":{write:[2,3,1,""]},"src.colorama.initialise":{colorama_text:[2,1,1,""],deinit:[2,1,1,""],init:[2,1,1,""],reinit:[2,1,1,""],reset_all:[2,1,1,""],wrap_stream:[2,1,1,""]},"src.colorama.win32":{SetConsoleTextAttribute:[2,1,1,""],winapi_test:[2,1,1,""]},"src.colorama.winterm":{WinColor:[2,2,1,""],WinStyle:[2,2,1,""],WinTerm:[2,2,1,""]},"src.colorama.winterm.WinColor":{BLACK:[2,5,1,""],BLUE:[2,5,1,""],CYAN:[2,5,1,""],GREEN:[2,5,1,""],GREY:[2,5,1,""],MAGENTA:[2,5,1,""],RED:[2,5,1,""],YELLOW:[2,5,1,""]},"src.colorama.winterm.WinStyle":{BRIGHT:[2,5,1,""],BRIGHT_BACKGROUND:[2,5,1,""],NORMAL:[2,5,1,""]},"src.colorama.winterm.WinTerm":{back:[2,3,1,""],cursor_adjust:[2,3,1,""],erase_line:[2,3,1,""],erase_screen:[2,3,1,""],fore:[2,3,1,""],get_attrs:[2,3,1,""],get_position:[2,3,1,""],reset_all:[2,3,1,""],set_attrs:[2,3,1,""],set_console:[2,3,1,""],set_cursor_position:[2,3,1,""],set_title:[2,3,1,""],style:[2,3,1,""]},"src.compilation":{Builder:[1,2,1,""]},"src.compilation.Builder":{build_configure:[1,3,1,""],check:[1,3,1,""],cmake:[1,3,1,""],complete_environment:[1,3,1,""],configure:[1,3,1,""],do_batch_script_build:[1,3,1,""],do_default_build:[1,3,1,""],do_python_script_build:[1,3,1,""],do_script_build:[1,3,1,""],hack_libtool:[1,3,1,""],install:[1,3,1,""],log:[1,3,1,""],log_command:[1,3,1,""],make:[1,3,1,""],prepare:[1,3,1,""],put_txt_log_in_appli_log_dir:[1,3,1,""],wmake:[1,3,1,""]},"src.debug":{InStream:[1,2,1,""],OutStream:[1,2,1,""],format_color_exception:[1,1,1,""],format_exception:[1,1,1,""],getLocalEnv:[1,1,1,""],getStrConfigDbg:[1,1,1,""],getStrConfigStd:[1,1,1,""],indent:[1,1,1,""],isTypeConfig:[1,1,1,""],pop_debug:[1,1,1,""],push_debug:[1,1,1,""],saveConfigDbg:[1,1,1,""],saveConfigStd:[1,1,1,""],tofix:[1,1,1,""],write:[1,1,1,""]},"src.debug.OutStream":{close:[1,3,1,""]},"src.environment":{Environ:[1,2,1,""],FileEnvWriter:[1,2,1,""],SalomeEnviron:[1,2,1,""],Shell:[1,2,1,""],load_environment:[1,1,1,""]},"src.environment.Environ":{append:[1,3,1,""],append_value:[1,3,1,""],command_value:[1,3,1,""],get:[1,3,1,""],is_defined:[1,3,1,""],prepend:[1,3,1,""],prepend_value:[1,3,1,""],set:[1,3,1,""]},"src.environment.FileEnvWriter":{write_cfgForPy_file:[1,3,1,""],write_env_file:[1,3,1,""]},"src.environment.SalomeEnviron":{add_comment:[1,3,1,""],add_line:[1,3,1,""],add_warning:[1,3,1,""],append:[1,3,1,""],dump:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],get_names:[1,3,1,""],is_defined:[1,3,1,""],load_cfg_environment:[1,3,1,""],prepend:[1,3,1,""],run_env_script:[1,3,1,""],run_simple_env_script:[1,3,1,""],set:[1,3,1,""],set_a_product:[1,3,1,""],set_application_env:[1,3,1,""],set_cpp_env:[1,3,1,""],set_full_environ:[1,3,1,""],set_products:[1,3,1,""],set_python_libdirs:[1,3,1,""],set_salome_generic_product_env:[1,3,1,""],set_salome_minimal_product_env:[1,3,1,""]},"src.fileEnviron":{BashFileEnviron:[1,2,1,""],BatFileEnviron:[1,2,1,""],ContextFileEnviron:[1,2,1,""],FileEnviron:[1,2,1,""],LauncherFileEnviron:[1,2,1,""],ScreenEnviron:[1,2,1,""],get_file_environ:[1,1,1,""],special_path_separator:[1,1,1,""]},"src.fileEnviron.BashFileEnviron":{command_value:[1,3,1,""],finish:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.BatFileEnviron":{add_comment:[1,3,1,""],command_value:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.ContextFileEnviron":{add_echo:[1,3,1,""],add_warning:[1,3,1,""],append_value:[1,3,1,""],command_value:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],prepend_value:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.FileEnviron":{add_comment:[1,3,1,""],add_echo:[1,3,1,""],add_line:[1,3,1,""],add_warning:[1,3,1,""],append:[1,3,1,""],append_value:[1,3,1,""],command_value:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],is_defined:[1,3,1,""],prepend:[1,3,1,""],prepend_value:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.LauncherFileEnviron":{add:[1,3,1,""],add_comment:[1,3,1,""],add_echo:[1,3,1,""],add_line:[1,3,1,""],add_warning:[1,3,1,""],append:[1,3,1,""],append_value:[1,3,1,""],change_to_launcher:[1,3,1,""],command_value:[1,3,1,""],finish:[1,3,1,""],get:[1,3,1,""],is_defined:[1,3,1,""],prepend:[1,3,1,""],prepend_value:[1,3,1,""],set:[1,3,1,""]},"src.fileEnviron.ScreenEnviron":{add_comment:[1,3,1,""],add_echo:[1,3,1,""],add_line:[1,3,1,""],add_warning:[1,3,1,""],append:[1,3,1,""],command_value:[1,3,1,""],get:[1,3,1,""],is_defined:[1,3,1,""],prepend:[1,3,1,""],run_env_script:[1,3,1,""],set:[1,3,1,""],write:[1,3,1,""]},"src.fork":{batch:[1,1,1,""],batch_salome:[1,1,1,""],launch_command:[1,1,1,""],show_progress:[1,1,1,""],write_back:[1,1,1,""]},"src.logger":{Logger:[1,2,1,""],date_to_datetime:[1,1,1,""],getCurrentLogger:[1,1,1,""],getDefaultLogger:[1,1,1,""],getUnittestLogger:[1,1,1,""],isCurrentLoggerUnittest:[1,1,1,""],list_log_file:[1,1,1,""],sendMessageToCurrentLogger:[1,1,1,""],setCurrentLogger:[1,1,1,""],show_command_log:[1,1,1,""],timedelta_total_seconds:[1,1,1,""],update_hat_xml:[1,1,1,""]},"src.logger.Logger":{add_link:[1,3,1,""],end_write:[1,3,1,""],error:[1,3,1,""],flush:[1,3,1,""],put_initial_xml_fields:[1,3,1,""],write:[1,3,1,""]},"src.options":{OptResult:[1,2,1,""],Options:[1,2,1,""]},"src.options.Options":{add_option:[1,3,1,""],debug_write:[1,3,1,""],filterLevel:[1,3,1,""],filterList2:[1,3,1,""],getDetailOption:[1,3,1,""],get_help:[1,3,1,""],indent:[1,3,1,""],parse_args:[1,3,1,""]},"src.printcolors":{cleancolor:[1,1,1,""],print_color_map:[1,1,1,""],print_color_range:[1,1,1,""],print_value:[1,1,1,""],printc:[1,1,1,""],printcError:[1,1,1,""],printcHeader:[1,1,1,""],printcHighlight:[1,1,1,""],printcInfo:[1,1,1,""],printcLabel:[1,1,1,""],printcSuccess:[1,1,1,""],printcWarning:[1,1,1,""]},"src.product":{check_config_exists:[1,1,1,""],check_installation:[1,1,1,""],check_source:[1,1,1,""],get_base_install_dir:[1,1,1,""],get_install_dir:[1,1,1,""],get_product_components:[1,1,1,""],get_product_config:[1,1,1,""],get_product_dependencies:[1,1,1,""],get_product_section:[1,1,1,""],get_products_infos:[1,1,1,""],product_compiles:[1,1,1,""],product_has_env_script:[1,1,1,""],product_has_logo:[1,1,1,""],product_has_patches:[1,1,1,""],product_has_salome_gui:[1,1,1,""],product_has_script:[1,1,1,""],product_is_autotools:[1,1,1,""],product_is_cmake:[1,1,1,""],product_is_cpp:[1,1,1,""],product_is_debug:[1,1,1,""],product_is_dev:[1,1,1,""],product_is_fixed:[1,1,1,""],product_is_generated:[1,1,1,""],product_is_mpi:[1,1,1,""],product_is_native:[1,1,1,""],product_is_salome:[1,1,1,""],product_is_smesh_plugin:[1,1,1,""],product_is_vcs:[1,1,1,""],product_is_verbose:[1,1,1,""]},"src.pyconf":{Config:[1,2,1,""],ConfigError:[1,4,1,""],ConfigFormatError:[1,4,1,""],ConfigInputStream:[1,2,1,""],ConfigList:[1,2,1,""],ConfigMerger:[1,2,1,""],ConfigOutputStream:[1,2,1,""],ConfigReader:[1,2,1,""],ConfigResolutionError:[1,4,1,""],Container:[1,2,1,""],Expression:[1,2,1,""],Mapping:[1,2,1,""],Reference:[1,2,1,""],Sequence:[1,2,1,""],deepCopyMapping:[1,1,1,""],defaultMergeResolve:[1,1,1,""],defaultStreamOpener:[1,1,1,""],isWord:[1,1,1,""],makePath:[1,1,1,""],overwriteMergeResolve:[1,1,1,""]},"src.pyconf.Config":{Namespace:[1,2,1,""],addNamespace:[1,3,1,""],getByPath:[1,3,1,""],load:[1,3,1,""],removeNamespace:[1,3,1,""]},"src.pyconf.ConfigInputStream":{close:[1,3,1,""],read:[1,3,1,""],readline:[1,3,1,""]},"src.pyconf.ConfigList":{getByPath:[1,3,1,""]},"src.pyconf.ConfigMerger":{handleMismatch:[1,3,1,""],merge:[1,3,1,""],mergeMapping:[1,3,1,""],mergeSequence:[1,3,1,""],overwriteKeys:[1,3,1,""]},"src.pyconf.ConfigOutputStream":{close:[1,3,1,""],flush:[1,3,1,""],write:[1,3,1,""]},"src.pyconf.ConfigReader":{getChar:[1,3,1,""],getToken:[1,3,1,""],load:[1,3,1,""],location:[1,3,1,""],match:[1,3,1,""],parseFactor:[1,3,1,""],parseKeyValuePair:[1,3,1,""],parseMapping:[1,3,1,""],parseMappingBody:[1,3,1,""],parseReference:[1,3,1,""],parseScalar:[1,3,1,""],parseSequence:[1,3,1,""],parseSuffix:[1,3,1,""],parseTerm:[1,3,1,""],parseValue:[1,3,1,""],setStream:[1,3,1,""]},"src.pyconf.Container":{evaluate:[1,3,1,""],setPath:[1,3,1,""],writeToStream:[1,3,1,""],writeValue:[1,3,1,""]},"src.pyconf.Expression":{evaluate:[1,3,1,""]},"src.pyconf.Mapping":{addMapping:[1,3,1,""],get:[1,3,1,""],iteritems:[1,3,1,""],iterkeys:[1,3,1,""],keys:[1,3,1,""],writeToStream:[1,3,1,""]},"src.pyconf.Reference":{addElement:[1,3,1,""],findConfig:[1,3,1,""],resolve:[1,3,1,""]},"src.pyconf.Sequence":{SeqIter:[1,2,1,""],append:[1,3,1,""],writeToStream:[1,3,1,""]},"src.pyconf.Sequence.SeqIter":{next:[1,3,1,""]},"src.system":{archive_extract:[1,1,1,""],cvs_extract:[1,1,1,""],git_extract:[1,1,1,""],show_in_editor:[1,1,1,""],svn_extract:[1,1,1,""]},"src.template":{MyTemplate:[1,2,1,""],substitute:[1,1,1,""]},"src.template.MyTemplate":{delimiter:[1,5,1,""],pattern:[1,5,1,""]},"src.test_module":{Test:[1,2,1,""],getTmpDirDEFAULT:[1,1,1,""]},"src.test_module.Test":{generate_launching_commands:[1,3,1,""],generate_script:[1,3,1,""],get_test_timeout:[1,3,1,""],get_tmp_dir:[1,3,1,""],prepare_testbase:[1,3,1,""],prepare_testbase_from_dir:[1,3,1,""],prepare_testbase_from_git:[1,3,1,""],prepare_testbase_from_svn:[1,3,1,""],read_results:[1,3,1,""],run_all_tests:[1,3,1,""],run_grid_tests:[1,3,1,""],run_script:[1,3,1,""],run_session_tests:[1,3,1,""],run_testbase_tests:[1,3,1,""],run_tests:[1,3,1,""],search_known_errors:[1,3,1,""],write_test_margin:[1,3,1,""]},"src.xmlManager":{ReadXmlFile:[1,2,1,""],XmlLogFile:[1,2,1,""],add_simple_node:[1,1,1,""],append_node_attrib:[1,1,1,""],find_node_by_attrib:[1,1,1,""],write_report:[1,1,1,""]},"src.xmlManager.ReadXmlFile":{getRootAttrib:[1,3,1,""],get_attrib:[1,3,1,""],get_node_text:[1,3,1,""]},"src.xmlManager.XmlLogFile":{add_simple_node:[1,3,1,""],append_node_attrib:[1,3,1,""],append_node_text:[1,3,1,""],write_tree:[1,3,1,""]},src:{ElementTree:[1,0,0,"-"],Path:[1,2,1,""],SatException:[1,4,1,""],activate_mesa_property:[1,1,1,""],architecture:[1,0,0,"-"],check_config_has_application:[1,1,1,""],check_config_has_profile:[1,1,1,""],colorama:[2,0,0,"-"],compilation:[1,0,0,"-"],config_has_application:[1,1,1,""],debug:[1,0,0,"-"],deepcopy_list:[1,1,1,""],ensure_path_exists:[1,1,1,""],environment:[1,0,0,"-"],fileEnviron:[1,0,0,"-"],find_file_in_lpath:[1,1,1,""],fork:[1,0,0,"-"],get_base_path:[1,1,1,""],get_cfg_param:[1,1,1,""],get_launcher_name:[1,1,1,""],get_log_path:[1,1,1,""],get_property_in_product_cfg:[1,1,1,""],get_salome_version:[1,1,1,""],get_tmp_filename:[1,1,1,""],handleRemoveReadonly:[1,1,1,""],logger:[1,0,0,"-"],merge_dicts:[1,1,1,""],only_numbers:[1,1,1,""],options:[1,0,0,"-"],parse_date:[1,1,1,""],print_info:[1,1,1,""],printcolors:[1,0,0,"-"],product:[1,0,0,"-"],pyconf:[1,0,0,"-"],read_config_from_a_file:[1,1,1,""],remove_item_from_list:[1,1,1,""],replace_in_file:[1,1,1,""],system:[1,0,0,"-"],template:[1,0,0,"-"],test_module:[1,0,0,"-"],xmlManager:[1,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","exception","Python exception"],"5":["py","attribute","Python attribute"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:method","4":"py:exception","5":"py:attribute"},terms:{"0x36fa5f0":[],"0x37b8f90":[],"0x37f8420":[],"0x44e4620":[],"0x4986ff0":[],"16be":1,"16le":1,"9abc":1,"boolean":[1,19],"case":1,"char":1,"class":[1,2,19],"default":[1,3,5,6,8,10,11,12,13,18,19],"export":13,"final":[1,6,13],"float":1,"function":[1,2,19],"import":[1,8,19],"int":[1,11],"long":[1,4],"new":[1,13,19],"return":[1,8,19],"short":1,"true":[1,2],"try":1,"var":[1,8,19],And:[1,6,8],But:19,CVS:12,For:[1,8,13,15,19],Has:1,One:1,POS:2,The:[1,3,4,5,6,7,8,9,10,11,12,13,14,15,18,19],Then:[13,14],There:14,These:8,Theses:4,Use:[3,4,5,6,8,9,10,13],Used:1,Useful:18,VCS:[4,12],__init__:[],__save__:1,__setattr__:1,_appli:3,_blank:1,_build:8,_debug:1,_developp:1,_launch:8,_ld_library_path:8,_sre:[1,2],_user:1,a_b_c_:1,abool:1,about:[1,14],absolut:12,access:[1,2,11],account:8,act:[1,2],action:1,activ:[1,13],activate_mesa_properti:1,actual:[1,2,16],add:[1,5,15],add_com:1,add_echo:1,add_lin:1,add_link:1,add_opt:[1,19],add_simple_nod:1,add_warn:1,added:1,addel:1,adding:19,addit:[1,5,14],additional_dir:1,additional_env:1,addmap:1,addnamespac:1,adequ:1,adot:1,advanc:1,affect:2,afil:1,after:[1,5,16],again:1,agent:13,aim:1,alevel:1,algorithm:19,all:[1,2,4,6,8,9,13,14,18,19],all_in_termin:1,allow:[1,5,6,9,15,18],alphanumer:1,alreadi:[12,19],also:[1,8,13,14,19],alter:13,amethodtodebug:1,amount:1,ani:[1,2,6,11,13],anoth:[1,14],ansi:[0,1],ansi_csi_r:2,ansi_escape_cod:2,ansi_osc_r:2,ansiback:2,ansicod:2,ansicursor:2,ansifor:2,ansistyl:2,ansitowin32:[0,1],apart:2,api:1,append:[1,8,12],append_node_attrib:1,append_node_text:1,append_valu:1,appli:[1,6,9,13],applic:[1,4,5,6,8,9,10,11,13,15,19],application_nam:3,appropri:1,arch:12,architectur:[0,12,14],archiv:[1,12,13],archive_extract:1,archive_info:13,arg:[1,2,19],arglist:1,argument:[1,19],ascii:[1,7],ask:1,assign:1,assum:1,astr:1,astream:1,atitl:1,attibut:1,attr:[1,2],attrib:1,attribut:[1,2],authent:13,author:1,automat:[6,8],autoreset:2,autotool:[1,5],avail:6,avari:1,avoid:13,award:1,back:2,backtick:1,base:[1,2,14],bash:[1,8,13],bashfileenviron:1,bat:[1,8],batch:1,batch_salom:1,batfileenviron:1,becaus:1,been:[1,2],befor:[1,5],begin:1,behavior:19,being:1,belong:1,below:8,between:[1,19],bienvenu:1,big:5,bigger:1,bin:8,binari:12,black:2,blogmatrix:1,blue:2,bom:1,bonjour:19,bool:1,both:[1,8,9],bracket:1,branch:13,bright:2,bright_background:2,bring:[9,13],browser:[1,6,7,11,14],buf:1,build:[1,4,5,8,14],build_conf_opt:1,build_configur:1,build_sourc:5,builder:1,built:1,call:[1,2,8,10,19],call_win32:2,callabl:1,can:[1,3,8,13,14,15,19],cannot:1,car:1,care:4,carri:1,catalog:[3,10],cfg:[1,8,19],cfg_env:1,cfgforpi:1,chang:[1,3,18,19],change_to_launch:1,charact:[1,2],charg:10,check:[1,5,8],check_config_exist:1,check_config_has_appl:1,check_config_has_profil:1,check_instal:1,check_sourc:1,check_src:1,checkout:[1,13],chmod:1,choic:6,circumst:1,clash:1,classic:1,clean:[1,5,11,15],clean_al:[5,18],clean_build_aft:5,clean_instal:5,cleancolor:1,clear_lin:2,clear_screen:2,cli:[11,18],cli_:19,client:1,clone:13,close:1,closest:1,cmake:[1,5],cmake_opt:5,cmd:1,co7:12,code:[1,2,8],code_to_char:2,color:[1,2],colorama:[0,1],colorama_text:2,column:1,com:1,come:6,command:[1,2,14,16,18],command_nam:1,command_opt:18,command_r:1,command_valu:1,comment:[1,14],commentari:1,commit:4,common:1,commonli:1,compat:1,compil:[0,7,8,9,11,13,15],compil_script:5,complementari:8,complet:[5,6,13,14],complete_environ:1,compon:[1,3,9],componon:9,compress:12,comput:[1,9,12],concaten:1,concern:13,config:[1,13,14,15,18],config_has_appl:1,configerror:1,configformaterror:1,configinputstream:1,configlist:1,configmerg:1,configoutputstream:1,configread:1,configresolutionerror:1,configur:[1,15,19],configure_opt:1,configut:3,conflict:1,conform:9,consist:1,consol:1,construct:[1,15,17],contain:[1,14,19],content:0,context:[1,18],contextfileenviron:1,continu:1,control:12,conveni:1,convert:2,convert_ansi:2,convert_osc:2,copi:[1,3,6,10,18],copydir:1,copyfil:1,copylink:1,copyright:1,corba:9,correct:1,correl:1,correspond:[1,8,11,13],could:[1,4,8,16],cpp:[1,9],creat:[1,3,4,8,10,12,13,14,15],creation:12,critic:1,current:[1,6,14,18,19],cursor_adjust:2,cvs:1,cvs_extract:1,cvs_info:13,cvspass:13,cwd:1,cyan:2,dai:1,data:[1,6,19],date:[1,14],date_to_datetim:1,datetim:1,david:1,dbg:1,debug:[0,6,8,13],debug_writ:1,decid:1,declar:13,deep:1,deepcopy_list:1,deepcopymap:1,def:[1,8,19],default_valu:1,defaultlogg:1,defaultmergeresolv:1,defaultstreamopen:1,defin:[1,4,5,6,8,9,14,19],definit:1,deinit:2,delai:1,delaiapp:1,deleg:2,delet:12,delimit:1,delta:1,depend:[1,5,12],deriv:1,describ:1,descript:[1,19],design:1,destnam:1,detail:1,detar:16,detect:1,determin:1,dev:1,develop:[1,4,6,8,13,19],dict:1,dict_arg:1,dictionari:[1,14],differ:8,dim:2,dir:[1,6,13],dir_info:13,directli:[8,11,16],directori:[1,3,4,5,6,8,10,11,12,13,14,16,18,19],dirpath:1,displai:[1,5,6,7,11,19],distant:3,distinguish:8,distrib:1,distribut:[1,3,9],divis:1,dixt:1,do_batch_script_build:1,do_default_build:1,do_python_script_build:1,do_script_build:1,doc:15,doctyp:1,document:[7,9,14,19],doe:[1,8,13],dollar:1,don:9,done:[8,18],dot:1,dove:1,down:2,download:[1,13],drive:1,dst:1,due:1,dump:1,duplic:5,dure:13,dynam:14,each:[1,3,10,13,14],earlier:1,earliest:1,echo:1,edit:[6,7,13],editor:[1,6,7,14],eearch:1,either:[1,8],eleg:1,elem:1,element:1,element_factori:1,elementtre:0,els:[1,19],embed:12,empti:1,enable_simple_env_script:1,enclos:1,encod:1,end:[1,2,8],end_writ:1,ensur:1,ensure_path_exist:1,entri:1,env:8,env_build:8,env_info:1,env_launch:8,env_script:8,environ:[0,9,14,15],equal:5,eras:11,erase_lin:2,erase_screen:2,error:1,etc:[1,14,15],etre:1,eval:1,evalu:1,event:1,everyth:5,evinc:7,exactli:1,exampl:[1,4,5,6,7,8,12,13,15,18],exc:1,except:[1,13,18],execut:[1,5,13,18],exhaust:[14,18],exist:[1,12,13,18],exot:1,expect:1,explain:8,explicitli:1,explor:6,express:[1,6],extens:[1,19],extra:1,extract:1,extract_param:2,fact:19,factor:1,factori:1,fail:[1,5],fals:[1,2],far:1,favorit:6,feed:1,field:1,file:[1,3,5,6,7,8,10,11,12,13,14,15,19],file_nam:1,file_path:1,fileenviron:0,fileenvwrit:1,filein:1,filenam:1,filepath:1,filter:[1,4],filterlevel:1,filterlist2:1,fin:1,find:[1,6,15,16],find_file_in_lpath:1,find_node_by_attrib:1,findal:1,findconfig:1,findtext:1,finish:1,firefox:[7,11,14],first:[1,8,13,19],fix:1,flag:5,flush:1,fmt:1,follow:[1,8,19],for_packag:1,forbuild:1,forc:[1,12,13],force_patch:13,fore:2,forget:1,fork:0,form:1,format:[1,7,8,14],format_color_except:1,format_except:1,forward:[2,3,10],found:1,four:8,french:19,from:[1,2,6,7,8,9,12,13,19],from_what:1,fromstr:1,full:1,full_launched_command:1,fun:6,func:1,futur:1,gdb:8,gedit:7,gencat:[3,10],gener:[1,2,3,8,10,15,18],generate_launching_command:1,generate_script:1,generic_opt:18,geom:5,get:[1,6,7,13,14,19],get_attr:2,get_attrib:1,get_base_install_dir:1,get_base_path:1,get_cfg_param:1,get_distrib_vers:1,get_distribut:1,get_file_environ:1,get_help:1,get_install_dir:1,get_launcher_nam:1,get_log_path:1,get_method:13,get_nam:1,get_nb_proc:1,get_node_text:1,get_posit:2,get_product_compon:1,get_product_config:1,get_product_depend:1,get_product_sect:1,get_products_info:1,get_property_in_product_cfg:1,get_python_vers:1,get_salome_vers:1,get_test_timeout:1,get_tmp_dir:1,get_tmp_filenam:1,get_us:1,get_win32_cal:2,getbypath:1,getchar:1,getcurrentlogg:1,getdefaultlogg:1,getdetailopt:1,getiter:1,getlocalenv:1,getroot:1,getrootattrib:1,getstrconfigdbg:1,getstrconfigstd:1,gettmpdir:1,gettmpdirdefault:1,gettoken:1,getunittestlogg:1,git:[1,12],git_extract:1,git_info:13,gitconfig:13,give:[1,3,14,19],given:[1,2,3,8,10],global:1,goe:1,green:2,grei:2,grep:6,grid:1,gui:1,hack_libtool:1,had:1,handl:[1,2,8],handlemismatch:1,handleremovereadonli:1,hard:1,harri:1,has:[1,2,8,19],has_salome_hui:1,has_timed_out:1,hat:1,have:[1,3,4,9,10,13],header:1,help:[1,19],helpstr:1,here:[1,8,14,19],hierarchi:1,highlight:1,himself:8,hold:10,home:6,hour:1,how:[1,7,8,13,14],html:[1,7],http:[1,2],hxx2salom:9,ident:1,identifi:1,ignor:[1,9],ignorelist:1,imag:13,implement:[1,2,8],includ:[1,8,12,14],indent:1,index:1,indic:1,indirect:1,info:[1,6,13],inform:[1,6,7,12,13,14],init:[1,2],initi:1,initialis:[0,1],inmap:1,input:1,input_list:1,insid:13,instal:[1,4,5,14,15,18],install_dir:8,instanc:[1,2,19],instanti:1,instead:1,instream:1,instruct:[1,14],intal:12,interact:11,interfac:[1,18],intern:1,invalid:1,ioerror:1,iostream:1,is_a_tti:2,is_defin:1,is_salome_modul:[4,8],is_stream_clos:2,is_window:1,iscurrentloggerunittest:1,isdir:1,isel:1,isfil:1,islink:1,issu:2,istypeconfig:1,isword:1,item:1,iter:1,iteritem:1,iterkei:1,iterpars:1,its:[1,5,6,8,14],ivar:1,jane:1,job:5,join:8,just:[1,5],keep:1,kei:[1,8,13],kernel:[1,6,18],killsalom:1,know:[1,13],known:12,kwarg:2,kwd:2,label:[1,6],lanch:1,lapack:8,lapack_root_dir:8,last:[1,8,11],last_termin:11,later:12,latter:1,launch:[1,8],launch_command:1,launcher:[1,3,8,15],launcher_nam:10,launcherfileenviron:1,layer:9,ld_library_path:8,left:8,level:[1,18,19],lhs:1,lib:8,librari:1,light:2,lightblack_ex:2,lightblue_ex:2,lightcyan_ex:2,lightgreen_ex:2,lightmagenta_ex:2,lightred_ex:2,lightwhite_ex:2,lightyellow_ex:2,like:[1,2,3,5,6,10,14],limit:1,line:[1,6,18],link:[1,13],list:[1,3,4,6,10,14],list_log_fil:1,list_of_product:9,listtest:1,llvm:[3,10],load:[1,14],load_cfg_environ:1,load_environ:1,local:[6,7],locat:1,log:[1,5,15,19],log_command:1,log_dir:11,log_file_nam:1,logdir:1,logfilepath:1,logger:0,login:13,logo:[1,10],lome:15,longnam:1,lost:1,lpath:1,lproduct:1,machin:[1,3,9,10,12],machine1:3,machine2:3,machine3:3,magenta:2,mai:13,main:5,make:[1,5],make_flag:5,make_opt:1,makepath:1,manag:[1,6,13],manipul:[1,6],map1:1,map2:1,map:1,match:1,max:1,mechan:[1,8],med:5,memori:[3,10],menu:11,merg:1,merge:1,merge_dict:1,mergemap:1,mergesequ:1,mesa:[1,3,10],messag:[1,19],method:[1,2,5,8,13,19],micro_command:1,minim:1,minut:1,mismatch:1,miss:[3,5],mistak:13,mode:[1,2,4,6,8,11,18],model:19,modifi:[1,7,8,13],modul:[0,3,5,9,10,13,14,15],mon:1,mond:19,more:[1,18],most:[1,8,19],msg:1,multi:1,multilin:1,multipl:1,must:[1,19],my_application_directori:3,my_application_nam:3,my_tag:13,mycommand:19,mydebug:1,myoption:19,myspecificnam:12,mytempl:1,name:[1,3,4,6,8,10,12,13,14,18,19],name_nod:1,namespac:1,nativ:[1,8],nb_line:1,nb_proc:[1,5],need:[1,2,3,9,13],new_nam:6,next:1,nfirst:1,no_label:6,node:1,node_nam:1,non:2,none:[1,2],nor:2,normal:[1,2],note:[1,3,8,10,14],noth:[1,12],notimplementederror:1,notion:1,notshowncommand:1,number:[1,3,5,10,11],number_of_proc:1,obj1:1,obj2:1,object:[1,2,14],obsolesc:1,obtain:1,obvious:[],occur:1,ode:1,old:1,older:11,on_stderr:2,onc:13,one:[1,6],onli:[1,3,4,5,6,8,9,10,11,13,18],only_numb:1,ool:15,open:1,openggl:[3,10],openmpi:1,oper:[1,6,15],operand:1,opt_nb_proc:1,option:[0,2,3,5,6,8,9,10,11,12,13,14,19],optionali:1,optiontyp:1,optresult:1,order:[1,13,14,19],org:2,other:[1,8,12,14],otherwis:[1,13],our:2,out:1,out_dir:1,output:[1,2],output_verbose_level:1,outstream:1,overrid:[1,3],overwrit:1,overwritekei:1,overwritemergeresolv:1,overwritten:1,own:1,packag:[0,15,16],page:8,pair:1,param:[1,2],param_nam:1,paramet:[1,6,14,19],parameter_path:6,paramstr:2,paravi:[3,10],parent:1,parma:1,pars:[1,19],parse_arg:[1,19],parse_d:1,parseargu:1,parsefactor:1,parsekeyvaluepair:1,parsemap:1,parsemappingbodi:1,parser:[1,19],parserefer:1,parsescalar:1,parsesequ:1,parsesuffix:1,parseterm:1,parsevalu:1,part:[1,3,8,10],particular:1,pass:[1,14,19],passphras:13,password:13,patch:[1,6,13],path:[1,8,10],path_to_catalog:3,path_to_yacsgen:9,pattern:1,pdf:[6,7,15],pdf_viewer:7,pend:4,pendant:1,perform:[13,15],person:6,phase:1,platform:[2,8],pleas:[8,9],plugin:[1,5],pluma:[7,14],point:[1,19],pop_debug:1,popul:1,posit:2,possibl:[1,8,13,19],potenti:1,pprty:1,preced:1,prefer:[6,7,14],prefix:[1,8,14],prepar:[1,15,19],prepare_testbas:1,prepare_testbase_from_dir:1,prepare_testbase_from_git:1,prepare_testbase_from_svn:1,prepend:[1,8],prepend_valu:1,prereq_dir:8,prerequisit:[8,12,14,15,18],presenc:1,preset:1,pretti:1,previou:1,previous:4,print:[1,2,6,11],print_color_map:1,print_color_rang:1,print_help:[],print_info:1,print_valu:1,printc:1,printcerror:1,printchead:1,printchighlight:1,printcinfo:1,printclabel:1,printcolor:0,printcsuccess:1,printcwarn:1,problem:[1,3,10],procedur:1,process:13,processinginstruct:1,processor:[1,3,10],prod_dir:1,prod_info:1,produc:1,product1:[5,8,13],product2:[5,8,13],product:[0,4,5,6,8,9,10,12,13,15,19],product_cfg:1,product_compil:1,product_has_env_script:1,product_has_logo:1,product_has_patch:1,product_has_salome_gui:1,product_has_script:1,product_info:1,product_is_autotool:1,product_is_cmak:1,product_is_cpp:1,product_is_debug:1,product_is_dev:1,product_is_fix:1,product_is_gener:1,product_is_mpi:1,product_is_n:1,product_is_salom:1,product_is_sampl:[],product_is_smesh_plugin:1,product_is_vc:1,product_is_verbos:1,product_nam:1,profil:[1,10],program:1,programmat:8,progress:1,project:[6,8],properti:[1,4,8,9],protocol:[1,3],provid:[1,8,19],proxi:2,pubid:1,push:13,push_debug:1,put:1,put_initial_xml_field:1,put_txt_log_in_appli_log_dir:1,pv_plugin_path:1,pwd:1,pyconf:[0,5,6,8,13,14,19],python:[1,8,10,14,15,16,19],python_config:1,pythonpath:8,pythonpath_:8,qname:1,queri:[3,10],rais:[1,18],rang:1,raw:1,read:1,read_config_from_a_fil:1,read_result:1,reader:1,readi:13,readlin:1,readlink:1,readxmlfil:1,recurs:[1,6],red:[1,2],redefin:1,redirect:1,ref:1,refer:[1,9,14],reflect:1,regard:1,regular:1,reinit:[1,2],rel:[1,12],relai:1,remain:[11,16],remainderarg:1,remark:3,remor:9,remot:[1,12],remov:[1,4,5,13],remove_item_from_list:1,removenamespac:1,renam:1,renint:1,replac:[1,3],replace_in_fil:1,report:1,repositori:[1,13],repres:1,represent:1,request:2,requir:[1,2,8,9],reserv:1,reset:2,reset_al:2,resolut:1,resolv:1,resourc:[3,10],respect:8,restor:[1,4],result:1,retriev:1,rhs:1,right:[1,8],root:[1,19],root_nod:1,rootnam:1,rst:7,rtype:1,run:[1,8,14,15,19],run_all_test:1,run_env_script:1,run_grid_test:1,run_script:1,run_session_test:1,run_simple_env_script:1,run_test:1,run_testbase_test:1,runappli:3,runner:19,ruud:1,sajip:1,salom:[1,3,4,5,6,8,9,10,12,14,16],salome_modul:1,salome_session_serv:1,salome_xx:[4,12,16,18],salome_xx_:12,salomecontext:1,salomeenviron:1,salometool:[1,3,6,8,12,14,15,16],same:[1,7],sampl:18,sat:[1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,19],satexcept:1,save:8,saveconfigdbg:1,saveconfigstd:1,scalar:1,screenenviron:1,screenonli:1,script:[1,5,6,8,10,14,15,16],script_nam:1,script_path:1,search:1,search_known_error:1,second:[1,8,19],section:[1,3,8,13],secur:13,see:[1,2,14,18],seen:1,select:12,self:1,semant:1,send:1,sendmessagetocurrentlogg:1,sep:[1,8],separ:1,seq1:1,seq2:1,seq:1,seqit:1,sequenc:[1,2],server:[1,13],servic:19,session:1,set:[1,3,4,8,10,14,15,19],set_a_product:1,set_application_env:1,set_attr:2,set_consol:2,set_cpp_env:1,set_cursor_posit:2,set_env:[1,8],set_env_build:8,set_env_launch:8,set_full_environ:1,set_native_env:[1,8],set_product:1,set_python_libdir:1,set_salome_generic_product_env:1,set_salome_minimal_product_env:1,set_titl:2,setconsoletextattribut:2,setcurrentlogg:1,setpath:1,setstream:1,sever:[8,14],shallow:1,shell:[1,8],shortcut:1,shortnam:1,should:[1,8,9],should_wrap:2,show:[1,5,7,11],show_command_log:1,show_desktop:1,show_in_editor:1,show_patch:6,show_progress:1,show_warn:1,showinfo:1,shown:[1,5],sign:1,silent_sysstd:1,similar:1,simpl:[1,18,19],sinc:1,site:1,size:1,smaller:1,smart:1,smartcopi:1,smesh:1,softwar:13,some:[1,8,10,14,19],someon:8,sometim:4,sommeil:1,soon:5,sourc:[1,2,4,6,7,12,13],sources_without_dev:4,special_path_separ:1,specif:[1,3,4,8,9,10,12,14,18],specifi:[1,3,8,9,10,13],splashscreen:10,src:19,src_root:1,sre_pattern:[1,2],ssh:[3,10,13],stack:[1,18],start:[1,2,3,5,10],statu:1,stderr:1,stdout:[1,2],step:1,stop:5,stop_first_fail:5,store:[1,5,6,11,13,14],str:1,str_num:1,stream:[1,2],streamopen:1,streamorfil:1,streamwrapp:2,strin:1,string:1,stringio:1,strip:2,strout:1,structur:14,stuff:[1,10],style:[1,2],stylesheet:1,sub:[1,14],subclass:1,subel:1,submodul:0,subpackag:0,subsect:8,subset:12,subst_dic:1,substitut:1,subtract:1,success:[1,5],successfulli:1,suffici:8,suffix:1,suit:15,suitabl:1,support:1,supposedli:1,suppress:4,svn:[1,12],svn_extract:1,svn_info:13,symlink:1,syntax:[1,4],sys:1,system:[0,12],tab:1,tabl:1,tag:[1,13],take:[1,4],taken:[1,8],tar:[12,16],target:[1,3,8],tcllibpath:1,templat:0,template_fil:1,temporari:1,term:1,termin:[1,2,5,11,19],test:[1,5,15],test_base_nam:1,test_config:1,test_grid:1,test_modul:0,test_nam:1,test_sess:1,testbas:1,testbase_bas:1,testbase_dir:1,testbase_nam:1,testbase_tag:1,text:[1,2,7,18],text_or_uri:1,tgz:[12,16],thank:1,thei:[4,6,8,13],them:[2,13],thi:[1,2,3,5,6,8,9,10,12,13,14,15,19],thing:19,those:9,through:[3,8,10,11],thrown:1,time:[1,4,8,13,14],timedelta:1,timedelta_total_second:1,tip:1,titl:[1,2],tklibpath:1,tmp_working_dir:1,tofix:1,token:1,token_typ:1,token_valu:1,top:1,tostr:1,total_second:1,tout:19,trace:[1,18],traceback:1,transform:1,transpar:2,tree:1,treebuild:1,trust_root_dir:8,tty:2,tupl:1,turn:1,tutori:1,two:[1,8],txt:1,type:[1,13],typeerror:1,unabl:1,unchang:1,unconditionali:[1,18],under:[1,15],underscor:[1,8],unicod:1,unit:5,unittestlogg:1,unless:[2,13],updat:1,update_hat_xml:1,updatehatxml:1,urllib2:1,urlopen:1,usag:[1,15],use:[1,3,5,8,10,11,12,13,14,16],use_mesa:[3,10],used:[1,3,5,6,7,8,11,12,13,14,15],useful:[8,10,19],user:[1,6,7,8,11,12,16,18],usernam:1,uses:[1,8,9,13,14],using:[1,2,9],usr:8,usual:[4,9,12,14,16,18],utf:[1,8],util:[1,12,15],valid:1,valu:[1,2,3,4,6,13,14],variabl:[1,8,9,19],vcs:1,verbos:[1,19],verifi:[1,13],version:[1,8,9,12,14,15],via:1,viewer:[6,7],vinai:1,virtual:[1,3],virtual_app:3,visualis:8,wai:[1,5,19],want:[1,4,8,19],warn:[1,5],web:[6,7,11,14],welcom:1,welkom:1,well:1,were:1,what:[1,4],when:[1,3,8,13,14,19],whenev:1,where:[1,3,5,6,12],which:[1,2,8,9,14,19],white:2,who:9,wiki:2,wikipedia:2,wil:8,win32:[0,1],winapi_test:2,wincolor:2,window:[1,2,8],winstyl:2,winterm:[0,1],with_children:5,with_commerci:1,with_fath:5,with_install_dir:1,with_vc:12,within:8,without:[1,6,13],without_properti:12,wmake:1,word:1,work:[1,6,12,13,14],workdir:[1,3,6,10,12,14,18,19],world:19,would:1,wrap:2,wrap_stream:2,writabl:1,write:[1,2,19],write_and_convert:2,write_back:1,write_cfgforpy_fil:1,write_env_fil:1,write_plain_text:2,write_report:1,write_test_margin:1,write_tre:1,writetostream:1,writevalu:1,written:19,www:1,xa4:1,xc2:1,xml:[1,7,19],xmllogfil:1,xmlmanag:0,xmlroot:1,xmltreebuild:1,xxx:[4,14],xxx_root_dir:1,xxx_src_dir:1,yac:1,yacsgen:[1,9],yacsgen_root_dir:9,year:1,yellow:2,yes:[1,4,8,9,13],yet:[1,18],yield:1,you:[1,3,4,8,10,13,15,19],your:[1,7,8,13,18,19],yourspecificnam:12,yve:1,yyi:14,yyyi:1,yyyymmdd_hhmmss:1,yyyymmdd_hhmmss_namecmd:1,zelaunch:10,zero:1,zerodivideerror:1},titles:["src","src package","src.colorama package","Command application","Command clean","Command compile","Command config","Command doc","Command environ","Command generate","Command launcher","Command log","Command package","Command prepare","Configuration","Salome Tools","Installation","Release notes","Usage of SAlomeTools","Add a user custom command"],titleterms:{"var":14,VCS:13,access:19,add:19,ansi:2,ansitowin32:2,applic:[3,14],architectur:1,avail:[4,18],base:13,basic:19,build:18,clean:4,code:15,colorama:2,command:[3,4,5,6,7,8,9,10,11,12,13,15,19],compil:[1,5,18],config:[6,19],configur:[3,4,5,6,7,8,10,11,12,13,14],content:[1,2],custom:19,cvs:13,debug:[1,18],descript:[3,4,5,6,7,8,9,10,11,12,13,14],dev:13,develop:15,doc:7,document:15,elementtre:1,environ:[1,8],exampl:19,fileenviron:1,fork:1,gener:9,get:18,git:13,hello:19,help:18,howto:19,initialis:2,instal:16,introduct:19,launcher:10,list:[15,18],log:11,logger:[1,19],mode:13,modul:[1,2],note:[15,17],option:[1,4,18],other:19,packag:[1,2,12],path:[3,4,5,6,7,11,12,13],prepar:[13,18],printcolor:1,product:[1,14,18],pyconf:1,quick:15,releas:[15,17],remark:[9,13],requir:19,salom:[15,18],salometool:[18,19],sat:18,section:14,some:[3,4,5,6,7,11,12,13],sourc:18,src:[0,1,2],start:15,submodul:[1,2],subpackag:1,svn:13,syntax:14,system:1,templat:1,test_modul:1,tool:15,usag:[3,4,5,6,7,8,9,10,11,12,13,18],useful:[3,4,5,6,7,11,12,13],user:[14,19],verbos:18,win32:2,winterm:2,xmlmanag:1}})
\ No newline at end of file
index 6c926c6ad46a0d2a9cc48a145f08b77677885c05..2ebe121f8cf6d8940f1d7a95c0f00fd20bf7aaf4 100644 (file)
@@ -16,7 +16,7 @@
     <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="search.html" />
-    <link rel="next" title="Command config" href="commands/config.html" />
+    <link rel="next" title="Command doc" href="commands/doc.html" />
     <link rel="prev" title="Configuration" href="configuration.html" />
    
   <link rel="stylesheet" href="_static/custom.css" type="text/css" />
@@ -145,7 +145,7 @@ sat compile SALOME_xx ---products SAMPLES --clean_all
 <ul>
   <li><a href="index.html">Documentation overview</a><ul>
       <li>Previous: <a href="configuration.html" title="previous chapter">Configuration</a></li>
-      <li>Next: <a href="commands/config.html" title="next chapter">Command config</a></li>
+      <li>Next: <a href="commands/doc.html" title="next chapter">Command doc</a></li>
   </ul></li>
 </ul>
 </div>
index f92b4562282d4a44f7047865e8818b44fa9d3415..2fc3f5023c04e86dfa3bafb354c183bbf7b82a77 100644 (file)
 \@writefile{toc}{\contentsline {subsubsection}{src.debug module}{35}{subsubsection*.188}}
 \newlabel{commands/apidoc/src:module-src.debug}{{4.1.1}{35}{src.debug module}{subsubsection*.188}{}}
 \newlabel{commands/apidoc/src:src-debug-module}{{4.1.1}{35}{src.debug module}{subsubsection*.188}{}}
-\newlabel{commands/apidoc/src:src.debug.InStream}{{4.1.1}{35}{src.debug module}{section*.189}{}}
-\newlabel{commands/apidoc/src:src.debug.OutStream}{{4.1.1}{35}{src.debug module}{section*.190}{}}
-\newlabel{commands/apidoc/src:src.debug.OutStream.close}{{4.1.1}{35}{src.debug module}{section*.191}{}}
-\newlabel{commands/apidoc/src:src.debug.getLocalEnv}{{4.1.1}{35}{src.debug module}{section*.192}{}}
-\newlabel{commands/apidoc/src:src.debug.getStrConfigDbg}{{4.1.1}{35}{src.debug module}{section*.193}{}}
-\newlabel{commands/apidoc/src:src.debug.getStrConfigStd}{{4.1.1}{36}{src.debug module}{section*.194}{}}
-\newlabel{commands/apidoc/src:src.debug.indent}{{4.1.1}{36}{src.debug module}{section*.195}{}}
-\newlabel{commands/apidoc/src:src.debug.pop_debug}{{4.1.1}{36}{src.debug module}{section*.196}{}}
-\newlabel{commands/apidoc/src:src.debug.push_debug}{{4.1.1}{36}{src.debug module}{section*.197}{}}
-\newlabel{commands/apidoc/src:src.debug.saveConfigDbg}{{4.1.1}{36}{src.debug module}{section*.198}{}}
-\newlabel{commands/apidoc/src:src.debug.saveConfigStd}{{4.1.1}{36}{src.debug module}{section*.199}{}}
-\newlabel{commands/apidoc/src:src.debug.tofix}{{4.1.1}{36}{src.debug module}{section*.200}{}}
-\newlabel{commands/apidoc/src:src.debug.write}{{4.1.1}{36}{src.debug module}{section*.201}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.environment module}{36}{subsubsection*.202}}
-\newlabel{commands/apidoc/src:src-environment-module}{{4.1.1}{36}{src.environment module}{subsubsection*.202}{}}
-\newlabel{commands/apidoc/src:module-src.environment}{{4.1.1}{36}{src.environment module}{subsubsection*.202}{}}
-\newlabel{commands/apidoc/src:src.environment.Environ}{{4.1.1}{36}{src.environment module}{section*.203}{}}
-\newlabel{commands/apidoc/src:src.environment.Environ.append}{{4.1.1}{36}{src.environment module}{section*.204}{}}
-\newlabel{commands/apidoc/src:src.environment.Environ.append_value}{{4.1.1}{36}{src.environment module}{section*.205}{}}
-\newlabel{commands/apidoc/src:src.environment.Environ.command_value}{{4.1.1}{36}{src.environment module}{section*.206}{}}
-\newlabel{commands/apidoc/src:src.environment.Environ.get}{{4.1.1}{36}{src.environment module}{section*.207}{}}
-\newlabel{commands/apidoc/src:src.environment.Environ.is_defined}{{4.1.1}{36}{src.environment module}{section*.208}{}}
-\newlabel{commands/apidoc/src:src.environment.Environ.prepend}{{4.1.1}{37}{src.environment module}{section*.209}{}}
-\newlabel{commands/apidoc/src:src.environment.Environ.prepend_value}{{4.1.1}{37}{src.environment module}{section*.210}{}}
-\newlabel{commands/apidoc/src:src.environment.Environ.set}{{4.1.1}{37}{src.environment module}{section*.211}{}}
-\newlabel{commands/apidoc/src:src.environment.FileEnvWriter}{{4.1.1}{37}{src.environment module}{section*.212}{}}
-\newlabel{commands/apidoc/src:src.environment.FileEnvWriter.write_cfgForPy_file}{{4.1.1}{37}{src.environment module}{section*.213}{}}
-\newlabel{commands/apidoc/src:src.environment.FileEnvWriter.write_env_file}{{4.1.1}{37}{src.environment module}{section*.214}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron}{{4.1.1}{37}{src.environment module}{section*.215}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.add_comment}{{4.1.1}{37}{src.environment module}{section*.216}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.add_line}{{4.1.1}{38}{src.environment module}{section*.217}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.add_warning}{{4.1.1}{38}{src.environment module}{section*.218}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.append}{{4.1.1}{38}{src.environment module}{section*.219}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.dump}{{4.1.1}{38}{src.environment module}{section*.220}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.finish}{{4.1.1}{38}{src.environment module}{section*.221}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.get}{{4.1.1}{38}{src.environment module}{section*.222}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.get_names}{{4.1.1}{38}{src.environment module}{section*.223}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.is_defined}{{4.1.1}{38}{src.environment module}{section*.224}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.load_cfg_environment}{{4.1.1}{38}{src.environment module}{section*.225}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.prepend}{{4.1.1}{38}{src.environment module}{section*.226}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.run_env_script}{{4.1.1}{38}{src.environment module}{section*.227}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.run_simple_env_script}{{4.1.1}{39}{src.environment module}{section*.228}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set}{{4.1.1}{39}{src.environment module}{section*.229}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_a_product}{{4.1.1}{39}{src.environment module}{section*.230}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_application_env}{{4.1.1}{39}{src.environment module}{section*.231}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_cpp_env}{{4.1.1}{39}{src.environment module}{section*.232}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_full_environ}{{4.1.1}{39}{src.environment module}{section*.233}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_products}{{4.1.1}{39}{src.environment module}{section*.234}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_python_libdirs}{{4.1.1}{39}{src.environment module}{section*.235}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_salome_generic_product_env}{{4.1.1}{39}{src.environment module}{section*.236}{}}
-\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_salome_minimal_product_env}{{4.1.1}{39}{src.environment module}{section*.237}{}}
-\newlabel{commands/apidoc/src:src.environment.Shell}{{4.1.1}{40}{src.environment module}{section*.238}{}}
-\newlabel{commands/apidoc/src:src.environment.load_environment}{{4.1.1}{40}{src.environment module}{section*.239}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.fileEnviron module}{40}{subsubsection*.240}}
-\newlabel{commands/apidoc/src:src-fileenviron-module}{{4.1.1}{40}{src.fileEnviron module}{subsubsection*.240}{}}
-\newlabel{commands/apidoc/src:module-src.fileEnviron}{{4.1.1}{40}{src.fileEnviron module}{subsubsection*.240}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BashFileEnviron}{{4.1.1}{40}{src.fileEnviron module}{section*.241}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BashFileEnviron.command_value}{{4.1.1}{40}{src.fileEnviron module}{section*.242}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BashFileEnviron.finish}{{4.1.1}{40}{src.fileEnviron module}{section*.243}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BashFileEnviron.set}{{4.1.1}{40}{src.fileEnviron module}{section*.244}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron}{{4.1.1}{40}{src.fileEnviron module}{section*.245}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.add_comment}{{4.1.1}{40}{src.fileEnviron module}{section*.246}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.command_value}{{4.1.1}{40}{src.fileEnviron module}{section*.247}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.finish}{{4.1.1}{40}{src.fileEnviron module}{section*.248}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.get}{{4.1.1}{41}{src.fileEnviron module}{section*.249}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.set}{{4.1.1}{41}{src.fileEnviron module}{section*.250}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron}{{4.1.1}{41}{src.fileEnviron module}{section*.251}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.add_echo}{{4.1.1}{41}{src.fileEnviron module}{section*.252}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.add_warning}{{4.1.1}{41}{src.fileEnviron module}{section*.253}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.append_value}{{4.1.1}{41}{src.fileEnviron module}{section*.254}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.command_value}{{4.1.1}{41}{src.fileEnviron module}{section*.255}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.finish}{{4.1.1}{41}{src.fileEnviron module}{section*.256}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.get}{{4.1.1}{41}{src.fileEnviron module}{section*.257}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.prepend_value}{{4.1.1}{41}{src.fileEnviron module}{section*.258}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.set}{{4.1.1}{41}{src.fileEnviron module}{section*.259}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron}{{4.1.1}{42}{src.fileEnviron module}{section*.260}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.add_comment}{{4.1.1}{42}{src.fileEnviron module}{section*.261}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.add_echo}{{4.1.1}{42}{src.fileEnviron module}{section*.262}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.add_line}{{4.1.1}{42}{src.fileEnviron module}{section*.263}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.add_warning}{{4.1.1}{42}{src.fileEnviron module}{section*.264}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.append}{{4.1.1}{42}{src.fileEnviron module}{section*.265}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.append_value}{{4.1.1}{42}{src.fileEnviron module}{section*.266}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.command_value}{{4.1.1}{42}{src.fileEnviron module}{section*.267}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.finish}{{4.1.1}{42}{src.fileEnviron module}{section*.268}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.get}{{4.1.1}{42}{src.fileEnviron module}{section*.269}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.is_defined}{{4.1.1}{43}{src.fileEnviron module}{section*.270}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.prepend}{{4.1.1}{43}{src.fileEnviron module}{section*.271}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.prepend_value}{{4.1.1}{43}{src.fileEnviron module}{section*.272}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.set}{{4.1.1}{43}{src.fileEnviron module}{section*.273}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron}{{4.1.1}{43}{src.fileEnviron module}{section*.274}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add}{{4.1.1}{43}{src.fileEnviron module}{section*.275}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add_comment}{{4.1.1}{43}{src.fileEnviron module}{section*.276}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add_echo}{{4.1.1}{43}{src.fileEnviron module}{section*.277}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add_line}{{4.1.1}{43}{src.fileEnviron module}{section*.278}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add_warning}{{4.1.1}{43}{src.fileEnviron module}{section*.279}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.append}{{4.1.1}{43}{src.fileEnviron module}{section*.280}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.append_value}{{4.1.1}{44}{src.fileEnviron module}{section*.281}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.change_to_launcher}{{4.1.1}{44}{src.fileEnviron module}{section*.282}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.command_value}{{4.1.1}{44}{src.fileEnviron module}{section*.283}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.finish}{{4.1.1}{44}{src.fileEnviron module}{section*.284}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.get}{{4.1.1}{44}{src.fileEnviron module}{section*.285}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.is_defined}{{4.1.1}{44}{src.fileEnviron module}{section*.286}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.prepend}{{4.1.1}{44}{src.fileEnviron module}{section*.287}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.prepend_value}{{4.1.1}{44}{src.fileEnviron module}{section*.288}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.set}{{4.1.1}{44}{src.fileEnviron module}{section*.289}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron}{{4.1.1}{44}{src.fileEnviron module}{section*.290}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.add_comment}{{4.1.1}{45}{src.fileEnviron module}{section*.291}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.add_echo}{{4.1.1}{45}{src.fileEnviron module}{section*.292}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.add_line}{{4.1.1}{45}{src.fileEnviron module}{section*.293}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.add_warning}{{4.1.1}{45}{src.fileEnviron module}{section*.294}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.append}{{4.1.1}{45}{src.fileEnviron module}{section*.295}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.command_value}{{4.1.1}{45}{src.fileEnviron module}{section*.296}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.get}{{4.1.1}{45}{src.fileEnviron module}{section*.297}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.is_defined}{{4.1.1}{45}{src.fileEnviron module}{section*.298}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.prepend}{{4.1.1}{45}{src.fileEnviron module}{section*.299}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.run_env_script}{{4.1.1}{45}{src.fileEnviron module}{section*.300}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.set}{{4.1.1}{45}{src.fileEnviron module}{section*.301}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.write}{{4.1.1}{46}{src.fileEnviron module}{section*.302}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.get_file_environ}{{4.1.1}{46}{src.fileEnviron module}{section*.303}{}}
-\newlabel{commands/apidoc/src:src.fileEnviron.special_path_separator}{{4.1.1}{46}{src.fileEnviron module}{section*.304}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.fork module}{46}{subsubsection*.305}}
-\newlabel{commands/apidoc/src:module-src.fork}{{4.1.1}{46}{src.fork module}{subsubsection*.305}{}}
-\newlabel{commands/apidoc/src:src-fork-module}{{4.1.1}{46}{src.fork module}{subsubsection*.305}{}}
-\newlabel{commands/apidoc/src:src.fork.batch}{{4.1.1}{46}{src.fork module}{section*.306}{}}
-\newlabel{commands/apidoc/src:src.fork.batch_salome}{{4.1.1}{46}{src.fork module}{section*.307}{}}
-\newlabel{commands/apidoc/src:src.fork.launch_command}{{4.1.1}{46}{src.fork module}{section*.308}{}}
-\newlabel{commands/apidoc/src:src.fork.show_progress}{{4.1.1}{46}{src.fork module}{section*.309}{}}
-\newlabel{commands/apidoc/src:src.fork.write_back}{{4.1.1}{46}{src.fork module}{section*.310}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.logger module}{46}{subsubsection*.311}}
-\newlabel{commands/apidoc/src:module-src.logger}{{4.1.1}{46}{src.logger module}{subsubsection*.311}{}}
-\newlabel{commands/apidoc/src:src-logger-module}{{4.1.1}{46}{src.logger module}{subsubsection*.311}{}}
-\newlabel{commands/apidoc/src:src.logger.Logger}{{4.1.1}{46}{src.logger module}{section*.312}{}}
-\newlabel{commands/apidoc/src:src.logger.Logger.add_link}{{4.1.1}{46}{src.logger module}{section*.313}{}}
-\newlabel{commands/apidoc/src:src.logger.Logger.end_write}{{4.1.1}{47}{src.logger module}{section*.314}{}}
-\newlabel{commands/apidoc/src:src.logger.Logger.error}{{4.1.1}{47}{src.logger module}{section*.315}{}}
-\newlabel{commands/apidoc/src:src.logger.Logger.flush}{{4.1.1}{47}{src.logger module}{section*.316}{}}
-\newlabel{commands/apidoc/src:src.logger.Logger.put_initial_xml_fields}{{4.1.1}{47}{src.logger module}{section*.317}{}}
-\newlabel{commands/apidoc/src:src.logger.Logger.write}{{4.1.1}{47}{src.logger module}{section*.318}{}}
-\newlabel{commands/apidoc/src:src.logger.date_to_datetime}{{4.1.1}{47}{src.logger module}{section*.319}{}}
-\newlabel{commands/apidoc/src:src.logger.list_log_file}{{4.1.1}{47}{src.logger module}{section*.320}{}}
-\newlabel{commands/apidoc/src:src.logger.show_command_log}{{4.1.1}{47}{src.logger module}{section*.321}{}}
-\newlabel{commands/apidoc/src:src.logger.timedelta_total_seconds}{{4.1.1}{47}{src.logger module}{section*.322}{}}
-\newlabel{commands/apidoc/src:src.logger.update_hat_xml}{{4.1.1}{48}{src.logger module}{section*.323}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.options module}{48}{subsubsection*.324}}
-\newlabel{commands/apidoc/src:module-src.options}{{4.1.1}{48}{src.options module}{subsubsection*.324}{}}
-\newlabel{commands/apidoc/src:src-options-module}{{4.1.1}{48}{src.options module}{subsubsection*.324}{}}
-\newlabel{commands/apidoc/src:src.options.OptResult}{{4.1.1}{48}{src.options module}{section*.325}{}}
-\newlabel{commands/apidoc/src:src.options.Options}{{4.1.1}{48}{src.options module}{section*.326}{}}
-\newlabel{commands/apidoc/src:src.options.Options.add_option}{{4.1.1}{48}{src.options module}{section*.327}{}}
-\newlabel{commands/apidoc/src:src.options.Options.debug_write}{{4.1.1}{48}{src.options module}{section*.328}{}}
-\newlabel{commands/apidoc/src:src.options.Options.filterLevel}{{4.1.1}{48}{src.options module}{section*.329}{}}
-\newlabel{commands/apidoc/src:src.options.Options.filterList2}{{4.1.1}{48}{src.options module}{section*.330}{}}
-\newlabel{commands/apidoc/src:src.options.Options.getDetailOption}{{4.1.1}{48}{src.options module}{section*.331}{}}
-\newlabel{commands/apidoc/src:src.options.Options.get_help}{{4.1.1}{49}{src.options module}{section*.332}{}}
-\newlabel{commands/apidoc/src:src.options.Options.indent}{{4.1.1}{49}{src.options module}{section*.333}{}}
-\newlabel{commands/apidoc/src:src.options.Options.parse_args}{{4.1.1}{49}{src.options module}{section*.334}{}}
-\newlabel{commands/apidoc/src:src.options.Options.print_help}{{4.1.1}{49}{src.options module}{section*.335}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.printcolors module}{49}{subsubsection*.336}}
-\newlabel{commands/apidoc/src:module-src.printcolors}{{4.1.1}{49}{src.printcolors module}{subsubsection*.336}{}}
-\newlabel{commands/apidoc/src:src-printcolors-module}{{4.1.1}{49}{src.printcolors module}{subsubsection*.336}{}}
-\newlabel{commands/apidoc/src:src.printcolors.cleancolor}{{4.1.1}{49}{src.printcolors module}{section*.337}{}}
-\newlabel{commands/apidoc/src:src.printcolors.print_color_map}{{4.1.1}{49}{src.printcolors module}{section*.338}{}}
-\newlabel{commands/apidoc/src:src.printcolors.print_color_range}{{4.1.1}{49}{src.printcolors module}{section*.339}{}}
-\newlabel{commands/apidoc/src:src.printcolors.print_value}{{4.1.1}{49}{src.printcolors module}{section*.340}{}}
-\newlabel{commands/apidoc/src:src.printcolors.printc}{{4.1.1}{49}{src.printcolors module}{section*.341}{}}
-\newlabel{commands/apidoc/src:src.printcolors.printcError}{{4.1.1}{50}{src.printcolors module}{section*.342}{}}
-\newlabel{commands/apidoc/src:src.printcolors.printcHeader}{{4.1.1}{50}{src.printcolors module}{section*.343}{}}
-\newlabel{commands/apidoc/src:src.printcolors.printcHighlight}{{4.1.1}{50}{src.printcolors module}{section*.344}{}}
-\newlabel{commands/apidoc/src:src.printcolors.printcInfo}{{4.1.1}{50}{src.printcolors module}{section*.345}{}}
-\newlabel{commands/apidoc/src:src.printcolors.printcLabel}{{4.1.1}{50}{src.printcolors module}{section*.346}{}}
-\newlabel{commands/apidoc/src:src.printcolors.printcSuccess}{{4.1.1}{50}{src.printcolors module}{section*.347}{}}
-\newlabel{commands/apidoc/src:src.printcolors.printcWarning}{{4.1.1}{50}{src.printcolors module}{section*.348}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.product module}{50}{subsubsection*.349}}
-\newlabel{commands/apidoc/src:module-src.product}{{4.1.1}{50}{src.product module}{subsubsection*.349}{}}
-\newlabel{commands/apidoc/src:src-product-module}{{4.1.1}{50}{src.product module}{subsubsection*.349}{}}
-\newlabel{commands/apidoc/src:src.product.check_config_exists}{{4.1.1}{50}{src.product module}{section*.350}{}}
-\newlabel{commands/apidoc/src:src.product.check_installation}{{4.1.1}{51}{src.product module}{section*.351}{}}
-\newlabel{commands/apidoc/src:src.product.check_source}{{4.1.1}{51}{src.product module}{section*.352}{}}
-\newlabel{commands/apidoc/src:src.product.get_base_install_dir}{{4.1.1}{51}{src.product module}{section*.353}{}}
-\newlabel{commands/apidoc/src:src.product.get_install_dir}{{4.1.1}{51}{src.product module}{section*.354}{}}
-\newlabel{commands/apidoc/src:src.product.get_product_components}{{4.1.1}{51}{src.product module}{section*.355}{}}
-\newlabel{commands/apidoc/src:src.product.get_product_config}{{4.1.1}{52}{src.product module}{section*.356}{}}
-\newlabel{commands/apidoc/src:src.product.get_product_dependencies}{{4.1.1}{52}{src.product module}{section*.357}{}}
-\newlabel{commands/apidoc/src:src.product.get_product_section}{{4.1.1}{52}{src.product module}{section*.358}{}}
-\newlabel{commands/apidoc/src:src.product.get_products_infos}{{4.1.1}{52}{src.product module}{section*.359}{}}
-\newlabel{commands/apidoc/src:src.product.product_compiles}{{4.1.1}{52}{src.product module}{section*.360}{}}
-\newlabel{commands/apidoc/src:src.product.product_has_env_script}{{4.1.1}{52}{src.product module}{section*.361}{}}
-\newlabel{commands/apidoc/src:src.product.product_has_logo}{{4.1.1}{53}{src.product module}{section*.362}{}}
-\newlabel{commands/apidoc/src:src.product.product_has_patches}{{4.1.1}{53}{src.product module}{section*.363}{}}
-\newlabel{commands/apidoc/src:src.product.product_has_salome_gui}{{4.1.1}{53}{src.product module}{section*.364}{}}
-\newlabel{commands/apidoc/src:src.product.product_has_script}{{4.1.1}{53}{src.product module}{section*.365}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_autotools}{{4.1.1}{53}{src.product module}{section*.366}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_cmake}{{4.1.1}{53}{src.product module}{section*.367}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_cpp}{{4.1.1}{53}{src.product module}{section*.368}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_debug}{{4.1.1}{53}{src.product module}{section*.369}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_dev}{{4.1.1}{54}{src.product module}{section*.370}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_fixed}{{4.1.1}{54}{src.product module}{section*.371}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_generated}{{4.1.1}{54}{src.product module}{section*.372}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_mpi}{{4.1.1}{54}{src.product module}{section*.373}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_native}{{4.1.1}{54}{src.product module}{section*.374}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_salome}{{4.1.1}{54}{src.product module}{section*.375}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_smesh_plugin}{{4.1.1}{54}{src.product module}{section*.376}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_vcs}{{4.1.1}{54}{src.product module}{section*.377}{}}
-\newlabel{commands/apidoc/src:src.product.product_is_verbose}{{4.1.1}{54}{src.product module}{section*.378}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.pyconf module}{55}{subsubsection*.379}}
-\newlabel{commands/apidoc/src:src-pyconf-module}{{4.1.1}{55}{src.pyconf module}{subsubsection*.379}{}}
-\newlabel{commands/apidoc/src:module-src.pyconf}{{4.1.1}{55}{src.pyconf module}{subsubsection*.379}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Config}{{4.1.1}{56}{src.pyconf module}{section*.380}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Config.Namespace}{{4.1.1}{56}{src.pyconf module}{section*.381}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Config.addNamespace}{{4.1.1}{56}{src.pyconf module}{section*.382}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Config.getByPath}{{4.1.1}{56}{src.pyconf module}{section*.383}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Config.load}{{4.1.1}{56}{src.pyconf module}{section*.384}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Config.removeNamespace}{{4.1.1}{56}{src.pyconf module}{section*.385}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigError}{{4.1.1}{56}{src.pyconf module}{section*.386}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigFormatError}{{4.1.1}{56}{src.pyconf module}{section*.387}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigInputStream}{{4.1.1}{56}{src.pyconf module}{section*.388}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigInputStream.close}{{4.1.1}{56}{src.pyconf module}{section*.389}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigInputStream.read}{{4.1.1}{56}{src.pyconf module}{section*.390}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigInputStream.readline}{{4.1.1}{56}{src.pyconf module}{section*.391}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigList}{{4.1.1}{56}{src.pyconf module}{section*.392}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigList.getByPath}{{4.1.1}{56}{src.pyconf module}{section*.393}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger}{{4.1.1}{57}{src.pyconf module}{section*.394}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.handleMismatch}{{4.1.1}{57}{src.pyconf module}{section*.395}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.merge}{{4.1.1}{57}{src.pyconf module}{section*.396}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.mergeMapping}{{4.1.1}{57}{src.pyconf module}{section*.397}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.mergeSequence}{{4.1.1}{57}{src.pyconf module}{section*.398}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.overwriteKeys}{{4.1.1}{57}{src.pyconf module}{section*.399}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigOutputStream}{{4.1.1}{57}{src.pyconf module}{section*.400}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigOutputStream.close}{{4.1.1}{57}{src.pyconf module}{section*.401}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigOutputStream.flush}{{4.1.1}{57}{src.pyconf module}{section*.402}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigOutputStream.write}{{4.1.1}{57}{src.pyconf module}{section*.403}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader}{{4.1.1}{57}{src.pyconf module}{section*.404}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.getChar}{{4.1.1}{57}{src.pyconf module}{section*.405}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.getToken}{{4.1.1}{57}{src.pyconf module}{section*.406}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.load}{{4.1.1}{58}{src.pyconf module}{section*.407}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.location}{{4.1.1}{58}{src.pyconf module}{section*.408}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.match}{{4.1.1}{58}{src.pyconf module}{section*.409}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseFactor}{{4.1.1}{58}{src.pyconf module}{section*.410}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseKeyValuePair}{{4.1.1}{58}{src.pyconf module}{section*.411}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseMapping}{{4.1.1}{58}{src.pyconf module}{section*.412}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseMappingBody}{{4.1.1}{58}{src.pyconf module}{section*.413}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseReference}{{4.1.1}{58}{src.pyconf module}{section*.414}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseScalar}{{4.1.1}{58}{src.pyconf module}{section*.415}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseSequence}{{4.1.1}{58}{src.pyconf module}{section*.416}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseSuffix}{{4.1.1}{59}{src.pyconf module}{section*.417}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseTerm}{{4.1.1}{59}{src.pyconf module}{section*.418}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseValue}{{4.1.1}{59}{src.pyconf module}{section*.419}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.setStream}{{4.1.1}{59}{src.pyconf module}{section*.420}{}}
-\newlabel{commands/apidoc/src:src.pyconf.ConfigResolutionError}{{4.1.1}{59}{src.pyconf module}{section*.421}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Container}{{4.1.1}{59}{src.pyconf module}{section*.422}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Container.evaluate}{{4.1.1}{59}{src.pyconf module}{section*.423}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Container.setPath}{{4.1.1}{59}{src.pyconf module}{section*.424}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Container.writeToStream}{{4.1.1}{59}{src.pyconf module}{section*.425}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Container.writeValue}{{4.1.1}{59}{src.pyconf module}{section*.426}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Expression}{{4.1.1}{59}{src.pyconf module}{section*.427}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Expression.evaluate}{{4.1.1}{60}{src.pyconf module}{section*.428}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Mapping}{{4.1.1}{60}{src.pyconf module}{section*.429}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Mapping.addMapping}{{4.1.1}{60}{src.pyconf module}{section*.430}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Mapping.get}{{4.1.1}{60}{src.pyconf module}{section*.431}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Mapping.iteritems}{{4.1.1}{60}{src.pyconf module}{section*.432}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Mapping.iterkeys}{{4.1.1}{60}{src.pyconf module}{section*.433}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Mapping.keys}{{4.1.1}{60}{src.pyconf module}{section*.434}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Mapping.writeToStream}{{4.1.1}{60}{src.pyconf module}{section*.435}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Reference}{{4.1.1}{60}{src.pyconf module}{section*.436}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Reference.addElement}{{4.1.1}{60}{src.pyconf module}{section*.437}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Reference.findConfig}{{4.1.1}{60}{src.pyconf module}{section*.438}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Reference.resolve}{{4.1.1}{60}{src.pyconf module}{section*.439}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Sequence}{{4.1.1}{60}{src.pyconf module}{section*.440}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Sequence.SeqIter}{{4.1.1}{61}{src.pyconf module}{section*.441}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Sequence.SeqIter.next}{{4.1.1}{61}{src.pyconf module}{section*.442}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Sequence.append}{{4.1.1}{61}{src.pyconf module}{section*.443}{}}
-\newlabel{commands/apidoc/src:src.pyconf.Sequence.writeToStream}{{4.1.1}{61}{src.pyconf module}{section*.444}{}}
-\newlabel{commands/apidoc/src:src.pyconf.deepCopyMapping}{{4.1.1}{61}{src.pyconf module}{section*.445}{}}
-\newlabel{commands/apidoc/src:src.pyconf.defaultMergeResolve}{{4.1.1}{61}{src.pyconf module}{section*.446}{}}
-\newlabel{commands/apidoc/src:src.pyconf.defaultStreamOpener}{{4.1.1}{61}{src.pyconf module}{section*.447}{}}
-\newlabel{commands/apidoc/src:src.pyconf.isWord}{{4.1.1}{61}{src.pyconf module}{section*.448}{}}
-\newlabel{commands/apidoc/src:src.pyconf.makePath}{{4.1.1}{61}{src.pyconf module}{section*.449}{}}
-\newlabel{commands/apidoc/src:src.pyconf.overwriteMergeResolve}{{4.1.1}{62}{src.pyconf module}{section*.450}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.system module}{62}{subsubsection*.451}}
-\newlabel{commands/apidoc/src:src-system-module}{{4.1.1}{62}{src.system module}{subsubsection*.451}{}}
-\newlabel{commands/apidoc/src:module-src.system}{{4.1.1}{62}{src.system module}{subsubsection*.451}{}}
-\newlabel{commands/apidoc/src:src.system.archive_extract}{{4.1.1}{62}{src.system module}{section*.452}{}}
-\newlabel{commands/apidoc/src:src.system.cvs_extract}{{4.1.1}{62}{src.system module}{section*.453}{}}
-\newlabel{commands/apidoc/src:src.system.git_extract}{{4.1.1}{62}{src.system module}{section*.454}{}}
-\newlabel{commands/apidoc/src:src.system.show_in_editor}{{4.1.1}{63}{src.system module}{section*.455}{}}
-\newlabel{commands/apidoc/src:src.system.svn_extract}{{4.1.1}{63}{src.system module}{section*.456}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.template module}{63}{subsubsection*.457}}
-\newlabel{commands/apidoc/src:module-src.template}{{4.1.1}{63}{src.template module}{subsubsection*.457}{}}
-\newlabel{commands/apidoc/src:src-template-module}{{4.1.1}{63}{src.template module}{subsubsection*.457}{}}
-\newlabel{commands/apidoc/src:src.template.MyTemplate}{{4.1.1}{63}{src.template module}{section*.458}{}}
-\newlabel{commands/apidoc/src:src.template.MyTemplate.delimiter}{{4.1.1}{63}{src.template module}{section*.459}{}}
-\newlabel{commands/apidoc/src:src.template.MyTemplate.pattern}{{4.1.1}{63}{src.template module}{section*.460}{}}
-\newlabel{commands/apidoc/src:src.template.substitute}{{4.1.1}{63}{src.template module}{section*.461}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.test\_module module}{63}{subsubsection*.462}}
-\newlabel{commands/apidoc/src:module-src.test_module}{{4.1.1}{63}{src.test\_module module}{subsubsection*.462}{}}
-\newlabel{commands/apidoc/src:src-test-module-module}{{4.1.1}{63}{src.test\_module module}{subsubsection*.462}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test}{{4.1.1}{63}{src.test\_module module}{section*.463}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.generate_launching_commands}{{4.1.1}{63}{src.test\_module module}{section*.464}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.generate_script}{{4.1.1}{63}{src.test\_module module}{section*.465}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.get_test_timeout}{{4.1.1}{63}{src.test\_module module}{section*.466}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.get_tmp_dir}{{4.1.1}{63}{src.test\_module module}{section*.467}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.prepare_testbase}{{4.1.1}{63}{src.test\_module module}{section*.468}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.prepare_testbase_from_dir}{{4.1.1}{64}{src.test\_module module}{section*.469}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.prepare_testbase_from_git}{{4.1.1}{64}{src.test\_module module}{section*.470}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.prepare_testbase_from_svn}{{4.1.1}{64}{src.test\_module module}{section*.471}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.read_results}{{4.1.1}{64}{src.test\_module module}{section*.472}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.run_all_tests}{{4.1.1}{64}{src.test\_module module}{section*.473}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.run_grid_tests}{{4.1.1}{64}{src.test\_module module}{section*.474}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.run_script}{{4.1.1}{64}{src.test\_module module}{section*.475}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.run_session_tests}{{4.1.1}{64}{src.test\_module module}{section*.476}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.run_testbase_tests}{{4.1.1}{64}{src.test\_module module}{section*.477}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.run_tests}{{4.1.1}{64}{src.test\_module module}{section*.478}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.search_known_errors}{{4.1.1}{64}{src.test\_module module}{section*.479}{}}
-\newlabel{commands/apidoc/src:src.test_module.Test.write_test_margin}{{4.1.1}{64}{src.test\_module module}{section*.480}{}}
-\newlabel{commands/apidoc/src:src.test_module.getTmpDirDEFAULT}{{4.1.1}{64}{src.test\_module module}{section*.481}{}}
-\@writefile{toc}{\contentsline {subsubsection}{src.xmlManager module}{64}{subsubsection*.482}}
-\newlabel{commands/apidoc/src:src-xmlmanager-module}{{4.1.1}{64}{src.xmlManager module}{subsubsection*.482}{}}
-\newlabel{commands/apidoc/src:module-src.xmlManager}{{4.1.1}{64}{src.xmlManager module}{subsubsection*.482}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.ReadXmlFile}{{4.1.1}{64}{src.xmlManager module}{section*.483}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.ReadXmlFile.getRootAttrib}{{4.1.1}{64}{src.xmlManager module}{section*.484}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.ReadXmlFile.get_attrib}{{4.1.1}{64}{src.xmlManager module}{section*.485}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.ReadXmlFile.get_node_text}{{4.1.1}{64}{src.xmlManager module}{section*.486}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile}{{4.1.1}{64}{src.xmlManager module}{section*.487}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile.add_simple_node}{{4.1.1}{64}{src.xmlManager module}{section*.488}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile.append_node_attrib}{{4.1.1}{65}{src.xmlManager module}{section*.489}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile.append_node_text}{{4.1.1}{65}{src.xmlManager module}{section*.490}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile.write_tree}{{4.1.1}{65}{src.xmlManager module}{section*.491}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.add_simple_node}{{4.1.1}{65}{src.xmlManager module}{section*.492}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.append_node_attrib}{{4.1.1}{65}{src.xmlManager module}{section*.493}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.find_node_by_attrib}{{4.1.1}{65}{src.xmlManager module}{section*.494}{}}
-\newlabel{commands/apidoc/src:src.xmlManager.write_report}{{4.1.1}{65}{src.xmlManager module}{section*.495}{}}
-\@writefile{toc}{\contentsline {subsubsection}{Module contents}{66}{subsubsection*.496}}
-\newlabel{commands/apidoc/src:module-src}{{4.1.1}{66}{Module contents}{subsubsection*.496}{}}
-\newlabel{commands/apidoc/src:module-contents}{{4.1.1}{66}{Module contents}{subsubsection*.496}{}}
-\newlabel{commands/apidoc/src:src.Path}{{4.1.1}{66}{Module contents}{section*.497}{}}
-\newlabel{commands/apidoc/src:src.Path.base}{{4.1.1}{66}{Module contents}{section*.498}{}}
-\newlabel{commands/apidoc/src:src.Path.chmod}{{4.1.1}{66}{Module contents}{section*.499}{}}
-\newlabel{commands/apidoc/src:src.Path.copy}{{4.1.1}{66}{Module contents}{section*.500}{}}
-\newlabel{commands/apidoc/src:src.Path.copydir}{{4.1.1}{66}{Module contents}{section*.501}{}}
-\newlabel{commands/apidoc/src:src.Path.copyfile}{{4.1.1}{66}{Module contents}{section*.502}{}}
-\newlabel{commands/apidoc/src:src.Path.copylink}{{4.1.1}{66}{Module contents}{section*.503}{}}
-\newlabel{commands/apidoc/src:src.Path.dir}{{4.1.1}{66}{Module contents}{section*.504}{}}
-\newlabel{commands/apidoc/src:src.Path.exists}{{4.1.1}{66}{Module contents}{section*.505}{}}
-\newlabel{commands/apidoc/src:src.Path.isdir}{{4.1.1}{66}{Module contents}{section*.506}{}}
-\newlabel{commands/apidoc/src:src.Path.isfile}{{4.1.1}{66}{Module contents}{section*.507}{}}
-\newlabel{commands/apidoc/src:src.Path.islink}{{4.1.1}{66}{Module contents}{section*.508}{}}
-\newlabel{commands/apidoc/src:src.Path.list}{{4.1.1}{66}{Module contents}{section*.509}{}}
-\newlabel{commands/apidoc/src:src.Path.make}{{4.1.1}{66}{Module contents}{section*.510}{}}
-\newlabel{commands/apidoc/src:src.Path.readlink}{{4.1.1}{66}{Module contents}{section*.511}{}}
-\newlabel{commands/apidoc/src:src.Path.rm}{{4.1.1}{66}{Module contents}{section*.512}{}}
-\newlabel{commands/apidoc/src:src.Path.smartcopy}{{4.1.1}{66}{Module contents}{section*.513}{}}
-\newlabel{commands/apidoc/src:src.Path.symlink}{{4.1.1}{66}{Module contents}{section*.514}{}}
-\newlabel{commands/apidoc/src:src.SatException}{{4.1.1}{66}{Module contents}{section*.515}{}}
-\newlabel{commands/apidoc/src:src.activate_mesa_property}{{4.1.1}{66}{Module contents}{section*.516}{}}
-\newlabel{commands/apidoc/src:src.check_config_has_application}{{4.1.1}{66}{Module contents}{section*.517}{}}
-\newlabel{commands/apidoc/src:src.check_config_has_profile}{{4.1.1}{66}{Module contents}{section*.518}{}}
-\newlabel{commands/apidoc/src:src.config_has_application}{{4.1.1}{66}{Module contents}{section*.519}{}}
-\newlabel{commands/apidoc/src:src.deepcopy_list}{{4.1.1}{66}{Module contents}{section*.520}{}}
-\newlabel{commands/apidoc/src:src.ensure_path_exists}{{4.1.1}{67}{Module contents}{section*.521}{}}
-\newlabel{commands/apidoc/src:src.find_file_in_lpath}{{4.1.1}{67}{Module contents}{section*.522}{}}
-\newlabel{commands/apidoc/src:src.get_base_path}{{4.1.1}{67}{Module contents}{section*.523}{}}
-\newlabel{commands/apidoc/src:src.get_cfg_param}{{4.1.1}{67}{Module contents}{section*.524}{}}
-\newlabel{commands/apidoc/src:src.get_launcher_name}{{4.1.1}{67}{Module contents}{section*.525}{}}
-\newlabel{commands/apidoc/src:src.get_log_path}{{4.1.1}{67}{Module contents}{section*.526}{}}
-\newlabel{commands/apidoc/src:src.get_property_in_product_cfg}{{4.1.1}{67}{Module contents}{section*.527}{}}
-\newlabel{commands/apidoc/src:src.get_salome_version}{{4.1.1}{67}{Module contents}{section*.528}{}}
-\newlabel{commands/apidoc/src:src.get_tmp_filename}{{4.1.1}{67}{Module contents}{section*.529}{}}
-\newlabel{commands/apidoc/src:src.handleRemoveReadonly}{{4.1.1}{68}{Module contents}{section*.530}{}}
-\newlabel{commands/apidoc/src:src.merge_dicts}{{4.1.1}{68}{Module contents}{section*.531}{}}
-\newlabel{commands/apidoc/src:src.only_numbers}{{4.1.1}{68}{Module contents}{section*.532}{}}
-\newlabel{commands/apidoc/src:src.parse_date}{{4.1.1}{68}{Module contents}{section*.533}{}}
-\newlabel{commands/apidoc/src:src.print_info}{{4.1.1}{68}{Module contents}{section*.534}{}}
-\newlabel{commands/apidoc/src:src.read_config_from_a_file}{{4.1.1}{68}{Module contents}{section*.535}{}}
-\newlabel{commands/apidoc/src:src.remove_item_from_list}{{4.1.1}{68}{Module contents}{section*.536}{}}
-\newlabel{commands/apidoc/src:src.replace_in_file}{{4.1.1}{68}{Module contents}{section*.537}{}}
-\@writefile{toc}{\contentsline {chapter}{\numberline {5}Release Notes}{69}{chapter.5}}
+\newlabel{commands/apidoc/src:src.debug.InStream}{{4.1.1}{36}{src.debug module}{section*.189}{}}
+\newlabel{commands/apidoc/src:src.debug.OutStream}{{4.1.1}{36}{src.debug module}{section*.190}{}}
+\newlabel{commands/apidoc/src:src.debug.OutStream.close}{{4.1.1}{36}{src.debug module}{section*.191}{}}
+\newlabel{commands/apidoc/src:src.debug.format_color_exception}{{4.1.1}{36}{src.debug module}{section*.192}{}}
+\newlabel{commands/apidoc/src:src.debug.format_exception}{{4.1.1}{36}{src.debug module}{section*.193}{}}
+\newlabel{commands/apidoc/src:src.debug.getLocalEnv}{{4.1.1}{36}{src.debug module}{section*.194}{}}
+\newlabel{commands/apidoc/src:src.debug.getStrConfigDbg}{{4.1.1}{36}{src.debug module}{section*.195}{}}
+\newlabel{commands/apidoc/src:src.debug.getStrConfigStd}{{4.1.1}{36}{src.debug module}{section*.196}{}}
+\newlabel{commands/apidoc/src:src.debug.indent}{{4.1.1}{36}{src.debug module}{section*.197}{}}
+\newlabel{commands/apidoc/src:src.debug.isTypeConfig}{{4.1.1}{36}{src.debug module}{section*.198}{}}
+\newlabel{commands/apidoc/src:src.debug.pop_debug}{{4.1.1}{36}{src.debug module}{section*.199}{}}
+\newlabel{commands/apidoc/src:src.debug.push_debug}{{4.1.1}{36}{src.debug module}{section*.200}{}}
+\newlabel{commands/apidoc/src:src.debug.saveConfigDbg}{{4.1.1}{36}{src.debug module}{section*.201}{}}
+\newlabel{commands/apidoc/src:src.debug.saveConfigStd}{{4.1.1}{36}{src.debug module}{section*.202}{}}
+\newlabel{commands/apidoc/src:src.debug.tofix}{{4.1.1}{36}{src.debug module}{section*.203}{}}
+\newlabel{commands/apidoc/src:src.debug.write}{{4.1.1}{36}{src.debug module}{section*.204}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.environment module}{36}{subsubsection*.205}}
+\newlabel{commands/apidoc/src:src-environment-module}{{4.1.1}{36}{src.environment module}{subsubsection*.205}{}}
+\newlabel{commands/apidoc/src:module-src.environment}{{4.1.1}{36}{src.environment module}{subsubsection*.205}{}}
+\newlabel{commands/apidoc/src:src.environment.Environ}{{4.1.1}{36}{src.environment module}{section*.206}{}}
+\newlabel{commands/apidoc/src:src.environment.Environ.append}{{4.1.1}{36}{src.environment module}{section*.207}{}}
+\newlabel{commands/apidoc/src:src.environment.Environ.append_value}{{4.1.1}{37}{src.environment module}{section*.208}{}}
+\newlabel{commands/apidoc/src:src.environment.Environ.command_value}{{4.1.1}{37}{src.environment module}{section*.209}{}}
+\newlabel{commands/apidoc/src:src.environment.Environ.get}{{4.1.1}{37}{src.environment module}{section*.210}{}}
+\newlabel{commands/apidoc/src:src.environment.Environ.is_defined}{{4.1.1}{37}{src.environment module}{section*.211}{}}
+\newlabel{commands/apidoc/src:src.environment.Environ.prepend}{{4.1.1}{37}{src.environment module}{section*.212}{}}
+\newlabel{commands/apidoc/src:src.environment.Environ.prepend_value}{{4.1.1}{37}{src.environment module}{section*.213}{}}
+\newlabel{commands/apidoc/src:src.environment.Environ.set}{{4.1.1}{37}{src.environment module}{section*.214}{}}
+\newlabel{commands/apidoc/src:src.environment.FileEnvWriter}{{4.1.1}{37}{src.environment module}{section*.215}{}}
+\newlabel{commands/apidoc/src:src.environment.FileEnvWriter.write_cfgForPy_file}{{4.1.1}{37}{src.environment module}{section*.216}{}}
+\newlabel{commands/apidoc/src:src.environment.FileEnvWriter.write_env_file}{{4.1.1}{38}{src.environment module}{section*.217}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron}{{4.1.1}{38}{src.environment module}{section*.218}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.add_comment}{{4.1.1}{38}{src.environment module}{section*.219}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.add_line}{{4.1.1}{38}{src.environment module}{section*.220}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.add_warning}{{4.1.1}{38}{src.environment module}{section*.221}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.append}{{4.1.1}{38}{src.environment module}{section*.222}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.dump}{{4.1.1}{38}{src.environment module}{section*.223}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.finish}{{4.1.1}{38}{src.environment module}{section*.224}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.get}{{4.1.1}{38}{src.environment module}{section*.225}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.get_names}{{4.1.1}{38}{src.environment module}{section*.226}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.is_defined}{{4.1.1}{38}{src.environment module}{section*.227}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.load_cfg_environment}{{4.1.1}{39}{src.environment module}{section*.228}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.prepend}{{4.1.1}{39}{src.environment module}{section*.229}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.run_env_script}{{4.1.1}{39}{src.environment module}{section*.230}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.run_simple_env_script}{{4.1.1}{39}{src.environment module}{section*.231}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set}{{4.1.1}{39}{src.environment module}{section*.232}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_a_product}{{4.1.1}{39}{src.environment module}{section*.233}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_application_env}{{4.1.1}{39}{src.environment module}{section*.234}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_cpp_env}{{4.1.1}{39}{src.environment module}{section*.235}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_full_environ}{{4.1.1}{39}{src.environment module}{section*.236}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_products}{{4.1.1}{40}{src.environment module}{section*.237}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_python_libdirs}{{4.1.1}{40}{src.environment module}{section*.238}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_salome_generic_product_env}{{4.1.1}{40}{src.environment module}{section*.239}{}}
+\newlabel{commands/apidoc/src:src.environment.SalomeEnviron.set_salome_minimal_product_env}{{4.1.1}{40}{src.environment module}{section*.240}{}}
+\newlabel{commands/apidoc/src:src.environment.Shell}{{4.1.1}{40}{src.environment module}{section*.241}{}}
+\newlabel{commands/apidoc/src:src.environment.load_environment}{{4.1.1}{40}{src.environment module}{section*.242}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.fileEnviron module}{40}{subsubsection*.243}}
+\newlabel{commands/apidoc/src:src-fileenviron-module}{{4.1.1}{40}{src.fileEnviron module}{subsubsection*.243}{}}
+\newlabel{commands/apidoc/src:module-src.fileEnviron}{{4.1.1}{40}{src.fileEnviron module}{subsubsection*.243}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BashFileEnviron}{{4.1.1}{40}{src.fileEnviron module}{section*.244}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BashFileEnviron.command_value}{{4.1.1}{40}{src.fileEnviron module}{section*.245}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BashFileEnviron.finish}{{4.1.1}{40}{src.fileEnviron module}{section*.246}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BashFileEnviron.set}{{4.1.1}{40}{src.fileEnviron module}{section*.247}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron}{{4.1.1}{41}{src.fileEnviron module}{section*.248}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.add_comment}{{4.1.1}{41}{src.fileEnviron module}{section*.249}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.command_value}{{4.1.1}{41}{src.fileEnviron module}{section*.250}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.finish}{{4.1.1}{41}{src.fileEnviron module}{section*.251}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.get}{{4.1.1}{41}{src.fileEnviron module}{section*.252}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.BatFileEnviron.set}{{4.1.1}{41}{src.fileEnviron module}{section*.253}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron}{{4.1.1}{41}{src.fileEnviron module}{section*.254}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.add_echo}{{4.1.1}{41}{src.fileEnviron module}{section*.255}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.add_warning}{{4.1.1}{41}{src.fileEnviron module}{section*.256}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.append_value}{{4.1.1}{41}{src.fileEnviron module}{section*.257}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.command_value}{{4.1.1}{41}{src.fileEnviron module}{section*.258}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.finish}{{4.1.1}{42}{src.fileEnviron module}{section*.259}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.get}{{4.1.1}{42}{src.fileEnviron module}{section*.260}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.prepend_value}{{4.1.1}{42}{src.fileEnviron module}{section*.261}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ContextFileEnviron.set}{{4.1.1}{42}{src.fileEnviron module}{section*.262}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron}{{4.1.1}{42}{src.fileEnviron module}{section*.263}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.add_comment}{{4.1.1}{42}{src.fileEnviron module}{section*.264}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.add_echo}{{4.1.1}{42}{src.fileEnviron module}{section*.265}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.add_line}{{4.1.1}{42}{src.fileEnviron module}{section*.266}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.add_warning}{{4.1.1}{42}{src.fileEnviron module}{section*.267}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.append}{{4.1.1}{42}{src.fileEnviron module}{section*.268}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.append_value}{{4.1.1}{42}{src.fileEnviron module}{section*.269}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.command_value}{{4.1.1}{43}{src.fileEnviron module}{section*.270}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.finish}{{4.1.1}{43}{src.fileEnviron module}{section*.271}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.get}{{4.1.1}{43}{src.fileEnviron module}{section*.272}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.is_defined}{{4.1.1}{43}{src.fileEnviron module}{section*.273}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.prepend}{{4.1.1}{43}{src.fileEnviron module}{section*.274}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.prepend_value}{{4.1.1}{43}{src.fileEnviron module}{section*.275}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.FileEnviron.set}{{4.1.1}{43}{src.fileEnviron module}{section*.276}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron}{{4.1.1}{43}{src.fileEnviron module}{section*.277}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add}{{4.1.1}{43}{src.fileEnviron module}{section*.278}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add_comment}{{4.1.1}{44}{src.fileEnviron module}{section*.279}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add_echo}{{4.1.1}{44}{src.fileEnviron module}{section*.280}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add_line}{{4.1.1}{44}{src.fileEnviron module}{section*.281}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.add_warning}{{4.1.1}{44}{src.fileEnviron module}{section*.282}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.append}{{4.1.1}{44}{src.fileEnviron module}{section*.283}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.append_value}{{4.1.1}{44}{src.fileEnviron module}{section*.284}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.change_to_launcher}{{4.1.1}{44}{src.fileEnviron module}{section*.285}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.command_value}{{4.1.1}{44}{src.fileEnviron module}{section*.286}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.finish}{{4.1.1}{44}{src.fileEnviron module}{section*.287}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.get}{{4.1.1}{44}{src.fileEnviron module}{section*.288}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.is_defined}{{4.1.1}{44}{src.fileEnviron module}{section*.289}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.prepend}{{4.1.1}{44}{src.fileEnviron module}{section*.290}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.prepend_value}{{4.1.1}{45}{src.fileEnviron module}{section*.291}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.LauncherFileEnviron.set}{{4.1.1}{45}{src.fileEnviron module}{section*.292}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron}{{4.1.1}{45}{src.fileEnviron module}{section*.293}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.add_comment}{{4.1.1}{45}{src.fileEnviron module}{section*.294}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.add_echo}{{4.1.1}{45}{src.fileEnviron module}{section*.295}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.add_line}{{4.1.1}{45}{src.fileEnviron module}{section*.296}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.add_warning}{{4.1.1}{45}{src.fileEnviron module}{section*.297}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.append}{{4.1.1}{45}{src.fileEnviron module}{section*.298}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.command_value}{{4.1.1}{45}{src.fileEnviron module}{section*.299}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.get}{{4.1.1}{45}{src.fileEnviron module}{section*.300}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.is_defined}{{4.1.1}{45}{src.fileEnviron module}{section*.301}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.prepend}{{4.1.1}{46}{src.fileEnviron module}{section*.302}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.run_env_script}{{4.1.1}{46}{src.fileEnviron module}{section*.303}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.set}{{4.1.1}{46}{src.fileEnviron module}{section*.304}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.ScreenEnviron.write}{{4.1.1}{46}{src.fileEnviron module}{section*.305}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.get_file_environ}{{4.1.1}{46}{src.fileEnviron module}{section*.306}{}}
+\newlabel{commands/apidoc/src:src.fileEnviron.special_path_separator}{{4.1.1}{46}{src.fileEnviron module}{section*.307}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.fork module}{46}{subsubsection*.308}}
+\newlabel{commands/apidoc/src:module-src.fork}{{4.1.1}{46}{src.fork module}{subsubsection*.308}{}}
+\newlabel{commands/apidoc/src:src-fork-module}{{4.1.1}{46}{src.fork module}{subsubsection*.308}{}}
+\newlabel{commands/apidoc/src:src.fork.batch}{{4.1.1}{46}{src.fork module}{section*.309}{}}
+\newlabel{commands/apidoc/src:src.fork.batch_salome}{{4.1.1}{46}{src.fork module}{section*.310}{}}
+\newlabel{commands/apidoc/src:src.fork.launch_command}{{4.1.1}{46}{src.fork module}{section*.311}{}}
+\newlabel{commands/apidoc/src:src.fork.show_progress}{{4.1.1}{46}{src.fork module}{section*.312}{}}
+\newlabel{commands/apidoc/src:src.fork.write_back}{{4.1.1}{46}{src.fork module}{section*.313}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.logger module}{47}{subsubsection*.314}}
+\newlabel{commands/apidoc/src:module-src.logger}{{4.1.1}{47}{src.logger module}{subsubsection*.314}{}}
+\newlabel{commands/apidoc/src:src-logger-module}{{4.1.1}{47}{src.logger module}{subsubsection*.314}{}}
+\newlabel{commands/apidoc/src:src.logger.Logger}{{4.1.1}{47}{src.logger module}{section*.315}{}}
+\newlabel{commands/apidoc/src:src.logger.Logger.add_link}{{4.1.1}{47}{src.logger module}{section*.316}{}}
+\newlabel{commands/apidoc/src:src.logger.Logger.end_write}{{4.1.1}{47}{src.logger module}{section*.317}{}}
+\newlabel{commands/apidoc/src:src.logger.Logger.error}{{4.1.1}{47}{src.logger module}{section*.318}{}}
+\newlabel{commands/apidoc/src:src.logger.Logger.flush}{{4.1.1}{47}{src.logger module}{section*.319}{}}
+\newlabel{commands/apidoc/src:src.logger.Logger.put_initial_xml_fields}{{4.1.1}{47}{src.logger module}{section*.320}{}}
+\newlabel{commands/apidoc/src:src.logger.Logger.write}{{4.1.1}{47}{src.logger module}{section*.321}{}}
+\newlabel{commands/apidoc/src:src.logger.date_to_datetime}{{4.1.1}{47}{src.logger module}{section*.322}{}}
+\newlabel{commands/apidoc/src:src.logger.getCurrentLogger}{{4.1.1}{47}{src.logger module}{section*.323}{}}
+\newlabel{commands/apidoc/src:src.logger.getDefaultLogger}{{4.1.1}{47}{src.logger module}{section*.324}{}}
+\newlabel{commands/apidoc/src:src.logger.getUnittestLogger}{{4.1.1}{47}{src.logger module}{section*.325}{}}
+\newlabel{commands/apidoc/src:src.logger.isCurrentLoggerUnittest}{{4.1.1}{48}{src.logger module}{section*.326}{}}
+\newlabel{commands/apidoc/src:src.logger.list_log_file}{{4.1.1}{48}{src.logger module}{section*.327}{}}
+\newlabel{commands/apidoc/src:src.logger.sendMessageToCurrentLogger}{{4.1.1}{48}{src.logger module}{section*.328}{}}
+\newlabel{commands/apidoc/src:src.logger.setCurrentLogger}{{4.1.1}{48}{src.logger module}{section*.329}{}}
+\newlabel{commands/apidoc/src:src.logger.show_command_log}{{4.1.1}{48}{src.logger module}{section*.330}{}}
+\newlabel{commands/apidoc/src:src.logger.timedelta_total_seconds}{{4.1.1}{48}{src.logger module}{section*.331}{}}
+\newlabel{commands/apidoc/src:src.logger.update_hat_xml}{{4.1.1}{48}{src.logger module}{section*.332}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.options module}{48}{subsubsection*.333}}
+\newlabel{commands/apidoc/src:module-src.options}{{4.1.1}{48}{src.options module}{subsubsection*.333}{}}
+\newlabel{commands/apidoc/src:src-options-module}{{4.1.1}{48}{src.options module}{subsubsection*.333}{}}
+\newlabel{commands/apidoc/src:src.options.OptResult}{{4.1.1}{48}{src.options module}{section*.334}{}}
+\newlabel{commands/apidoc/src:src.options.Options}{{4.1.1}{49}{src.options module}{section*.335}{}}
+\newlabel{commands/apidoc/src:src.options.Options.add_option}{{4.1.1}{49}{src.options module}{section*.336}{}}
+\newlabel{commands/apidoc/src:src.options.Options.debug_write}{{4.1.1}{49}{src.options module}{section*.337}{}}
+\newlabel{commands/apidoc/src:src.options.Options.filterLevel}{{4.1.1}{49}{src.options module}{section*.338}{}}
+\newlabel{commands/apidoc/src:src.options.Options.filterList2}{{4.1.1}{49}{src.options module}{section*.339}{}}
+\newlabel{commands/apidoc/src:src.options.Options.getDetailOption}{{4.1.1}{49}{src.options module}{section*.340}{}}
+\newlabel{commands/apidoc/src:src.options.Options.get_help}{{4.1.1}{49}{src.options module}{section*.341}{}}
+\newlabel{commands/apidoc/src:src.options.Options.indent}{{4.1.1}{49}{src.options module}{section*.342}{}}
+\newlabel{commands/apidoc/src:src.options.Options.parse_args}{{4.1.1}{49}{src.options module}{section*.343}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.printcolors module}{49}{subsubsection*.344}}
+\newlabel{commands/apidoc/src:module-src.printcolors}{{4.1.1}{49}{src.printcolors module}{subsubsection*.344}{}}
+\newlabel{commands/apidoc/src:src-printcolors-module}{{4.1.1}{49}{src.printcolors module}{subsubsection*.344}{}}
+\newlabel{commands/apidoc/src:src.printcolors.cleancolor}{{4.1.1}{49}{src.printcolors module}{section*.345}{}}
+\newlabel{commands/apidoc/src:src.printcolors.print_color_map}{{4.1.1}{49}{src.printcolors module}{section*.346}{}}
+\newlabel{commands/apidoc/src:src.printcolors.print_color_range}{{4.1.1}{50}{src.printcolors module}{section*.347}{}}
+\newlabel{commands/apidoc/src:src.printcolors.print_value}{{4.1.1}{50}{src.printcolors module}{section*.348}{}}
+\newlabel{commands/apidoc/src:src.printcolors.printc}{{4.1.1}{50}{src.printcolors module}{section*.349}{}}
+\newlabel{commands/apidoc/src:src.printcolors.printcError}{{4.1.1}{50}{src.printcolors module}{section*.350}{}}
+\newlabel{commands/apidoc/src:src.printcolors.printcHeader}{{4.1.1}{50}{src.printcolors module}{section*.351}{}}
+\newlabel{commands/apidoc/src:src.printcolors.printcHighlight}{{4.1.1}{50}{src.printcolors module}{section*.352}{}}
+\newlabel{commands/apidoc/src:src.printcolors.printcInfo}{{4.1.1}{50}{src.printcolors module}{section*.353}{}}
+\newlabel{commands/apidoc/src:src.printcolors.printcLabel}{{4.1.1}{51}{src.printcolors module}{section*.354}{}}
+\newlabel{commands/apidoc/src:src.printcolors.printcSuccess}{{4.1.1}{51}{src.printcolors module}{section*.355}{}}
+\newlabel{commands/apidoc/src:src.printcolors.printcWarning}{{4.1.1}{51}{src.printcolors module}{section*.356}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.product module}{51}{subsubsection*.357}}
+\newlabel{commands/apidoc/src:module-src.product}{{4.1.1}{51}{src.product module}{subsubsection*.357}{}}
+\newlabel{commands/apidoc/src:src-product-module}{{4.1.1}{51}{src.product module}{subsubsection*.357}{}}
+\newlabel{commands/apidoc/src:src.product.check_config_exists}{{4.1.1}{51}{src.product module}{section*.358}{}}
+\newlabel{commands/apidoc/src:src.product.check_installation}{{4.1.1}{51}{src.product module}{section*.359}{}}
+\newlabel{commands/apidoc/src:src.product.check_source}{{4.1.1}{51}{src.product module}{section*.360}{}}
+\newlabel{commands/apidoc/src:src.product.get_base_install_dir}{{4.1.1}{51}{src.product module}{section*.361}{}}
+\newlabel{commands/apidoc/src:src.product.get_install_dir}{{4.1.1}{52}{src.product module}{section*.362}{}}
+\newlabel{commands/apidoc/src:src.product.get_product_components}{{4.1.1}{52}{src.product module}{section*.363}{}}
+\newlabel{commands/apidoc/src:src.product.get_product_config}{{4.1.1}{52}{src.product module}{section*.364}{}}
+\newlabel{commands/apidoc/src:src.product.get_product_dependencies}{{4.1.1}{52}{src.product module}{section*.365}{}}
+\newlabel{commands/apidoc/src:src.product.get_product_section}{{4.1.1}{52}{src.product module}{section*.366}{}}
+\newlabel{commands/apidoc/src:src.product.get_products_infos}{{4.1.1}{53}{src.product module}{section*.367}{}}
+\newlabel{commands/apidoc/src:src.product.product_compiles}{{4.1.1}{53}{src.product module}{section*.368}{}}
+\newlabel{commands/apidoc/src:src.product.product_has_env_script}{{4.1.1}{53}{src.product module}{section*.369}{}}
+\newlabel{commands/apidoc/src:src.product.product_has_logo}{{4.1.1}{53}{src.product module}{section*.370}{}}
+\newlabel{commands/apidoc/src:src.product.product_has_patches}{{4.1.1}{53}{src.product module}{section*.371}{}}
+\newlabel{commands/apidoc/src:src.product.product_has_salome_gui}{{4.1.1}{53}{src.product module}{section*.372}{}}
+\newlabel{commands/apidoc/src:src.product.product_has_script}{{4.1.1}{53}{src.product module}{section*.373}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_autotools}{{4.1.1}{53}{src.product module}{section*.374}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_cmake}{{4.1.1}{54}{src.product module}{section*.375}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_cpp}{{4.1.1}{54}{src.product module}{section*.376}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_debug}{{4.1.1}{54}{src.product module}{section*.377}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_dev}{{4.1.1}{54}{src.product module}{section*.378}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_fixed}{{4.1.1}{54}{src.product module}{section*.379}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_generated}{{4.1.1}{54}{src.product module}{section*.380}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_mpi}{{4.1.1}{54}{src.product module}{section*.381}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_native}{{4.1.1}{54}{src.product module}{section*.382}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_salome}{{4.1.1}{55}{src.product module}{section*.383}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_smesh_plugin}{{4.1.1}{55}{src.product module}{section*.384}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_vcs}{{4.1.1}{55}{src.product module}{section*.385}{}}
+\newlabel{commands/apidoc/src:src.product.product_is_verbose}{{4.1.1}{55}{src.product module}{section*.386}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.pyconf module}{55}{subsubsection*.387}}
+\newlabel{commands/apidoc/src:src-pyconf-module}{{4.1.1}{55}{src.pyconf module}{subsubsection*.387}{}}
+\newlabel{commands/apidoc/src:module-src.pyconf}{{4.1.1}{55}{src.pyconf module}{subsubsection*.387}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Config}{{4.1.1}{56}{src.pyconf module}{section*.388}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Config.Namespace}{{4.1.1}{56}{src.pyconf module}{section*.389}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Config.addNamespace}{{4.1.1}{56}{src.pyconf module}{section*.390}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Config.getByPath}{{4.1.1}{56}{src.pyconf module}{section*.391}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Config.load}{{4.1.1}{56}{src.pyconf module}{section*.392}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Config.removeNamespace}{{4.1.1}{57}{src.pyconf module}{section*.393}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigError}{{4.1.1}{57}{src.pyconf module}{section*.394}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigFormatError}{{4.1.1}{57}{src.pyconf module}{section*.395}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigInputStream}{{4.1.1}{57}{src.pyconf module}{section*.396}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigInputStream.close}{{4.1.1}{57}{src.pyconf module}{section*.397}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigInputStream.read}{{4.1.1}{57}{src.pyconf module}{section*.398}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigInputStream.readline}{{4.1.1}{57}{src.pyconf module}{section*.399}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigList}{{4.1.1}{57}{src.pyconf module}{section*.400}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigList.getByPath}{{4.1.1}{57}{src.pyconf module}{section*.401}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger}{{4.1.1}{57}{src.pyconf module}{section*.402}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.handleMismatch}{{4.1.1}{57}{src.pyconf module}{section*.403}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.merge}{{4.1.1}{57}{src.pyconf module}{section*.404}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.mergeMapping}{{4.1.1}{57}{src.pyconf module}{section*.405}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.mergeSequence}{{4.1.1}{58}{src.pyconf module}{section*.406}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigMerger.overwriteKeys}{{4.1.1}{58}{src.pyconf module}{section*.407}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigOutputStream}{{4.1.1}{58}{src.pyconf module}{section*.408}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigOutputStream.close}{{4.1.1}{58}{src.pyconf module}{section*.409}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigOutputStream.flush}{{4.1.1}{58}{src.pyconf module}{section*.410}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigOutputStream.write}{{4.1.1}{58}{src.pyconf module}{section*.411}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader}{{4.1.1}{58}{src.pyconf module}{section*.412}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.getChar}{{4.1.1}{58}{src.pyconf module}{section*.413}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.getToken}{{4.1.1}{58}{src.pyconf module}{section*.414}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.load}{{4.1.1}{58}{src.pyconf module}{section*.415}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.location}{{4.1.1}{58}{src.pyconf module}{section*.416}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.match}{{4.1.1}{58}{src.pyconf module}{section*.417}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseFactor}{{4.1.1}{58}{src.pyconf module}{section*.418}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseKeyValuePair}{{4.1.1}{59}{src.pyconf module}{section*.419}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseMapping}{{4.1.1}{59}{src.pyconf module}{section*.420}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseMappingBody}{{4.1.1}{59}{src.pyconf module}{section*.421}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseReference}{{4.1.1}{59}{src.pyconf module}{section*.422}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseScalar}{{4.1.1}{59}{src.pyconf module}{section*.423}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseSequence}{{4.1.1}{59}{src.pyconf module}{section*.424}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseSuffix}{{4.1.1}{59}{src.pyconf module}{section*.425}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseTerm}{{4.1.1}{59}{src.pyconf module}{section*.426}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.parseValue}{{4.1.1}{59}{src.pyconf module}{section*.427}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigReader.setStream}{{4.1.1}{59}{src.pyconf module}{section*.428}{}}
+\newlabel{commands/apidoc/src:src.pyconf.ConfigResolutionError}{{4.1.1}{59}{src.pyconf module}{section*.429}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Container}{{4.1.1}{59}{src.pyconf module}{section*.430}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Container.evaluate}{{4.1.1}{60}{src.pyconf module}{section*.431}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Container.setPath}{{4.1.1}{60}{src.pyconf module}{section*.432}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Container.writeToStream}{{4.1.1}{60}{src.pyconf module}{section*.433}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Container.writeValue}{{4.1.1}{60}{src.pyconf module}{section*.434}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Expression}{{4.1.1}{60}{src.pyconf module}{section*.435}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Expression.evaluate}{{4.1.1}{60}{src.pyconf module}{section*.436}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Mapping}{{4.1.1}{60}{src.pyconf module}{section*.437}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Mapping.addMapping}{{4.1.1}{60}{src.pyconf module}{section*.438}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Mapping.get}{{4.1.1}{60}{src.pyconf module}{section*.439}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Mapping.iteritems}{{4.1.1}{60}{src.pyconf module}{section*.440}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Mapping.iterkeys}{{4.1.1}{60}{src.pyconf module}{section*.441}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Mapping.keys}{{4.1.1}{60}{src.pyconf module}{section*.442}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Mapping.writeToStream}{{4.1.1}{61}{src.pyconf module}{section*.443}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Reference}{{4.1.1}{61}{src.pyconf module}{section*.444}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Reference.addElement}{{4.1.1}{61}{src.pyconf module}{section*.445}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Reference.findConfig}{{4.1.1}{61}{src.pyconf module}{section*.446}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Reference.resolve}{{4.1.1}{61}{src.pyconf module}{section*.447}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Sequence}{{4.1.1}{61}{src.pyconf module}{section*.448}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Sequence.SeqIter}{{4.1.1}{61}{src.pyconf module}{section*.449}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Sequence.SeqIter.next}{{4.1.1}{61}{src.pyconf module}{section*.450}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Sequence.append}{{4.1.1}{61}{src.pyconf module}{section*.451}{}}
+\newlabel{commands/apidoc/src:src.pyconf.Sequence.writeToStream}{{4.1.1}{61}{src.pyconf module}{section*.452}{}}
+\newlabel{commands/apidoc/src:src.pyconf.deepCopyMapping}{{4.1.1}{61}{src.pyconf module}{section*.453}{}}
+\newlabel{commands/apidoc/src:src.pyconf.defaultMergeResolve}{{4.1.1}{61}{src.pyconf module}{section*.454}{}}
+\newlabel{commands/apidoc/src:src.pyconf.defaultStreamOpener}{{4.1.1}{62}{src.pyconf module}{section*.455}{}}
+\newlabel{commands/apidoc/src:src.pyconf.isWord}{{4.1.1}{62}{src.pyconf module}{section*.456}{}}
+\newlabel{commands/apidoc/src:src.pyconf.makePath}{{4.1.1}{62}{src.pyconf module}{section*.457}{}}
+\newlabel{commands/apidoc/src:src.pyconf.overwriteMergeResolve}{{4.1.1}{62}{src.pyconf module}{section*.458}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.system module}{62}{subsubsection*.459}}
+\newlabel{commands/apidoc/src:src-system-module}{{4.1.1}{62}{src.system module}{subsubsection*.459}{}}
+\newlabel{commands/apidoc/src:module-src.system}{{4.1.1}{62}{src.system module}{subsubsection*.459}{}}
+\newlabel{commands/apidoc/src:src.system.archive_extract}{{4.1.1}{62}{src.system module}{section*.460}{}}
+\newlabel{commands/apidoc/src:src.system.cvs_extract}{{4.1.1}{62}{src.system module}{section*.461}{}}
+\newlabel{commands/apidoc/src:src.system.git_extract}{{4.1.1}{63}{src.system module}{section*.462}{}}
+\newlabel{commands/apidoc/src:src.system.show_in_editor}{{4.1.1}{63}{src.system module}{section*.463}{}}
+\newlabel{commands/apidoc/src:src.system.svn_extract}{{4.1.1}{63}{src.system module}{section*.464}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.template module}{64}{subsubsection*.465}}
+\newlabel{commands/apidoc/src:module-src.template}{{4.1.1}{64}{src.template module}{subsubsection*.465}{}}
+\newlabel{commands/apidoc/src:src-template-module}{{4.1.1}{64}{src.template module}{subsubsection*.465}{}}
+\newlabel{commands/apidoc/src:src.template.MyTemplate}{{4.1.1}{64}{src.template module}{section*.466}{}}
+\newlabel{commands/apidoc/src:src.template.MyTemplate.delimiter}{{4.1.1}{64}{src.template module}{section*.467}{}}
+\newlabel{commands/apidoc/src:src.template.MyTemplate.pattern}{{4.1.1}{64}{src.template module}{section*.468}{}}
+\newlabel{commands/apidoc/src:src.template.substitute}{{4.1.1}{64}{src.template module}{section*.469}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.test\_module module}{64}{subsubsection*.470}}
+\newlabel{commands/apidoc/src:module-src.test_module}{{4.1.1}{64}{src.test\_module module}{subsubsection*.470}{}}
+\newlabel{commands/apidoc/src:src-test-module-module}{{4.1.1}{64}{src.test\_module module}{subsubsection*.470}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test}{{4.1.1}{64}{src.test\_module module}{section*.471}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.generate_launching_commands}{{4.1.1}{64}{src.test\_module module}{section*.472}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.generate_script}{{4.1.1}{64}{src.test\_module module}{section*.473}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.get_test_timeout}{{4.1.1}{64}{src.test\_module module}{section*.474}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.get_tmp_dir}{{4.1.1}{64}{src.test\_module module}{section*.475}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.prepare_testbase}{{4.1.1}{64}{src.test\_module module}{section*.476}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.prepare_testbase_from_dir}{{4.1.1}{64}{src.test\_module module}{section*.477}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.prepare_testbase_from_git}{{4.1.1}{64}{src.test\_module module}{section*.478}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.prepare_testbase_from_svn}{{4.1.1}{64}{src.test\_module module}{section*.479}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.read_results}{{4.1.1}{64}{src.test\_module module}{section*.480}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.run_all_tests}{{4.1.1}{64}{src.test\_module module}{section*.481}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.run_grid_tests}{{4.1.1}{64}{src.test\_module module}{section*.482}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.run_script}{{4.1.1}{64}{src.test\_module module}{section*.483}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.run_session_tests}{{4.1.1}{64}{src.test\_module module}{section*.484}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.run_testbase_tests}{{4.1.1}{64}{src.test\_module module}{section*.485}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.run_tests}{{4.1.1}{64}{src.test\_module module}{section*.486}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.search_known_errors}{{4.1.1}{64}{src.test\_module module}{section*.487}{}}
+\newlabel{commands/apidoc/src:src.test_module.Test.write_test_margin}{{4.1.1}{64}{src.test\_module module}{section*.488}{}}
+\newlabel{commands/apidoc/src:src.test_module.getTmpDirDEFAULT}{{4.1.1}{64}{src.test\_module module}{section*.489}{}}
+\@writefile{toc}{\contentsline {subsubsection}{src.xmlManager module}{64}{subsubsection*.490}}
+\newlabel{commands/apidoc/src:src-xmlmanager-module}{{4.1.1}{64}{src.xmlManager module}{subsubsection*.490}{}}
+\newlabel{commands/apidoc/src:module-src.xmlManager}{{4.1.1}{64}{src.xmlManager module}{subsubsection*.490}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.ReadXmlFile}{{4.1.1}{64}{src.xmlManager module}{section*.491}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.ReadXmlFile.getRootAttrib}{{4.1.1}{64}{src.xmlManager module}{section*.492}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.ReadXmlFile.get_attrib}{{4.1.1}{65}{src.xmlManager module}{section*.493}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.ReadXmlFile.get_node_text}{{4.1.1}{65}{src.xmlManager module}{section*.494}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile}{{4.1.1}{65}{src.xmlManager module}{section*.495}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile.add_simple_node}{{4.1.1}{65}{src.xmlManager module}{section*.496}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile.append_node_attrib}{{4.1.1}{65}{src.xmlManager module}{section*.497}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile.append_node_text}{{4.1.1}{65}{src.xmlManager module}{section*.498}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.XmlLogFile.write_tree}{{4.1.1}{65}{src.xmlManager module}{section*.499}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.add_simple_node}{{4.1.1}{65}{src.xmlManager module}{section*.500}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.append_node_attrib}{{4.1.1}{66}{src.xmlManager module}{section*.501}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.find_node_by_attrib}{{4.1.1}{66}{src.xmlManager module}{section*.502}{}}
+\newlabel{commands/apidoc/src:src.xmlManager.write_report}{{4.1.1}{66}{src.xmlManager module}{section*.503}{}}
+\@writefile{toc}{\contentsline {subsubsection}{Module contents}{66}{subsubsection*.504}}
+\newlabel{commands/apidoc/src:module-src}{{4.1.1}{66}{Module contents}{subsubsection*.504}{}}
+\newlabel{commands/apidoc/src:module-contents}{{4.1.1}{66}{Module contents}{subsubsection*.504}{}}
+\newlabel{commands/apidoc/src:src.Path}{{4.1.1}{66}{Module contents}{section*.505}{}}
+\newlabel{commands/apidoc/src:src.Path.base}{{4.1.1}{66}{Module contents}{section*.506}{}}
+\newlabel{commands/apidoc/src:src.Path.chmod}{{4.1.1}{66}{Module contents}{section*.507}{}}
+\newlabel{commands/apidoc/src:src.Path.copy}{{4.1.1}{66}{Module contents}{section*.508}{}}
+\newlabel{commands/apidoc/src:src.Path.copydir}{{4.1.1}{66}{Module contents}{section*.509}{}}
+\newlabel{commands/apidoc/src:src.Path.copyfile}{{4.1.1}{66}{Module contents}{section*.510}{}}
+\newlabel{commands/apidoc/src:src.Path.copylink}{{4.1.1}{66}{Module contents}{section*.511}{}}
+\newlabel{commands/apidoc/src:src.Path.dir}{{4.1.1}{66}{Module contents}{section*.512}{}}
+\newlabel{commands/apidoc/src:src.Path.exists}{{4.1.1}{66}{Module contents}{section*.513}{}}
+\newlabel{commands/apidoc/src:src.Path.isdir}{{4.1.1}{66}{Module contents}{section*.514}{}}
+\newlabel{commands/apidoc/src:src.Path.isfile}{{4.1.1}{66}{Module contents}{section*.515}{}}
+\newlabel{commands/apidoc/src:src.Path.islink}{{4.1.1}{66}{Module contents}{section*.516}{}}
+\newlabel{commands/apidoc/src:src.Path.list}{{4.1.1}{66}{Module contents}{section*.517}{}}
+\newlabel{commands/apidoc/src:src.Path.make}{{4.1.1}{67}{Module contents}{section*.518}{}}
+\newlabel{commands/apidoc/src:src.Path.readlink}{{4.1.1}{67}{Module contents}{section*.519}{}}
+\newlabel{commands/apidoc/src:src.Path.rm}{{4.1.1}{67}{Module contents}{section*.520}{}}
+\newlabel{commands/apidoc/src:src.Path.smartcopy}{{4.1.1}{67}{Module contents}{section*.521}{}}
+\newlabel{commands/apidoc/src:src.Path.symlink}{{4.1.1}{67}{Module contents}{section*.522}{}}
+\newlabel{commands/apidoc/src:src.SatException}{{4.1.1}{67}{Module contents}{section*.523}{}}
+\newlabel{commands/apidoc/src:src.activate_mesa_property}{{4.1.1}{67}{Module contents}{section*.524}{}}
+\newlabel{commands/apidoc/src:src.check_config_has_application}{{4.1.1}{67}{Module contents}{section*.525}{}}
+\newlabel{commands/apidoc/src:src.check_config_has_profile}{{4.1.1}{67}{Module contents}{section*.526}{}}
+\newlabel{commands/apidoc/src:src.config_has_application}{{4.1.1}{67}{Module contents}{section*.527}{}}
+\newlabel{commands/apidoc/src:src.deepcopy_list}{{4.1.1}{67}{Module contents}{section*.528}{}}
+\newlabel{commands/apidoc/src:src.ensure_path_exists}{{4.1.1}{67}{Module contents}{section*.529}{}}
+\newlabel{commands/apidoc/src:src.find_file_in_lpath}{{4.1.1}{67}{Module contents}{section*.530}{}}
+\newlabel{commands/apidoc/src:src.get_base_path}{{4.1.1}{67}{Module contents}{section*.531}{}}
+\newlabel{commands/apidoc/src:src.get_cfg_param}{{4.1.1}{67}{Module contents}{section*.532}{}}
+\newlabel{commands/apidoc/src:src.get_launcher_name}{{4.1.1}{68}{Module contents}{section*.533}{}}
+\newlabel{commands/apidoc/src:src.get_log_path}{{4.1.1}{68}{Module contents}{section*.534}{}}
+\newlabel{commands/apidoc/src:src.get_property_in_product_cfg}{{4.1.1}{68}{Module contents}{section*.535}{}}
+\newlabel{commands/apidoc/src:src.get_salome_version}{{4.1.1}{68}{Module contents}{section*.536}{}}
+\newlabel{commands/apidoc/src:src.get_tmp_filename}{{4.1.1}{68}{Module contents}{section*.537}{}}
+\newlabel{commands/apidoc/src:src.handleRemoveReadonly}{{4.1.1}{68}{Module contents}{section*.538}{}}
+\newlabel{commands/apidoc/src:src.merge_dicts}{{4.1.1}{68}{Module contents}{section*.539}{}}
+\newlabel{commands/apidoc/src:src.only_numbers}{{4.1.1}{68}{Module contents}{section*.540}{}}
+\newlabel{commands/apidoc/src:src.parse_date}{{4.1.1}{68}{Module contents}{section*.541}{}}
+\newlabel{commands/apidoc/src:src.print_info}{{4.1.1}{68}{Module contents}{section*.542}{}}
+\newlabel{commands/apidoc/src:src.read_config_from_a_file}{{4.1.1}{68}{Module contents}{section*.543}{}}
+\newlabel{commands/apidoc/src:src.remove_item_from_list}{{4.1.1}{68}{Module contents}{section*.544}{}}
+\newlabel{commands/apidoc/src:src.replace_in_file}{{4.1.1}{69}{Module contents}{section*.545}{}}
+\@writefile{toc}{\contentsline {chapter}{\numberline {5}Release Notes}{71}{chapter.5}}
 \@writefile{lof}{\addvspace {10\p@ }}
 \@writefile{lot}{\addvspace {10\p@ }}
-\newlabel{index:release-notes}{{5}{69}{Release Notes}{chapter.5}{}}
-\@writefile{toc}{\contentsline {section}{\numberline {5.1}Release notes}{69}{section.5.1}}
-\newlabel{release_notes/release_notes_5.0.0:release-notes}{{5.1}{69}{Release notes}{section.5.1}{}}
-\newlabel{release_notes/release_notes_5.0.0::doc}{{5.1}{69}{Release notes}{section.5.1}{}}
-\@writefile{toc}{\contentsline {chapter}{Python Module Index}{71}{section*.538}}
-\@writefile{toc}{\contentsline {chapter}{Index}{73}{section*.539}}
+\newlabel{index:release-notes}{{5}{71}{Release Notes}{chapter.5}{}}
+\@writefile{toc}{\contentsline {section}{\numberline {5.1}Release notes}{71}{section.5.1}}
+\newlabel{release_notes/release_notes_5.0.0:release-notes}{{5.1}{71}{Release notes}{section.5.1}{}}
+\newlabel{release_notes/release_notes_5.0.0::doc}{{5.1}{71}{Release notes}{section.5.1}{}}
+\@writefile{toc}{\contentsline {chapter}{Python Module Index}{73}{section*.546}}
+\@writefile{toc}{\contentsline {chapter}{Index}{75}{section*.547}}
index 3bb1d94eeffa128c43a3027aef7aa1af6925142a..9b57d8f13b364b7611948eca4f5b16a5dbd7f599 100644 (file)
@@ -1,10 +1,10 @@
 # Fdb version 3
-["makeindex salomeTools.idx"] 1529399663 "salomeTools.idx" "salomeTools.ind" "salomeTools" 1529399664
-  "salomeTools.idx" 1529399664 37104 8cdae70614af35a45ec651ac7636acdf ""
+["makeindex salomeTools.idx"] 1530021069 "salomeTools.idx" "salomeTools.ind" "salomeTools" 1530021070
+  "salomeTools.idx" 1530021070 37675 5221875c9eca3cdb945ec6de9d886fdc ""
   (generated)
   "salomeTools.ind"
   "salomeTools.ilg"
-["pdflatex"] 1529399663 "salomeTools.tex" "salomeTools.pdf" "salomeTools" 1529399664
+["pdflatex"] 1530021069 "salomeTools.tex" "salomeTools.pdf" "salomeTools" 1530021070
   "/data/tmplgls/wambeke/share/texlive/2017/texmf-dist/fonts/enc/dvips/base/8r.enc" 1480098666 4850 80dc9bab7f31fb78a000ccfed0e27cab ""
   "/data/tmplgls/wambeke/share/texlive/2017/texmf-dist/fonts/map/fontname/texfonts.map" 1511824771 3332 103109f5612ad95229751940c61aada0 ""
   "/data/tmplgls/wambeke/share/texlive/2017/texmf-dist/fonts/tfm/adobe/courier/pcrb8c.tfm" 1480098688 1268 8067e4f35cbae42c0f58b48da75bf496 ""
   "/data/tmplgls/wambeke/share/texlive/2017/texmf-var/fonts/map/pdftex/updmap/pdftex.map" 1523607852 2700841 1bc9624fdc91e264bac08ef05942a34b ""
   "/data/tmplgls/wambeke/share/texlive/2017/texmf-var/web2c/pdftex/pdflatex.fmt" 1523607929 4139413 5fd665779d626eb6c28594ed7061af12 ""
   "/data/tmplgls/wambeke/share/texlive/2017/texmf.cnf" 1523607755 455 5b996dcaa0eb4ef14a83b026bc0a008c ""
-  "fncychap.sty" 1529391879 18775 568efa3fda85869a241e0645298bc277 ""
-  "footnotehyper-sphinx.sty" 1529391879 8886 0562fcad2b7e25f93331edc6fc422c87 ""
-  "salomeTools.aux" 1529399664 85410 654dbf7899c0e0925cdcb2a9b9cb605c ""
-  "salomeTools.ind" 1529399663 36333 3ec0eb65d8a4f28041fe8604ea800ae5 "makeindex salomeTools.idx"
-  "salomeTools.out" 1529399664 3075 c17a5699956f0a7fe0d4242598ffb5fe ""
-  "salomeTools.tex" 1529399660 340746 929605c29e2adbb99b99a777732584f9 ""
-  "salomeTools.toc" 1529399664 8577 0838da642cd6f892734f1aa0cf8141cf ""
-  "sat_about.png" 1529391879 282130 625d3edc0de2910af30fe6407ab411b3 ""
-  "sphinx.sty" 1529391879 67712 9b578972569f0169bf44cfae88da82f2 ""
-  "sphinxhighlight.sty" 1529399659 8137 b8d4ef963833564f6e4eadc09cd757c4 ""
-  "sphinxmanual.cls" 1529391879 3589 0b0aac49c6f36925cf5f9d524a75a978 ""
-  "sphinxmulticell.sty" 1529391879 14618 0defbdc8536ad2e67f1eac6a1431bc55 ""
-  "tabulary.sty" 1529391879 13836 e4c420176570c694fb8cb70f63c46263 ""
+  "fncychap.sty" 1529937511 18775 568efa3fda85869a241e0645298bc277 ""
+  "footnotehyper-sphinx.sty" 1529937511 8886 0562fcad2b7e25f93331edc6fc422c87 ""
+  "salomeTools.aux" 1530021070 86276 ad8da597b4c98b8cfcdec0fefe0dbb85 ""
+  "salomeTools.ind" 1530021069 36880 298d952e198cb50f81090b175ab81949 "makeindex salomeTools.idx"
+  "salomeTools.out" 1530021070 3075 101e36bbbdb8d120fe7a2c74ab3c41f0 ""
+  "salomeTools.tex" 1530021064 344056 ca20c8b326006818094828ef2c3c2107 ""
+  "salomeTools.toc" 1530021070 8577 93385a67d7c8426ac7be843767a0ae03 ""
+  "sat_about.png" 1529937511 282130 625d3edc0de2910af30fe6407ab411b3 ""
+  "sphinx.sty" 1529937511 67712 9b578972569f0169bf44cfae88da82f2 ""
+  "sphinxhighlight.sty" 1530021063 8137 b8d4ef963833564f6e4eadc09cd757c4 ""
+  "sphinxmanual.cls" 1529937511 3589 0b0aac49c6f36925cf5f9d524a75a978 ""
+  "sphinxmulticell.sty" 1529937511 14618 0defbdc8536ad2e67f1eac6a1431bc55 ""
+  "tabulary.sty" 1529937511 13836 e4c420176570c694fb8cb70f63c46263 ""
   (generated)
-  "salomeTools.aux"
   "salomeTools.out"
+  "salomeTools.aux"
   "salomeTools.idx"
   "salomeTools.log"
   "salomeTools.toc"
index 207d23c9b5692eefe60da5ddd78d780dadb798e0..c38e4e3ee038bead5d6f85eb1ed6d0d8ea4f40e7 100644 (file)
 \indexentry{put\_txt\_log\_in\_appli\_log\_dir() (src.compilation.Builder method)|hyperpage}{35}
 \indexentry{wmake() (src.compilation.Builder method)|hyperpage}{35}
 \indexentry{src.debug (module)|hyperpage}{35}
-\indexentry{InStream (class in src.debug)|hyperpage}{35}
-\indexentry{OutStream (class in src.debug)|hyperpage}{35}
-\indexentry{close() (src.debug.OutStream method)|hyperpage}{35}
-\indexentry{getLocalEnv() (in module src.debug)|hyperpage}{35}
-\indexentry{getStrConfigDbg() (in module src.debug)|hyperpage}{35}
+\indexentry{InStream (class in src.debug)|hyperpage}{36}
+\indexentry{OutStream (class in src.debug)|hyperpage}{36}
+\indexentry{close() (src.debug.OutStream method)|hyperpage}{36}
+\indexentry{format\_color\_exception() (in module src.debug)|hyperpage}{36}
+\indexentry{format\_exception() (in module src.debug)|hyperpage}{36}
+\indexentry{getLocalEnv() (in module src.debug)|hyperpage}{36}
+\indexentry{getStrConfigDbg() (in module src.debug)|hyperpage}{36}
 \indexentry{getStrConfigStd() (in module src.debug)|hyperpage}{36}
 \indexentry{indent() (in module src.debug)|hyperpage}{36}
+\indexentry{isTypeConfig() (in module src.debug)|hyperpage}{36}
 \indexentry{pop\_debug() (in module src.debug)|hyperpage}{36}
 \indexentry{push\_debug() (in module src.debug)|hyperpage}{36}
 \indexentry{saveConfigDbg() (in module src.debug)|hyperpage}{36}
 \indexentry{src.environment (module)|hyperpage}{36}
 \indexentry{Environ (class in src.environment)|hyperpage}{36}
 \indexentry{append() (src.environment.Environ method)|hyperpage}{36}
-\indexentry{append\_value() (src.environment.Environ method)|hyperpage}{36}
-\indexentry{command\_value() (src.environment.Environ method)|hyperpage}{36}
-\indexentry{get() (src.environment.Environ method)|hyperpage}{36}
-\indexentry{is\_defined() (src.environment.Environ method)|hyperpage}{36}
+\indexentry{append\_value() (src.environment.Environ method)|hyperpage}{37}
+\indexentry{command\_value() (src.environment.Environ method)|hyperpage}{37}
+\indexentry{get() (src.environment.Environ method)|hyperpage}{37}
+\indexentry{is\_defined() (src.environment.Environ method)|hyperpage}{37}
 \indexentry{prepend() (src.environment.Environ method)|hyperpage}{37}
 \indexentry{prepend\_value() (src.environment.Environ method)|hyperpage}{37}
 \indexentry{set() (src.environment.Environ method)|hyperpage}{37}
 \indexentry{FileEnvWriter (class in src.environment)|hyperpage}{37}
 \indexentry{write\_cfgForPy\_file() (src.environment.FileEnvWriter method)|hyperpage}{37}
-\indexentry{write\_env\_file() (src.environment.FileEnvWriter method)|hyperpage}{37}
-\indexentry{SalomeEnviron (class in src.environment)|hyperpage}{37}
-\indexentry{add\_comment() (src.environment.SalomeEnviron method)|hyperpage}{37}
+\indexentry{write\_env\_file() (src.environment.FileEnvWriter method)|hyperpage}{38}
+\indexentry{SalomeEnviron (class in src.environment)|hyperpage}{38}
+\indexentry{add\_comment() (src.environment.SalomeEnviron method)|hyperpage}{38}
 \indexentry{add\_line() (src.environment.SalomeEnviron method)|hyperpage}{38}
 \indexentry{add\_warning() (src.environment.SalomeEnviron method)|hyperpage}{38}
 \indexentry{append() (src.environment.SalomeEnviron method)|hyperpage}{38}
 \indexentry{get() (src.environment.SalomeEnviron method)|hyperpage}{38}
 \indexentry{get\_names() (src.environment.SalomeEnviron method)|hyperpage}{38}
 \indexentry{is\_defined() (src.environment.SalomeEnviron method)|hyperpage}{38}
-\indexentry{load\_cfg\_environment() (src.environment.SalomeEnviron method)|hyperpage}{38}
-\indexentry{prepend() (src.environment.SalomeEnviron method)|hyperpage}{38}
-\indexentry{run\_env\_script() (src.environment.SalomeEnviron method)|hyperpage}{38}
+\indexentry{load\_cfg\_environment() (src.environment.SalomeEnviron method)|hyperpage}{39}
+\indexentry{prepend() (src.environment.SalomeEnviron method)|hyperpage}{39}
+\indexentry{run\_env\_script() (src.environment.SalomeEnviron method)|hyperpage}{39}
 \indexentry{run\_simple\_env\_script() (src.environment.SalomeEnviron method)|hyperpage}{39}
 \indexentry{set() (src.environment.SalomeEnviron method)|hyperpage}{39}
 \indexentry{set\_a\_product() (src.environment.SalomeEnviron method)|hyperpage}{39}
 \indexentry{set\_application\_env() (src.environment.SalomeEnviron method)|hyperpage}{39}
 \indexentry{set\_cpp\_env() (src.environment.SalomeEnviron method)|hyperpage}{39}
 \indexentry{set\_full\_environ() (src.environment.SalomeEnviron method)|hyperpage}{39}
-\indexentry{set\_products() (src.environment.SalomeEnviron method)|hyperpage}{39}
-\indexentry{set\_python\_libdirs() (src.environment.SalomeEnviron method)|hyperpage}{39}
-\indexentry{set\_salome\_generic\_product\_env() (src.environment.SalomeEnviron method)|hyperpage}{39}
-\indexentry{set\_salome\_minimal\_product\_env() (src.environment.SalomeEnviron method)|hyperpage}{39}
+\indexentry{set\_products() (src.environment.SalomeEnviron method)|hyperpage}{40}
+\indexentry{set\_python\_libdirs() (src.environment.SalomeEnviron method)|hyperpage}{40}
+\indexentry{set\_salome\_generic\_product\_env() (src.environment.SalomeEnviron method)|hyperpage}{40}
+\indexentry{set\_salome\_minimal\_product\_env() (src.environment.SalomeEnviron method)|hyperpage}{40}
 \indexentry{Shell (class in src.environment)|hyperpage}{40}
 \indexentry{load\_environment() (in module src.environment)|hyperpage}{40}
 \indexentry{src.fileEnviron (module)|hyperpage}{40}
 \indexentry{command\_value() (src.fileEnviron.BashFileEnviron method)|hyperpage}{40}
 \indexentry{finish() (src.fileEnviron.BashFileEnviron method)|hyperpage}{40}
 \indexentry{set() (src.fileEnviron.BashFileEnviron method)|hyperpage}{40}
-\indexentry{BatFileEnviron (class in src.fileEnviron)|hyperpage}{40}
-\indexentry{add\_comment() (src.fileEnviron.BatFileEnviron method)|hyperpage}{40}
-\indexentry{command\_value() (src.fileEnviron.BatFileEnviron method)|hyperpage}{40}
-\indexentry{finish() (src.fileEnviron.BatFileEnviron method)|hyperpage}{40}
+\indexentry{BatFileEnviron (class in src.fileEnviron)|hyperpage}{41}
+\indexentry{add\_comment() (src.fileEnviron.BatFileEnviron method)|hyperpage}{41}
+\indexentry{command\_value() (src.fileEnviron.BatFileEnviron method)|hyperpage}{41}
+\indexentry{finish() (src.fileEnviron.BatFileEnviron method)|hyperpage}{41}
 \indexentry{get() (src.fileEnviron.BatFileEnviron method)|hyperpage}{41}
 \indexentry{set() (src.fileEnviron.BatFileEnviron method)|hyperpage}{41}
 \indexentry{ContextFileEnviron (class in src.fileEnviron)|hyperpage}{41}
 \indexentry{add\_warning() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{41}
 \indexentry{append\_value() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{41}
 \indexentry{command\_value() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{41}
-\indexentry{finish() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{41}
-\indexentry{get() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{41}
-\indexentry{prepend\_value() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{41}
-\indexentry{set() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{41}
+\indexentry{finish() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{42}
+\indexentry{get() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{42}
+\indexentry{prepend\_value() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{42}
+\indexentry{set() (src.fileEnviron.ContextFileEnviron method)|hyperpage}{42}
 \indexentry{FileEnviron (class in src.fileEnviron)|hyperpage}{42}
 \indexentry{add\_comment() (src.fileEnviron.FileEnviron method)|hyperpage}{42}
 \indexentry{add\_echo() (src.fileEnviron.FileEnviron method)|hyperpage}{42}
 \indexentry{add\_warning() (src.fileEnviron.FileEnviron method)|hyperpage}{42}
 \indexentry{append() (src.fileEnviron.FileEnviron method)|hyperpage}{42}
 \indexentry{append\_value() (src.fileEnviron.FileEnviron method)|hyperpage}{42}
-\indexentry{command\_value() (src.fileEnviron.FileEnviron method)|hyperpage}{42}
-\indexentry{finish() (src.fileEnviron.FileEnviron method)|hyperpage}{42}
-\indexentry{get() (src.fileEnviron.FileEnviron method)|hyperpage}{42}
+\indexentry{command\_value() (src.fileEnviron.FileEnviron method)|hyperpage}{43}
+\indexentry{finish() (src.fileEnviron.FileEnviron method)|hyperpage}{43}
+\indexentry{get() (src.fileEnviron.FileEnviron method)|hyperpage}{43}
 \indexentry{is\_defined() (src.fileEnviron.FileEnviron method)|hyperpage}{43}
 \indexentry{prepend() (src.fileEnviron.FileEnviron method)|hyperpage}{43}
 \indexentry{prepend\_value() (src.fileEnviron.FileEnviron method)|hyperpage}{43}
 \indexentry{set() (src.fileEnviron.FileEnviron method)|hyperpage}{43}
 \indexentry{LauncherFileEnviron (class in src.fileEnviron)|hyperpage}{43}
 \indexentry{add() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{43}
-\indexentry{add\_comment() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{43}
-\indexentry{add\_echo() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{43}
-\indexentry{add\_line() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{43}
-\indexentry{add\_warning() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{43}
-\indexentry{append() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{43}
+\indexentry{add\_comment() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
+\indexentry{add\_echo() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
+\indexentry{add\_line() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
+\indexentry{add\_warning() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
+\indexentry{append() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
 \indexentry{append\_value() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
 \indexentry{change\_to\_launcher() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
 \indexentry{command\_value() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
 \indexentry{get() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
 \indexentry{is\_defined() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
 \indexentry{prepend() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
-\indexentry{prepend\_value() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
-\indexentry{set() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{44}
-\indexentry{ScreenEnviron (class in src.fileEnviron)|hyperpage}{44}
+\indexentry{prepend\_value() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{45}
+\indexentry{set() (src.fileEnviron.LauncherFileEnviron method)|hyperpage}{45}
+\indexentry{ScreenEnviron (class in src.fileEnviron)|hyperpage}{45}
 \indexentry{add\_comment() (src.fileEnviron.ScreenEnviron method)|hyperpage}{45}
 \indexentry{add\_echo() (src.fileEnviron.ScreenEnviron method)|hyperpage}{45}
 \indexentry{add\_line() (src.fileEnviron.ScreenEnviron method)|hyperpage}{45}
 \indexentry{command\_value() (src.fileEnviron.ScreenEnviron method)|hyperpage}{45}
 \indexentry{get() (src.fileEnviron.ScreenEnviron method)|hyperpage}{45}
 \indexentry{is\_defined() (src.fileEnviron.ScreenEnviron method)|hyperpage}{45}
-\indexentry{prepend() (src.fileEnviron.ScreenEnviron method)|hyperpage}{45}
-\indexentry{run\_env\_script() (src.fileEnviron.ScreenEnviron method)|hyperpage}{45}
-\indexentry{set() (src.fileEnviron.ScreenEnviron method)|hyperpage}{45}
+\indexentry{prepend() (src.fileEnviron.ScreenEnviron method)|hyperpage}{46}
+\indexentry{run\_env\_script() (src.fileEnviron.ScreenEnviron method)|hyperpage}{46}
+\indexentry{set() (src.fileEnviron.ScreenEnviron method)|hyperpage}{46}
 \indexentry{write() (src.fileEnviron.ScreenEnviron method)|hyperpage}{46}
 \indexentry{get\_file\_environ() (in module src.fileEnviron)|hyperpage}{46}
 \indexentry{special\_path\_separator() (in module src.fileEnviron)|hyperpage}{46}
 \indexentry{launch\_command() (in module src.fork)|hyperpage}{46}
 \indexentry{show\_progress() (in module src.fork)|hyperpage}{46}
 \indexentry{write\_back() (in module src.fork)|hyperpage}{46}
-\indexentry{src.logger (module)|hyperpage}{46}
-\indexentry{Logger (class in src.logger)|hyperpage}{46}
-\indexentry{add\_link() (src.logger.Logger method)|hyperpage}{46}
+\indexentry{src.logger (module)|hyperpage}{47}
+\indexentry{Logger (class in src.logger)|hyperpage}{47}
+\indexentry{add\_link() (src.logger.Logger method)|hyperpage}{47}
 \indexentry{end\_write() (src.logger.Logger method)|hyperpage}{47}
 \indexentry{error() (src.logger.Logger method)|hyperpage}{47}
 \indexentry{flush() (src.logger.Logger method)|hyperpage}{47}
 \indexentry{put\_initial\_xml\_fields() (src.logger.Logger method)|hyperpage}{47}
 \indexentry{write() (src.logger.Logger method)|hyperpage}{47}
 \indexentry{date\_to\_datetime() (in module src.logger)|hyperpage}{47}
-\indexentry{list\_log\_file() (in module src.logger)|hyperpage}{47}
-\indexentry{show\_command\_log() (in module src.logger)|hyperpage}{47}
-\indexentry{timedelta\_total\_seconds() (in module src.logger)|hyperpage}{47}
+\indexentry{getCurrentLogger() (in module src.logger)|hyperpage}{47}
+\indexentry{getDefaultLogger() (in module src.logger)|hyperpage}{47}
+\indexentry{getUnittestLogger() (in module src.logger)|hyperpage}{47}
+\indexentry{isCurrentLoggerUnittest() (in module src.logger)|hyperpage}{48}
+\indexentry{list\_log\_file() (in module src.logger)|hyperpage}{48}
+\indexentry{sendMessageToCurrentLogger() (in module src.logger)|hyperpage}{48}
+\indexentry{setCurrentLogger() (in module src.logger)|hyperpage}{48}
+\indexentry{show\_command\_log() (in module src.logger)|hyperpage}{48}
+\indexentry{timedelta\_total\_seconds() (in module src.logger)|hyperpage}{48}
 \indexentry{update\_hat\_xml() (in module src.logger)|hyperpage}{48}
 \indexentry{src.options (module)|hyperpage}{48}
 \indexentry{OptResult (class in src.options)|hyperpage}{48}
-\indexentry{Options (class in src.options)|hyperpage}{48}
-\indexentry{add\_option() (src.options.Options method)|hyperpage}{48}
-\indexentry{debug\_write() (src.options.Options method)|hyperpage}{48}
-\indexentry{filterLevel() (src.options.Options method)|hyperpage}{48}
-\indexentry{filterList2() (src.options.Options method)|hyperpage}{48}
-\indexentry{getDetailOption() (src.options.Options method)|hyperpage}{48}
+\indexentry{Options (class in src.options)|hyperpage}{49}
+\indexentry{add\_option() (src.options.Options method)|hyperpage}{49}
+\indexentry{debug\_write() (src.options.Options method)|hyperpage}{49}
+\indexentry{filterLevel() (src.options.Options method)|hyperpage}{49}
+\indexentry{filterList2() (src.options.Options method)|hyperpage}{49}
+\indexentry{getDetailOption() (src.options.Options method)|hyperpage}{49}
 \indexentry{get\_help() (src.options.Options method)|hyperpage}{49}
 \indexentry{indent() (src.options.Options method)|hyperpage}{49}
 \indexentry{parse\_args() (src.options.Options method)|hyperpage}{49}
-\indexentry{print\_help() (src.options.Options method)|hyperpage}{49}
 \indexentry{src.printcolors (module)|hyperpage}{49}
 \indexentry{cleancolor() (in module src.printcolors)|hyperpage}{49}
 \indexentry{print\_color\_map() (in module src.printcolors)|hyperpage}{49}
-\indexentry{print\_color\_range() (in module src.printcolors)|hyperpage}{49}
-\indexentry{print\_value() (in module src.printcolors)|hyperpage}{49}
-\indexentry{printc() (in module src.printcolors)|hyperpage}{49}
+\indexentry{print\_color\_range() (in module src.printcolors)|hyperpage}{50}
+\indexentry{print\_value() (in module src.printcolors)|hyperpage}{50}
+\indexentry{printc() (in module src.printcolors)|hyperpage}{50}
 \indexentry{printcError() (in module src.printcolors)|hyperpage}{50}
 \indexentry{printcHeader() (in module src.printcolors)|hyperpage}{50}
 \indexentry{printcHighlight() (in module src.printcolors)|hyperpage}{50}
 \indexentry{printcInfo() (in module src.printcolors)|hyperpage}{50}
-\indexentry{printcLabel() (in module src.printcolors)|hyperpage}{50}
-\indexentry{printcSuccess() (in module src.printcolors)|hyperpage}{50}
-\indexentry{printcWarning() (in module src.printcolors)|hyperpage}{50}
-\indexentry{src.product (module)|hyperpage}{50}
-\indexentry{check\_config\_exists() (in module src.product)|hyperpage}{50}
+\indexentry{printcLabel() (in module src.printcolors)|hyperpage}{51}
+\indexentry{printcSuccess() (in module src.printcolors)|hyperpage}{51}
+\indexentry{printcWarning() (in module src.printcolors)|hyperpage}{51}
+\indexentry{src.product (module)|hyperpage}{51}
+\indexentry{check\_config\_exists() (in module src.product)|hyperpage}{51}
 \indexentry{check\_installation() (in module src.product)|hyperpage}{51}
 \indexentry{check\_source() (in module src.product)|hyperpage}{51}
 \indexentry{get\_base\_install\_dir() (in module src.product)|hyperpage}{51}
-\indexentry{get\_install\_dir() (in module src.product)|hyperpage}{51}
-\indexentry{get\_product\_components() (in module src.product)|hyperpage}{51}
+\indexentry{get\_install\_dir() (in module src.product)|hyperpage}{52}
+\indexentry{get\_product\_components() (in module src.product)|hyperpage}{52}
 \indexentry{get\_product\_config() (in module src.product)|hyperpage}{52}
 \indexentry{get\_product\_dependencies() (in module src.product)|hyperpage}{52}
 \indexentry{get\_product\_section() (in module src.product)|hyperpage}{52}
-\indexentry{get\_products\_infos() (in module src.product)|hyperpage}{52}
-\indexentry{product\_compiles() (in module src.product)|hyperpage}{52}
-\indexentry{product\_has\_env\_script() (in module src.product)|hyperpage}{52}
+\indexentry{get\_products\_infos() (in module src.product)|hyperpage}{53}
+\indexentry{product\_compiles() (in module src.product)|hyperpage}{53}
+\indexentry{product\_has\_env\_script() (in module src.product)|hyperpage}{53}
 \indexentry{product\_has\_logo() (in module src.product)|hyperpage}{53}
 \indexentry{product\_has\_patches() (in module src.product)|hyperpage}{53}
 \indexentry{product\_has\_salome\_gui() (in module src.product)|hyperpage}{53}
 \indexentry{product\_has\_script() (in module src.product)|hyperpage}{53}
 \indexentry{product\_is\_autotools() (in module src.product)|hyperpage}{53}
-\indexentry{product\_is\_cmake() (in module src.product)|hyperpage}{53}
-\indexentry{product\_is\_cpp() (in module src.product)|hyperpage}{53}
-\indexentry{product\_is\_debug() (in module src.product)|hyperpage}{53}
+\indexentry{product\_is\_cmake() (in module src.product)|hyperpage}{54}
+\indexentry{product\_is\_cpp() (in module src.product)|hyperpage}{54}
+\indexentry{product\_is\_debug() (in module src.product)|hyperpage}{54}
 \indexentry{product\_is\_dev() (in module src.product)|hyperpage}{54}
 \indexentry{product\_is\_fixed() (in module src.product)|hyperpage}{54}
 \indexentry{product\_is\_generated() (in module src.product)|hyperpage}{54}
 \indexentry{product\_is\_mpi() (in module src.product)|hyperpage}{54}
 \indexentry{product\_is\_native() (in module src.product)|hyperpage}{54}
-\indexentry{product\_is\_salome() (in module src.product)|hyperpage}{54}
-\indexentry{product\_is\_smesh\_plugin() (in module src.product)|hyperpage}{54}
-\indexentry{product\_is\_vcs() (in module src.product)|hyperpage}{54}
-\indexentry{product\_is\_verbose() (in module src.product)|hyperpage}{54}
+\indexentry{product\_is\_salome() (in module src.product)|hyperpage}{55}
+\indexentry{product\_is\_smesh\_plugin() (in module src.product)|hyperpage}{55}
+\indexentry{product\_is\_vcs() (in module src.product)|hyperpage}{55}
+\indexentry{product\_is\_verbose() (in module src.product)|hyperpage}{55}
 \indexentry{src.pyconf (module)|hyperpage}{55}
 \indexentry{Config (class in src.pyconf)|hyperpage}{56}
 \indexentry{Config.Namespace (class in src.pyconf)|hyperpage}{56}
 \indexentry{addNamespace() (src.pyconf.Config method)|hyperpage}{56}
 \indexentry{getByPath() (src.pyconf.Config method)|hyperpage}{56}
 \indexentry{load() (src.pyconf.Config method)|hyperpage}{56}
-\indexentry{removeNamespace() (src.pyconf.Config method)|hyperpage}{56}
-\indexentry{ConfigError|hyperpage}{56}
-\indexentry{ConfigFormatError|hyperpage}{56}
-\indexentry{ConfigInputStream (class in src.pyconf)|hyperpage}{56}
-\indexentry{close() (src.pyconf.ConfigInputStream method)|hyperpage}{56}
-\indexentry{read() (src.pyconf.ConfigInputStream method)|hyperpage}{56}
-\indexentry{readline() (src.pyconf.ConfigInputStream method)|hyperpage}{56}
-\indexentry{ConfigList (class in src.pyconf)|hyperpage}{56}
-\indexentry{getByPath() (src.pyconf.ConfigList method)|hyperpage}{56}
+\indexentry{removeNamespace() (src.pyconf.Config method)|hyperpage}{57}
+\indexentry{ConfigError|hyperpage}{57}
+\indexentry{ConfigFormatError|hyperpage}{57}
+\indexentry{ConfigInputStream (class in src.pyconf)|hyperpage}{57}
+\indexentry{close() (src.pyconf.ConfigInputStream method)|hyperpage}{57}
+\indexentry{read() (src.pyconf.ConfigInputStream method)|hyperpage}{57}
+\indexentry{readline() (src.pyconf.ConfigInputStream method)|hyperpage}{57}
+\indexentry{ConfigList (class in src.pyconf)|hyperpage}{57}
+\indexentry{getByPath() (src.pyconf.ConfigList method)|hyperpage}{57}
 \indexentry{ConfigMerger (class in src.pyconf)|hyperpage}{57}
 \indexentry{handleMismatch() (src.pyconf.ConfigMerger method)|hyperpage}{57}
 \indexentry{merge() (src.pyconf.ConfigMerger method)|hyperpage}{57}
 \indexentry{mergeMapping() (src.pyconf.ConfigMerger method)|hyperpage}{57}
-\indexentry{mergeSequence() (src.pyconf.ConfigMerger method)|hyperpage}{57}
-\indexentry{overwriteKeys() (src.pyconf.ConfigMerger method)|hyperpage}{57}
-\indexentry{ConfigOutputStream (class in src.pyconf)|hyperpage}{57}
-\indexentry{close() (src.pyconf.ConfigOutputStream method)|hyperpage}{57}
-\indexentry{flush() (src.pyconf.ConfigOutputStream method)|hyperpage}{57}
-\indexentry{write() (src.pyconf.ConfigOutputStream method)|hyperpage}{57}
-\indexentry{ConfigReader (class in src.pyconf)|hyperpage}{57}
-\indexentry{getChar() (src.pyconf.ConfigReader method)|hyperpage}{57}
-\indexentry{getToken() (src.pyconf.ConfigReader method)|hyperpage}{57}
+\indexentry{mergeSequence() (src.pyconf.ConfigMerger method)|hyperpage}{58}
+\indexentry{overwriteKeys() (src.pyconf.ConfigMerger method)|hyperpage}{58}
+\indexentry{ConfigOutputStream (class in src.pyconf)|hyperpage}{58}
+\indexentry{close() (src.pyconf.ConfigOutputStream method)|hyperpage}{58}
+\indexentry{flush() (src.pyconf.ConfigOutputStream method)|hyperpage}{58}
+\indexentry{write() (src.pyconf.ConfigOutputStream method)|hyperpage}{58}
+\indexentry{ConfigReader (class in src.pyconf)|hyperpage}{58}
+\indexentry{getChar() (src.pyconf.ConfigReader method)|hyperpage}{58}
+\indexentry{getToken() (src.pyconf.ConfigReader method)|hyperpage}{58}
 \indexentry{load() (src.pyconf.ConfigReader method)|hyperpage}{58}
 \indexentry{location() (src.pyconf.ConfigReader method)|hyperpage}{58}
 \indexentry{match() (src.pyconf.ConfigReader method)|hyperpage}{58}
 \indexentry{parseFactor() (src.pyconf.ConfigReader method)|hyperpage}{58}
-\indexentry{parseKeyValuePair() (src.pyconf.ConfigReader method)|hyperpage}{58}
-\indexentry{parseMapping() (src.pyconf.ConfigReader method)|hyperpage}{58}
-\indexentry{parseMappingBody() (src.pyconf.ConfigReader method)|hyperpage}{58}
-\indexentry{parseReference() (src.pyconf.ConfigReader method)|hyperpage}{58}
-\indexentry{parseScalar() (src.pyconf.ConfigReader method)|hyperpage}{58}
-\indexentry{parseSequence() (src.pyconf.ConfigReader method)|hyperpage}{58}
+\indexentry{parseKeyValuePair() (src.pyconf.ConfigReader method)|hyperpage}{59}
+\indexentry{parseMapping() (src.pyconf.ConfigReader method)|hyperpage}{59}
+\indexentry{parseMappingBody() (src.pyconf.ConfigReader method)|hyperpage}{59}
+\indexentry{parseReference() (src.pyconf.ConfigReader method)|hyperpage}{59}
+\indexentry{parseScalar() (src.pyconf.ConfigReader method)|hyperpage}{59}
+\indexentry{parseSequence() (src.pyconf.ConfigReader method)|hyperpage}{59}
 \indexentry{parseSuffix() (src.pyconf.ConfigReader method)|hyperpage}{59}
 \indexentry{parseTerm() (src.pyconf.ConfigReader method)|hyperpage}{59}
 \indexentry{parseValue() (src.pyconf.ConfigReader method)|hyperpage}{59}
 \indexentry{setStream() (src.pyconf.ConfigReader method)|hyperpage}{59}
 \indexentry{ConfigResolutionError|hyperpage}{59}
 \indexentry{Container (class in src.pyconf)|hyperpage}{59}
-\indexentry{evaluate() (src.pyconf.Container method)|hyperpage}{59}
-\indexentry{setPath() (src.pyconf.Container method)|hyperpage}{59}
-\indexentry{writeToStream() (src.pyconf.Container method)|hyperpage}{59}
-\indexentry{writeValue() (src.pyconf.Container method)|hyperpage}{59}
-\indexentry{Expression (class in src.pyconf)|hyperpage}{59}
+\indexentry{evaluate() (src.pyconf.Container method)|hyperpage}{60}
+\indexentry{setPath() (src.pyconf.Container method)|hyperpage}{60}
+\indexentry{writeToStream() (src.pyconf.Container method)|hyperpage}{60}
+\indexentry{writeValue() (src.pyconf.Container method)|hyperpage}{60}
+\indexentry{Expression (class in src.pyconf)|hyperpage}{60}
 \indexentry{evaluate() (src.pyconf.Expression method)|hyperpage}{60}
 \indexentry{Mapping (class in src.pyconf)|hyperpage}{60}
 \indexentry{addMapping() (src.pyconf.Mapping method)|hyperpage}{60}
 \indexentry{iteritems() (src.pyconf.Mapping method)|hyperpage}{60}
 \indexentry{iterkeys() (src.pyconf.Mapping method)|hyperpage}{60}
 \indexentry{keys() (src.pyconf.Mapping method)|hyperpage}{60}
-\indexentry{writeToStream() (src.pyconf.Mapping method)|hyperpage}{60}
-\indexentry{Reference (class in src.pyconf)|hyperpage}{60}
-\indexentry{addElement() (src.pyconf.Reference method)|hyperpage}{60}
-\indexentry{findConfig() (src.pyconf.Reference method)|hyperpage}{60}
-\indexentry{resolve() (src.pyconf.Reference method)|hyperpage}{60}
-\indexentry{Sequence (class in src.pyconf)|hyperpage}{60}
+\indexentry{writeToStream() (src.pyconf.Mapping method)|hyperpage}{61}
+\indexentry{Reference (class in src.pyconf)|hyperpage}{61}
+\indexentry{addElement() (src.pyconf.Reference method)|hyperpage}{61}
+\indexentry{findConfig() (src.pyconf.Reference method)|hyperpage}{61}
+\indexentry{resolve() (src.pyconf.Reference method)|hyperpage}{61}
+\indexentry{Sequence (class in src.pyconf)|hyperpage}{61}
 \indexentry{Sequence.SeqIter (class in src.pyconf)|hyperpage}{61}
 \indexentry{next() (src.pyconf.Sequence.SeqIter method)|hyperpage}{61}
 \indexentry{append() (src.pyconf.Sequence method)|hyperpage}{61}
 \indexentry{writeToStream() (src.pyconf.Sequence method)|hyperpage}{61}
 \indexentry{deepCopyMapping() (in module src.pyconf)|hyperpage}{61}
 \indexentry{defaultMergeResolve() (in module src.pyconf)|hyperpage}{61}
-\indexentry{defaultStreamOpener() (in module src.pyconf)|hyperpage}{61}
-\indexentry{isWord() (in module src.pyconf)|hyperpage}{61}
-\indexentry{makePath() (in module src.pyconf)|hyperpage}{61}
+\indexentry{defaultStreamOpener() (in module src.pyconf)|hyperpage}{62}
+\indexentry{isWord() (in module src.pyconf)|hyperpage}{62}
+\indexentry{makePath() (in module src.pyconf)|hyperpage}{62}
 \indexentry{overwriteMergeResolve() (in module src.pyconf)|hyperpage}{62}
 \indexentry{src.system (module)|hyperpage}{62}
 \indexentry{archive\_extract() (in module src.system)|hyperpage}{62}
 \indexentry{cvs\_extract() (in module src.system)|hyperpage}{62}
-\indexentry{git\_extract() (in module src.system)|hyperpage}{62}
+\indexentry{git\_extract() (in module src.system)|hyperpage}{63}
 \indexentry{show\_in\_editor() (in module src.system)|hyperpage}{63}
 \indexentry{svn\_extract() (in module src.system)|hyperpage}{63}
-\indexentry{src.template (module)|hyperpage}{63}
-\indexentry{MyTemplate (class in src.template)|hyperpage}{63}
-\indexentry{delimiter (src.template.MyTemplate attribute)|hyperpage}{63}
-\indexentry{pattern (src.template.MyTemplate attribute)|hyperpage}{63}
-\indexentry{substitute() (in module src.template)|hyperpage}{63}
-\indexentry{src.test\_module (module)|hyperpage}{63}
-\indexentry{Test (class in src.test\_module)|hyperpage}{63}
-\indexentry{generate\_launching\_commands() (src.test\_module.Test method)|hyperpage}{63}
-\indexentry{generate\_script() (src.test\_module.Test method)|hyperpage}{63}
-\indexentry{get\_test\_timeout() (src.test\_module.Test method)|hyperpage}{63}
-\indexentry{get\_tmp\_dir() (src.test\_module.Test method)|hyperpage}{63}
-\indexentry{prepare\_testbase() (src.test\_module.Test method)|hyperpage}{63}
+\indexentry{src.template (module)|hyperpage}{64}
+\indexentry{MyTemplate (class in src.template)|hyperpage}{64}
+\indexentry{delimiter (src.template.MyTemplate attribute)|hyperpage}{64}
+\indexentry{pattern (src.template.MyTemplate attribute)|hyperpage}{64}
+\indexentry{substitute() (in module src.template)|hyperpage}{64}
+\indexentry{src.test\_module (module)|hyperpage}{64}
+\indexentry{Test (class in src.test\_module)|hyperpage}{64}
+\indexentry{generate\_launching\_commands() (src.test\_module.Test method)|hyperpage}{64}
+\indexentry{generate\_script() (src.test\_module.Test method)|hyperpage}{64}
+\indexentry{get\_test\_timeout() (src.test\_module.Test method)|hyperpage}{64}
+\indexentry{get\_tmp\_dir() (src.test\_module.Test method)|hyperpage}{64}
+\indexentry{prepare\_testbase() (src.test\_module.Test method)|hyperpage}{64}
 \indexentry{prepare\_testbase\_from\_dir() (src.test\_module.Test method)|hyperpage}{64}
 \indexentry{prepare\_testbase\_from\_git() (src.test\_module.Test method)|hyperpage}{64}
 \indexentry{prepare\_testbase\_from\_svn() (src.test\_module.Test method)|hyperpage}{64}
 \indexentry{src.xmlManager (module)|hyperpage}{64}
 \indexentry{ReadXmlFile (class in src.xmlManager)|hyperpage}{64}
 \indexentry{getRootAttrib() (src.xmlManager.ReadXmlFile method)|hyperpage}{64}
-\indexentry{get\_attrib() (src.xmlManager.ReadXmlFile method)|hyperpage}{64}
-\indexentry{get\_node\_text() (src.xmlManager.ReadXmlFile method)|hyperpage}{64}
-\indexentry{XmlLogFile (class in src.xmlManager)|hyperpage}{64}
-\indexentry{add\_simple\_node() (src.xmlManager.XmlLogFile method)|hyperpage}{64}
+\indexentry{get\_attrib() (src.xmlManager.ReadXmlFile method)|hyperpage}{65}
+\indexentry{get\_node\_text() (src.xmlManager.ReadXmlFile method)|hyperpage}{65}
+\indexentry{XmlLogFile (class in src.xmlManager)|hyperpage}{65}
+\indexentry{add\_simple\_node() (src.xmlManager.XmlLogFile method)|hyperpage}{65}
 \indexentry{append\_node\_attrib() (src.xmlManager.XmlLogFile method)|hyperpage}{65}
 \indexentry{append\_node\_text() (src.xmlManager.XmlLogFile method)|hyperpage}{65}
 \indexentry{write\_tree() (src.xmlManager.XmlLogFile method)|hyperpage}{65}
 \indexentry{add\_simple\_node() (in module src.xmlManager)|hyperpage}{65}
-\indexentry{append\_node\_attrib() (in module src.xmlManager)|hyperpage}{65}
-\indexentry{find\_node\_by\_attrib() (in module src.xmlManager)|hyperpage}{65}
-\indexentry{write\_report() (in module src.xmlManager)|hyperpage}{65}
+\indexentry{append\_node\_attrib() (in module src.xmlManager)|hyperpage}{66}
+\indexentry{find\_node\_by\_attrib() (in module src.xmlManager)|hyperpage}{66}
+\indexentry{write\_report() (in module src.xmlManager)|hyperpage}{66}
 \indexentry{src (module)|hyperpage}{66}
 \indexentry{Path (class in src)|hyperpage}{66}
 \indexentry{base() (src.Path method)|hyperpage}{66}
 \indexentry{isfile() (src.Path method)|hyperpage}{66}
 \indexentry{islink() (src.Path method)|hyperpage}{66}
 \indexentry{list() (src.Path method)|hyperpage}{66}
-\indexentry{make() (src.Path method)|hyperpage}{66}
-\indexentry{readlink() (src.Path method)|hyperpage}{66}
-\indexentry{rm() (src.Path method)|hyperpage}{66}
-\indexentry{smartcopy() (src.Path method)|hyperpage}{66}
-\indexentry{symlink() (src.Path method)|hyperpage}{66}
-\indexentry{SatException|hyperpage}{66}
-\indexentry{activate\_mesa\_property() (in module src)|hyperpage}{66}
-\indexentry{check\_config\_has\_application() (in module src)|hyperpage}{66}
-\indexentry{check\_config\_has\_profile() (in module src)|hyperpage}{66}
-\indexentry{config\_has\_application() (in module src)|hyperpage}{66}
-\indexentry{deepcopy\_list() (in module src)|hyperpage}{66}
+\indexentry{make() (src.Path method)|hyperpage}{67}
+\indexentry{readlink() (src.Path method)|hyperpage}{67}
+\indexentry{rm() (src.Path method)|hyperpage}{67}
+\indexentry{smartcopy() (src.Path method)|hyperpage}{67}
+\indexentry{symlink() (src.Path method)|hyperpage}{67}
+\indexentry{SatException|hyperpage}{67}
+\indexentry{activate\_mesa\_property() (in module src)|hyperpage}{67}
+\indexentry{check\_config\_has\_application() (in module src)|hyperpage}{67}
+\indexentry{check\_config\_has\_profile() (in module src)|hyperpage}{67}
+\indexentry{config\_has\_application() (in module src)|hyperpage}{67}
+\indexentry{deepcopy\_list() (in module src)|hyperpage}{67}
 \indexentry{ensure\_path\_exists() (in module src)|hyperpage}{67}
 \indexentry{find\_file\_in\_lpath() (in module src)|hyperpage}{67}
 \indexentry{get\_base\_path() (in module src)|hyperpage}{67}
 \indexentry{get\_cfg\_param() (in module src)|hyperpage}{67}
-\indexentry{get\_launcher\_name() (in module src)|hyperpage}{67}
-\indexentry{get\_log\_path() (in module src)|hyperpage}{67}
-\indexentry{get\_property\_in\_product\_cfg() (in module src)|hyperpage}{67}
-\indexentry{get\_salome\_version() (in module src)|hyperpage}{67}
-\indexentry{get\_tmp\_filename() (in module src)|hyperpage}{67}
+\indexentry{get\_launcher\_name() (in module src)|hyperpage}{68}
+\indexentry{get\_log\_path() (in module src)|hyperpage}{68}
+\indexentry{get\_property\_in\_product\_cfg() (in module src)|hyperpage}{68}
+\indexentry{get\_salome\_version() (in module src)|hyperpage}{68}
+\indexentry{get\_tmp\_filename() (in module src)|hyperpage}{68}
 \indexentry{handleRemoveReadonly() (in module src)|hyperpage}{68}
 \indexentry{merge\_dicts() (in module src)|hyperpage}{68}
 \indexentry{only\_numbers() (in module src)|hyperpage}{68}
 \indexentry{print\_info() (in module src)|hyperpage}{68}
 \indexentry{read\_config\_from\_a\_file() (in module src)|hyperpage}{68}
 \indexentry{remove\_item\_from\_list() (in module src)|hyperpage}{68}
-\indexentry{replace\_in\_file() (in module src)|hyperpage}{68}
+\indexentry{replace\_in\_file() (in module src)|hyperpage}{69}
index 1626783581f6c6b3b20533609fa9d6ba8647fb28..57547af8b4f25cb21738176912721f6ea5348f40 100644 (file)
@@ -1,7 +1,7 @@
 This is makeindex, version 2.15 [TeX Live 2017] (kpathsea + Thai support).
 Scanning style file ./python.ist.......done (7 attributes redefined, 0 ignored).
-Scanning input file salomeTools.idx....done (518 entries accepted, 0 rejected).
-Sorting entries.......done (4982 comparisons).
-Generating output file salomeTools.ind....done (590 lines written, 0 warnings).
+Scanning input file salomeTools.idx....done (526 entries accepted, 0 rejected).
+Sorting entries.......done (5034 comparisons).
+Generating output file salomeTools.ind....done (598 lines written, 0 warnings).
 Output written in salomeTools.ind.
 Transcript written in salomeTools.ilg.
index 80c312a13f970c65f26a871af444583d67b13006..6e9fdd90bc127e4fd5f6fc02db0839b21bfa7fb5 100644 (file)
@@ -2,31 +2,31 @@
 \def\bigletter#1{{\Large\sffamily#1}\nopagebreak\vspace{1mm}}
 
   \bigletter A
-  \item activate\_mesa\_property() (in module src), \hyperpage{66}
+  \item activate\_mesa\_property() (in module src), \hyperpage{67}
   \item add() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{43}
-  \item add\_comment() (src.environment.SalomeEnviron method), \hyperpage{37}
-  \item add\_comment() (src.fileEnviron.BatFileEnviron method), \hyperpage{40}
+  \item add\_comment() (src.environment.SalomeEnviron method), \hyperpage{38}
+  \item add\_comment() (src.fileEnviron.BatFileEnviron method), \hyperpage{41}
   \item add\_comment() (src.fileEnviron.FileEnviron method), \hyperpage{42}
-  \item add\_comment() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{43}
+  \item add\_comment() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item add\_comment() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
   \item add\_echo() (src.fileEnviron.ContextFileEnviron method), \hyperpage{41}
   \item add\_echo() (src.fileEnviron.FileEnviron method), \hyperpage{42}
-  \item add\_echo() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{43}
+  \item add\_echo() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item add\_echo() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
   \item add\_line() (src.environment.SalomeEnviron method), \hyperpage{38}
   \item add\_line() (src.fileEnviron.FileEnviron method), \hyperpage{42}
-  \item add\_line() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{43}
+  \item add\_line() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item add\_line() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
-  \item add\_link() (src.logger.Logger method), \hyperpage{46}
-  \item add\_option() (src.options.Options method), \hyperpage{48}
+  \item add\_link() (src.logger.Logger method), \hyperpage{47}
+  \item add\_option() (src.options.Options method), \hyperpage{49}
   \item add\_simple\_node() (in module src.xmlManager), \hyperpage{65}
-  \item add\_simple\_node() (src.xmlManager.XmlLogFile method), \hyperpage{64}
+  \item add\_simple\_node() (src.xmlManager.XmlLogFile method), \hyperpage{65}
   \item add\_warning() (src.environment.SalomeEnviron method), \hyperpage{38}
   \item add\_warning() (src.fileEnviron.ContextFileEnviron method), \hyperpage{41}
   \item add\_warning() (src.fileEnviron.FileEnviron method), \hyperpage{42}
-  \item add\_warning() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{43}
+  \item add\_warning() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item add\_warning() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
-  \item addElement() (src.pyconf.Reference method), \hyperpage{60}
+  \item addElement() (src.pyconf.Reference method), \hyperpage{61}
   \item addMapping() (src.pyconf.Mapping method), \hyperpage{60}
   \item addNamespace() (src.pyconf.Config method), \hyperpage{56}
   \item ANSI\_CSI\_RE (src.colorama.ansitowin32.AnsiToWin32 attribute), \hyperpage{31}
   \item append() (src.environment.Environ method), \hyperpage{36}
   \item append() (src.environment.SalomeEnviron method), \hyperpage{38}
   \item append() (src.fileEnviron.FileEnviron method), \hyperpage{42}
-  \item append() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{43}
+  \item append() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item append() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
   \item append() (src.pyconf.Sequence method), \hyperpage{61}
-  \item append\_node\_attrib() (in module src.xmlManager), \hyperpage{65}
+  \item append\_node\_attrib() (in module src.xmlManager), \hyperpage{66}
   \item append\_node\_attrib() (src.xmlManager.XmlLogFile method), \hyperpage{65}
   \item append\_node\_text() (src.xmlManager.XmlLogFile method), \hyperpage{65}
-  \item append\_value() (src.environment.Environ method), \hyperpage{36}
+  \item append\_value() (src.environment.Environ method), \hyperpage{37}
   \item append\_value() (src.fileEnviron.ContextFileEnviron method), \hyperpage{41}
   \item append\_value() (src.fileEnviron.FileEnviron method), \hyperpage{42}
   \item append\_value() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
@@ -60,7 +60,7 @@
   \item BashFileEnviron (class in src.fileEnviron), \hyperpage{40}
   \item batch() (in module src.fork), \hyperpage{46}
   \item batch\_salome() (in module src.fork), \hyperpage{46}
-  \item BatFileEnviron (class in src.fileEnviron), \hyperpage{40}
+  \item BatFileEnviron (class in src.fileEnviron), \hyperpage{41}
   \item BLACK (src.colorama.ansi.AnsiBack attribute), \hyperpage{29}
   \item BLACK (src.colorama.ansi.AnsiFore attribute), \hyperpage{30}
   \item BLACK (src.colorama.winterm.WinColor attribute), \hyperpage{32}
   \item call\_win32() (src.colorama.ansitowin32.AnsiToWin32 method), \hyperpage{31}
   \item change\_to\_launcher() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item check() (src.compilation.Builder method), \hyperpage{34}
-  \item check\_config\_exists() (in module src.product), \hyperpage{50}
-  \item check\_config\_has\_application() (in module src), \hyperpage{66}
-  \item check\_config\_has\_profile() (in module src), \hyperpage{66}
+  \item check\_config\_exists() (in module src.product), \hyperpage{51}
+  \item check\_config\_has\_application() (in module src), \hyperpage{67}
+  \item check\_config\_has\_profile() (in module src), \hyperpage{67}
   \item check\_installation() (in module src.product), \hyperpage{51}
   \item check\_source() (in module src.product), \hyperpage{51}
   \item chmod() (src.Path method), \hyperpage{66}
   \item cleancolor() (in module src.printcolors), \hyperpage{49}
   \item clear\_line() (in module src.colorama.ansi), \hyperpage{30}
   \item clear\_screen() (in module src.colorama.ansi), \hyperpage{30}
-  \item close() (src.debug.OutStream method), \hyperpage{35}
+  \item close() (src.debug.OutStream method), \hyperpage{36}
   \item close() (src.ElementTree.TreeBuilder method), \hyperpage{33}
   \item close() (src.ElementTree.XMLTreeBuilder method), \hyperpage{33}
-  \item close() (src.pyconf.ConfigInputStream method), \hyperpage{56}
-  \item close() (src.pyconf.ConfigOutputStream method), \hyperpage{57}
+  \item close() (src.pyconf.ConfigInputStream method), \hyperpage{57}
+  \item close() (src.pyconf.ConfigOutputStream method), \hyperpage{58}
   \item cmake() (src.compilation.Builder method), \hyperpage{34}
   \item code\_to\_chars() (in module src.colorama.ansi), \hyperpage{30}
   \item colorama\_text() (in module src.colorama.initialise), \hyperpage{31}
-  \item command\_value() (src.environment.Environ method), \hyperpage{36}
+  \item command\_value() (src.environment.Environ method), \hyperpage{37}
   \item command\_value() (src.fileEnviron.BashFileEnviron method), \hyperpage{40}
-  \item command\_value() (src.fileEnviron.BatFileEnviron method), \hyperpage{40}
+  \item command\_value() (src.fileEnviron.BatFileEnviron method), \hyperpage{41}
   \item command\_value() (src.fileEnviron.ContextFileEnviron method), \hyperpage{41}
-  \item command\_value() (src.fileEnviron.FileEnviron method), \hyperpage{42}
+  \item command\_value() (src.fileEnviron.FileEnviron method), \hyperpage{43}
   \item command\_value() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item command\_value() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
   \item Comment() (in module src.ElementTree), \hyperpage{33}
   \item complete\_environment() (src.compilation.Builder method), \hyperpage{34}
   \item Config (class in src.pyconf), \hyperpage{56}
   \item Config.Namespace (class in src.pyconf), \hyperpage{56}
-  \item config\_has\_application() (in module src), \hyperpage{66}
-  \item ConfigError, \hyperpage{56}
-  \item ConfigFormatError, \hyperpage{56}
-  \item ConfigInputStream (class in src.pyconf), \hyperpage{56}
-  \item ConfigList (class in src.pyconf), \hyperpage{56}
+  \item config\_has\_application() (in module src), \hyperpage{67}
+  \item ConfigError, \hyperpage{57}
+  \item ConfigFormatError, \hyperpage{57}
+  \item ConfigInputStream (class in src.pyconf), \hyperpage{57}
+  \item ConfigList (class in src.pyconf), \hyperpage{57}
   \item ConfigMerger (class in src.pyconf), \hyperpage{57}
-  \item ConfigOutputStream (class in src.pyconf), \hyperpage{57}
-  \item ConfigReader (class in src.pyconf), \hyperpage{57}
+  \item ConfigOutputStream (class in src.pyconf), \hyperpage{58}
+  \item ConfigReader (class in src.pyconf), \hyperpage{58}
   \item ConfigResolutionError, \hyperpage{59}
   \item configure() (src.compilation.Builder method), \hyperpage{34}
   \item Container (class in src.pyconf), \hyperpage{59}
   \bigletter D
   \item data() (src.ElementTree.TreeBuilder method), \hyperpage{33}
   \item date\_to\_datetime() (in module src.logger), \hyperpage{47}
-  \item debug\_write() (src.options.Options method), \hyperpage{48}
-  \item deepcopy\_list() (in module src), \hyperpage{66}
+  \item debug\_write() (src.options.Options method), \hyperpage{49}
+  \item deepcopy\_list() (in module src), \hyperpage{67}
   \item deepCopyMapping() (in module src.pyconf), \hyperpage{61}
   \item defaultMergeResolve() (in module src.pyconf), \hyperpage{61}
-  \item defaultStreamOpener() (in module src.pyconf), \hyperpage{61}
+  \item defaultStreamOpener() (in module src.pyconf), \hyperpage{62}
   \item deinit() (in module src.colorama.initialise), \hyperpage{31}
-  \item delimiter (src.template.MyTemplate attribute), \hyperpage{63}
+  \item delimiter (src.template.MyTemplate attribute), \hyperpage{64}
   \item DIM (src.colorama.ansi.AnsiStyle attribute), \hyperpage{30}
   \item dir() (src.Path method), \hyperpage{66}
   \item do\_batch\_script\_build() (src.compilation.Builder method), \hyperpage{34}
   \item erase\_line() (src.colorama.winterm.WinTerm method), \hyperpage{32}
   \item erase\_screen() (src.colorama.winterm.WinTerm method), \hyperpage{32}
   \item error() (src.logger.Logger method), \hyperpage{47}
-  \item evaluate() (src.pyconf.Container method), \hyperpage{59}
+  \item evaluate() (src.pyconf.Container method), \hyperpage{60}
   \item evaluate() (src.pyconf.Expression method), \hyperpage{60}
   \item exists() (src.Path method), \hyperpage{66}
-  \item Expression (class in src.pyconf), \hyperpage{59}
+  \item Expression (class in src.pyconf), \hyperpage{60}
   \item extract\_params() (src.colorama.ansitowin32.AnsiToWin32 method), \hyperpage{31}
 
   \indexspace
   \item feed() (src.ElementTree.XMLTreeBuilder method), \hyperpage{33}
   \item FileEnviron (class in src.fileEnviron), \hyperpage{42}
   \item FileEnvWriter (class in src.environment), \hyperpage{37}
-  \item filterLevel() (src.options.Options method), \hyperpage{48}
-  \item filterList2() (src.options.Options method), \hyperpage{48}
+  \item filterLevel() (src.options.Options method), \hyperpage{49}
+  \item filterList2() (src.options.Options method), \hyperpage{49}
   \item find() (src.ElementTree.ElementTree method), \hyperpage{33}
   \item find\_file\_in\_lpath() (in module src), \hyperpage{67}
-  \item find\_node\_by\_attrib() (in module src.xmlManager), \hyperpage{65}
+  \item find\_node\_by\_attrib() (in module src.xmlManager), \hyperpage{66}
   \item findall() (src.ElementTree.ElementTree method), \hyperpage{33}
-  \item findConfig() (src.pyconf.Reference method), \hyperpage{60}
+  \item findConfig() (src.pyconf.Reference method), \hyperpage{61}
   \item findtext() (src.ElementTree.ElementTree method), \hyperpage{33}
   \item finish() (src.environment.SalomeEnviron method), \hyperpage{38}
   \item finish() (src.fileEnviron.BashFileEnviron method), \hyperpage{40}
-  \item finish() (src.fileEnviron.BatFileEnviron method), \hyperpage{40}
-  \item finish() (src.fileEnviron.ContextFileEnviron method), \hyperpage{41}
-  \item finish() (src.fileEnviron.FileEnviron method), \hyperpage{42}
+  \item finish() (src.fileEnviron.BatFileEnviron method), \hyperpage{41}
+  \item finish() (src.fileEnviron.ContextFileEnviron method), \hyperpage{42}
+  \item finish() (src.fileEnviron.FileEnviron method), \hyperpage{43}
   \item finish() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item flush() (src.logger.Logger method), \hyperpage{47}
-  \item flush() (src.pyconf.ConfigOutputStream method), \hyperpage{57}
+  \item flush() (src.pyconf.ConfigOutputStream method), \hyperpage{58}
   \item fore() (src.colorama.winterm.WinTerm method), \hyperpage{32}
+  \item format\_color\_exception() (in module src.debug), \hyperpage{36}
+  \item format\_exception() (in module src.debug), \hyperpage{36}
   \item FORWARD() (src.colorama.ansi.AnsiCursor method), \hyperpage{30}
   \item fromstring() (in module src.ElementTree), \hyperpage{33}
 
   \indexspace
   \bigletter G
-  \item generate\_launching\_commands() (src.test\_module.Test method), \hyperpage{63}
-  \item generate\_script() (src.test\_module.Test method), \hyperpage{63}
-  \item get() (src.environment.Environ method), \hyperpage{36}
+  \item generate\_launching\_commands() (src.test\_module.Test method), \hyperpage{64}
+  \item generate\_script() (src.test\_module.Test method), \hyperpage{64}
+  \item get() (src.environment.Environ method), \hyperpage{37}
   \item get() (src.environment.SalomeEnviron method), \hyperpage{38}
   \item get() (src.fileEnviron.BatFileEnviron method), \hyperpage{41}
-  \item get() (src.fileEnviron.ContextFileEnviron method), \hyperpage{41}
-  \item get() (src.fileEnviron.FileEnviron method), \hyperpage{42}
+  \item get() (src.fileEnviron.ContextFileEnviron method), \hyperpage{42}
+  \item get() (src.fileEnviron.FileEnviron method), \hyperpage{43}
   \item get() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item get() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
   \item get() (src.pyconf.Mapping method), \hyperpage{60}
-  \item get\_attrib() (src.xmlManager.ReadXmlFile method), \hyperpage{64}
+  \item get\_attrib() (src.xmlManager.ReadXmlFile method), \hyperpage{65}
   \item get\_attrs() (src.colorama.winterm.WinTerm method), \hyperpage{32}
   \item get\_base\_install\_dir() (in module src.product), \hyperpage{51}
   \item get\_base\_path() (in module src), \hyperpage{67}
   \item get\_distribution() (in module src.architecture), \hyperpage{34}
   \item get\_file\_environ() (in module src.fileEnviron), \hyperpage{46}
   \item get\_help() (src.options.Options method), \hyperpage{49}
-  \item get\_install\_dir() (in module src.product), \hyperpage{51}
-  \item get\_launcher\_name() (in module src), \hyperpage{67}
-  \item get\_log\_path() (in module src), \hyperpage{67}
+  \item get\_install\_dir() (in module src.product), \hyperpage{52}
+  \item get\_launcher\_name() (in module src), \hyperpage{68}
+  \item get\_log\_path() (in module src), \hyperpage{68}
   \item get\_names() (src.environment.SalomeEnviron method), \hyperpage{38}
   \item get\_nb\_proc() (in module src.architecture), \hyperpage{34}
-  \item get\_node\_text() (src.xmlManager.ReadXmlFile method), \hyperpage{64}
+  \item get\_node\_text() (src.xmlManager.ReadXmlFile method), \hyperpage{65}
   \item get\_position() (src.colorama.winterm.WinTerm method), \hyperpage{32}
-  \item get\_product\_components() (in module src.product), \hyperpage{51}
+  \item get\_product\_components() (in module src.product), \hyperpage{52}
   \item get\_product\_config() (in module src.product), \hyperpage{52}
   \item get\_product\_dependencies() (in module src.product), \hyperpage{52}
   \item get\_product\_section() (in module src.product), \hyperpage{52}
-  \item get\_products\_infos() (in module src.product), \hyperpage{52}
-  \item get\_property\_in\_product\_cfg() (in module src), \hyperpage{67}
+  \item get\_products\_infos() (in module src.product), \hyperpage{53}
+  \item get\_property\_in\_product\_cfg() (in module src), \hyperpage{68}
   \item get\_python\_version() (in module src.architecture), \hyperpage{34}
-  \item get\_salome\_version() (in module src), \hyperpage{67}
-  \item get\_test\_timeout() (src.test\_module.Test method), \hyperpage{63}
-  \item get\_tmp\_dir() (src.test\_module.Test method), \hyperpage{63}
-  \item get\_tmp\_filename() (in module src), \hyperpage{67}
+  \item get\_salome\_version() (in module src), \hyperpage{68}
+  \item get\_test\_timeout() (src.test\_module.Test method), \hyperpage{64}
+  \item get\_tmp\_dir() (src.test\_module.Test method), \hyperpage{64}
+  \item get\_tmp\_filename() (in module src), \hyperpage{68}
   \item get\_user() (in module src.architecture), \hyperpage{34}
   \item get\_win32\_calls() (src.colorama.ansitowin32.AnsiToWin32 method), \hyperpage{31}
   \item getByPath() (src.pyconf.Config method), \hyperpage{56}
-  \item getByPath() (src.pyconf.ConfigList method), \hyperpage{56}
-  \item getChar() (src.pyconf.ConfigReader method), \hyperpage{57}
-  \item getDetailOption() (src.options.Options method), \hyperpage{48}
+  \item getByPath() (src.pyconf.ConfigList method), \hyperpage{57}
+  \item getChar() (src.pyconf.ConfigReader method), \hyperpage{58}
+  \item getCurrentLogger() (in module src.logger), \hyperpage{47}
+  \item getDefaultLogger() (in module src.logger), \hyperpage{47}
+  \item getDetailOption() (src.options.Options method), \hyperpage{49}
   \item getiterator() (src.ElementTree.ElementTree method), \hyperpage{33}
-  \item getLocalEnv() (in module src.debug), \hyperpage{35}
+  \item getLocalEnv() (in module src.debug), \hyperpage{36}
   \item getroot() (src.ElementTree.ElementTree method), \hyperpage{33}
   \item getRootAttrib() (src.xmlManager.ReadXmlFile method), \hyperpage{64}
-  \item getStrConfigDbg() (in module src.debug), \hyperpage{35}
+  \item getStrConfigDbg() (in module src.debug), \hyperpage{36}
   \item getStrConfigStd() (in module src.debug), \hyperpage{36}
   \item getTmpDirDEFAULT() (in module src.test\_module), \hyperpage{64}
-  \item getToken() (src.pyconf.ConfigReader method), \hyperpage{57}
-  \item git\_extract() (in module src.system), \hyperpage{62}
+  \item getToken() (src.pyconf.ConfigReader method), \hyperpage{58}
+  \item getUnittestLogger() (in module src.logger), \hyperpage{47}
+  \item git\_extract() (in module src.system), \hyperpage{63}
   \item GREEN (src.colorama.ansi.AnsiBack attribute), \hyperpage{29}
   \item GREEN (src.colorama.ansi.AnsiFore attribute), \hyperpage{30}
   \item GREEN (src.colorama.winterm.WinColor attribute), \hyperpage{32}
   \item indent() (src.options.Options method), \hyperpage{49}
   \item init() (in module src.colorama.initialise), \hyperpage{31}
   \item install() (src.compilation.Builder method), \hyperpage{35}
-  \item InStream (class in src.debug), \hyperpage{35}
+  \item InStream (class in src.debug), \hyperpage{36}
   \item is\_a\_tty() (in module src.colorama.ansitowin32), \hyperpage{31}
-  \item is\_defined() (src.environment.Environ method), \hyperpage{36}
+  \item is\_defined() (src.environment.Environ method), \hyperpage{37}
   \item is\_defined() (src.environment.SalomeEnviron method), \hyperpage{38}
   \item is\_defined() (src.fileEnviron.FileEnviron method), \hyperpage{43}
   \item is\_defined() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
   \item is\_defined() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
   \item is\_stream\_closed() (in module src.colorama.ansitowin32), \hyperpage{31}
   \item is\_windows() (in module src.architecture), \hyperpage{34}
+  \item isCurrentLoggerUnittest() (in module src.logger), \hyperpage{48}
   \item isdir() (src.Path method), \hyperpage{66}
   \item iselement() (in module src.ElementTree), \hyperpage{33}
   \item isfile() (src.Path method), \hyperpage{66}
   \item islink() (src.Path method), \hyperpage{66}
-  \item isWord() (in module src.pyconf), \hyperpage{61}
+  \item isTypeConfig() (in module src.debug), \hyperpage{36}
+  \item isWord() (in module src.pyconf), \hyperpage{62}
   \item iteritems() (src.pyconf.Mapping method), \hyperpage{60}
   \item iterkeys() (src.pyconf.Mapping method), \hyperpage{60}
   \item iterparse (class in src.ElementTree), \hyperpage{33}
   \item LIGHTYELLOW\_EX (src.colorama.ansi.AnsiBack attribute), \hyperpage{29}
   \item LIGHTYELLOW\_EX (src.colorama.ansi.AnsiFore attribute), \hyperpage{30}
   \item list() (src.Path method), \hyperpage{66}
-  \item list\_log\_file() (in module src.logger), \hyperpage{47}
+  \item list\_log\_file() (in module src.logger), \hyperpage{48}
   \item load() (src.pyconf.Config method), \hyperpage{56}
   \item load() (src.pyconf.ConfigReader method), \hyperpage{58}
-  \item load\_cfg\_environment() (src.environment.SalomeEnviron method), \hyperpage{38}
+  \item load\_cfg\_environment() (src.environment.SalomeEnviron method), \hyperpage{39}
   \item load\_environment() (in module src.environment), \hyperpage{40}
   \item location() (src.pyconf.ConfigReader method), \hyperpage{58}
   \item log() (src.compilation.Builder method), \hyperpage{35}
   \item log\_command() (src.compilation.Builder method), \hyperpage{35}
-  \item Logger (class in src.logger), \hyperpage{46}
+  \item Logger (class in src.logger), \hyperpage{47}
 
   \indexspace
   \bigletter M
   \item MAGENTA (src.colorama.ansi.AnsiFore attribute), \hyperpage{30}
   \item MAGENTA (src.colorama.winterm.WinColor attribute), \hyperpage{32}
   \item make() (src.compilation.Builder method), \hyperpage{35}
-  \item make() (src.Path method), \hyperpage{66}
-  \item makePath() (in module src.pyconf), \hyperpage{61}
+  \item make() (src.Path method), \hyperpage{67}
+  \item makePath() (in module src.pyconf), \hyperpage{62}
   \item Mapping (class in src.pyconf), \hyperpage{60}
   \item match() (src.pyconf.ConfigReader method), \hyperpage{58}
   \item merge() (src.pyconf.ConfigMerger method), \hyperpage{57}
   \item merge\_dicts() (in module src), \hyperpage{68}
   \item mergeMapping() (src.pyconf.ConfigMerger method), \hyperpage{57}
-  \item mergeSequence() (src.pyconf.ConfigMerger method), \hyperpage{57}
-  \item MyTemplate (class in src.template), \hyperpage{63}
+  \item mergeSequence() (src.pyconf.ConfigMerger method), \hyperpage{58}
+  \item MyTemplate (class in src.template), \hyperpage{64}
 
   \indexspace
   \bigletter N
   \indexspace
   \bigletter O
   \item only\_numbers() (in module src), \hyperpage{68}
-  \item Options (class in src.options), \hyperpage{48}
+  \item Options (class in src.options), \hyperpage{49}
   \item OptResult (class in src.options), \hyperpage{48}
-  \item OutStream (class in src.debug), \hyperpage{35}
-  \item overwriteKeys() (src.pyconf.ConfigMerger method), \hyperpage{57}
+  \item OutStream (class in src.debug), \hyperpage{36}
+  \item overwriteKeys() (src.pyconf.ConfigMerger method), \hyperpage{58}
   \item overwriteMergeResolve() (in module src.pyconf), \hyperpage{62}
 
   \indexspace
   \item parse\_args() (src.options.Options method), \hyperpage{49}
   \item parse\_date() (in module src), \hyperpage{68}
   \item parseFactor() (src.pyconf.ConfigReader method), \hyperpage{58}
-  \item parseKeyValuePair() (src.pyconf.ConfigReader method), \hyperpage{58}
-  \item parseMapping() (src.pyconf.ConfigReader method), \hyperpage{58}
-  \item parseMappingBody() (src.pyconf.ConfigReader method), \hyperpage{58}
-  \item parseReference() (src.pyconf.ConfigReader method), \hyperpage{58}
-  \item parseScalar() (src.pyconf.ConfigReader method), \hyperpage{58}
-  \item parseSequence() (src.pyconf.ConfigReader method), \hyperpage{58}
+  \item parseKeyValuePair() (src.pyconf.ConfigReader method), \hyperpage{59}
+  \item parseMapping() (src.pyconf.ConfigReader method), \hyperpage{59}
+  \item parseMappingBody() (src.pyconf.ConfigReader method), \hyperpage{59}
+  \item parseReference() (src.pyconf.ConfigReader method), \hyperpage{59}
+  \item parseScalar() (src.pyconf.ConfigReader method), \hyperpage{59}
+  \item parseSequence() (src.pyconf.ConfigReader method), \hyperpage{59}
   \item parseSuffix() (src.pyconf.ConfigReader method), \hyperpage{59}
   \item parseTerm() (src.pyconf.ConfigReader method), \hyperpage{59}
   \item parseValue() (src.pyconf.ConfigReader method), \hyperpage{59}
   \item Path (class in src), \hyperpage{66}
-  \item pattern (src.template.MyTemplate attribute), \hyperpage{63}
+  \item pattern (src.template.MyTemplate attribute), \hyperpage{64}
   \item PI() (in module src.ElementTree), \hyperpage{33}
   \item pop\_debug() (in module src.debug), \hyperpage{36}
   \item POS() (src.colorama.ansi.AnsiCursor method), \hyperpage{30}
   \item prepare() (src.compilation.Builder method), \hyperpage{35}
-  \item prepare\_testbase() (src.test\_module.Test method), \hyperpage{63}
+  \item prepare\_testbase() (src.test\_module.Test method), \hyperpage{64}
   \item prepare\_testbase\_from\_dir() (src.test\_module.Test method), \hyperpage{64}
   \item prepare\_testbase\_from\_git() (src.test\_module.Test method), \hyperpage{64}
   \item prepare\_testbase\_from\_svn() (src.test\_module.Test method), \hyperpage{64}
   \item prepend() (src.environment.Environ method), \hyperpage{37}
-  \item prepend() (src.environment.SalomeEnviron method), \hyperpage{38}
+  \item prepend() (src.environment.SalomeEnviron method), \hyperpage{39}
   \item prepend() (src.fileEnviron.FileEnviron method), \hyperpage{43}
   \item prepend() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
-  \item prepend() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
+  \item prepend() (src.fileEnviron.ScreenEnviron method), \hyperpage{46}
   \item prepend\_value() (src.environment.Environ method), \hyperpage{37}
-  \item prepend\_value() (src.fileEnviron.ContextFileEnviron method), \hyperpage{41}
+  \item prepend\_value() (src.fileEnviron.ContextFileEnviron method), \hyperpage{42}
   \item prepend\_value() (src.fileEnviron.FileEnviron method), \hyperpage{43}
-  \item prepend\_value() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
+  \item prepend\_value() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{45}
   \item print\_color\_map() (in module src.printcolors), \hyperpage{49}
-  \item print\_color\_range() (in module src.printcolors), \hyperpage{49}
-  \item print\_help() (src.options.Options method), \hyperpage{49}
+  \item print\_color\_range() (in module src.printcolors), \hyperpage{50}
   \item print\_info() (in module src), \hyperpage{68}
-  \item print\_value() (in module src.printcolors), \hyperpage{49}
-  \item printc() (in module src.printcolors), \hyperpage{49}
+  \item print\_value() (in module src.printcolors), \hyperpage{50}
+  \item printc() (in module src.printcolors), \hyperpage{50}
   \item printcError() (in module src.printcolors), \hyperpage{50}
   \item printcHeader() (in module src.printcolors), \hyperpage{50}
   \item printcHighlight() (in module src.printcolors), \hyperpage{50}
   \item printcInfo() (in module src.printcolors), \hyperpage{50}
-  \item printcLabel() (in module src.printcolors), \hyperpage{50}
-  \item printcSuccess() (in module src.printcolors), \hyperpage{50}
-  \item printcWarning() (in module src.printcolors), \hyperpage{50}
+  \item printcLabel() (in module src.printcolors), \hyperpage{51}
+  \item printcSuccess() (in module src.printcolors), \hyperpage{51}
+  \item printcWarning() (in module src.printcolors), \hyperpage{51}
   \item ProcessingInstruction() (in module src.ElementTree), \hyperpage{33}
-  \item product\_compiles() (in module src.product), \hyperpage{52}
-  \item product\_has\_env\_script() (in module src.product), \hyperpage{52}
+  \item product\_compiles() (in module src.product), \hyperpage{53}
+  \item product\_has\_env\_script() (in module src.product), \hyperpage{53}
   \item product\_has\_logo() (in module src.product), \hyperpage{53}
   \item product\_has\_patches() (in module src.product), \hyperpage{53}
   \item product\_has\_salome\_gui() (in module src.product), \hyperpage{53}
   \item product\_has\_script() (in module src.product), \hyperpage{53}
   \item product\_is\_autotools() (in module src.product), \hyperpage{53}
-  \item product\_is\_cmake() (in module src.product), \hyperpage{53}
-  \item product\_is\_cpp() (in module src.product), \hyperpage{53}
-  \item product\_is\_debug() (in module src.product), \hyperpage{53}
+  \item product\_is\_cmake() (in module src.product), \hyperpage{54}
+  \item product\_is\_cpp() (in module src.product), \hyperpage{54}
+  \item product\_is\_debug() (in module src.product), \hyperpage{54}
   \item product\_is\_dev() (in module src.product), \hyperpage{54}
   \item product\_is\_fixed() (in module src.product), \hyperpage{54}
   \item product\_is\_generated() (in module src.product), \hyperpage{54}
   \item product\_is\_mpi() (in module src.product), \hyperpage{54}
   \item product\_is\_native() (in module src.product), \hyperpage{54}
-  \item product\_is\_salome() (in module src.product), \hyperpage{54}
-  \item product\_is\_smesh\_plugin() (in module src.product), \hyperpage{54}
-  \item product\_is\_vcs() (in module src.product), \hyperpage{54}
-  \item product\_is\_verbose() (in module src.product), \hyperpage{54}
+  \item product\_is\_salome() (in module src.product), \hyperpage{55}
+  \item product\_is\_smesh\_plugin() (in module src.product), \hyperpage{55}
+  \item product\_is\_vcs() (in module src.product), \hyperpage{55}
+  \item product\_is\_verbose() (in module src.product), \hyperpage{55}
   \item push\_debug() (in module src.debug), \hyperpage{36}
   \item put\_initial\_xml\_fields() (src.logger.Logger method), \hyperpage{47}
   \item put\_txt\_log\_in\_appli\_log\_dir() (src.compilation.Builder method), \hyperpage{35}
 
   \indexspace
   \bigletter R
-  \item read() (src.pyconf.ConfigInputStream method), \hyperpage{56}
+  \item read() (src.pyconf.ConfigInputStream method), \hyperpage{57}
   \item read\_config\_from\_a\_file() (in module src), \hyperpage{68}
   \item read\_results() (src.test\_module.Test method), \hyperpage{64}
-  \item readline() (src.pyconf.ConfigInputStream method), \hyperpage{56}
-  \item readlink() (src.Path method), \hyperpage{66}
+  \item readline() (src.pyconf.ConfigInputStream method), \hyperpage{57}
+  \item readlink() (src.Path method), \hyperpage{67}
   \item ReadXmlFile (class in src.xmlManager), \hyperpage{64}
   \item RED (src.colorama.ansi.AnsiBack attribute), \hyperpage{29}
   \item RED (src.colorama.ansi.AnsiFore attribute), \hyperpage{30}
   \item RED (src.colorama.winterm.WinColor attribute), \hyperpage{32}
-  \item Reference (class in src.pyconf), \hyperpage{60}
+  \item Reference (class in src.pyconf), \hyperpage{61}
   \item reinit() (in module src.colorama.initialise), \hyperpage{31}
   \item remove\_item\_from\_list() (in module src), \hyperpage{68}
-  \item removeNamespace() (src.pyconf.Config method), \hyperpage{56}
-  \item replace\_in\_file() (in module src), \hyperpage{68}
+  \item removeNamespace() (src.pyconf.Config method), \hyperpage{57}
+  \item replace\_in\_file() (in module src), \hyperpage{69}
   \item RESET (src.colorama.ansi.AnsiBack attribute), \hyperpage{29}
   \item RESET (src.colorama.ansi.AnsiFore attribute), \hyperpage{30}
   \item RESET\_ALL (src.colorama.ansi.AnsiStyle attribute), \hyperpage{30}
   \item reset\_all() (in module src.colorama.initialise), \hyperpage{31}
   \item reset\_all() (src.colorama.ansitowin32.AnsiToWin32 method), \hyperpage{31}
   \item reset\_all() (src.colorama.winterm.WinTerm method), \hyperpage{32}
-  \item resolve() (src.pyconf.Reference method), \hyperpage{60}
-  \item rm() (src.Path method), \hyperpage{66}
+  \item resolve() (src.pyconf.Reference method), \hyperpage{61}
+  \item rm() (src.Path method), \hyperpage{67}
   \item run\_all\_tests() (src.test\_module.Test method), \hyperpage{64}
-  \item run\_env\_script() (src.environment.SalomeEnviron method), \hyperpage{38}
-  \item run\_env\_script() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
+  \item run\_env\_script() (src.environment.SalomeEnviron method), \hyperpage{39}
+  \item run\_env\_script() (src.fileEnviron.ScreenEnviron method), \hyperpage{46}
   \item run\_grid\_tests() (src.test\_module.Test method), \hyperpage{64}
   \item run\_script() (src.test\_module.Test method), \hyperpage{64}
   \item run\_session\_tests() (src.test\_module.Test method), \hyperpage{64}
 
   \indexspace
   \bigletter S
-  \item SalomeEnviron (class in src.environment), \hyperpage{37}
-  \item SatException, \hyperpage{66}
+  \item SalomeEnviron (class in src.environment), \hyperpage{38}
+  \item SatException, \hyperpage{67}
   \item saveConfigDbg() (in module src.debug), \hyperpage{36}
   \item saveConfigStd() (in module src.debug), \hyperpage{36}
-  \item ScreenEnviron (class in src.fileEnviron), \hyperpage{44}
+  \item ScreenEnviron (class in src.fileEnviron), \hyperpage{45}
   \item search\_known\_errors() (src.test\_module.Test method), \hyperpage{64}
-  \item Sequence (class in src.pyconf), \hyperpage{60}
+  \item sendMessageToCurrentLogger() (in module src.logger), \hyperpage{48}
+  \item Sequence (class in src.pyconf), \hyperpage{61}
   \item Sequence.SeqIter (class in src.pyconf), \hyperpage{61}
   \item set() (src.environment.Environ method), \hyperpage{37}
   \item set() (src.environment.SalomeEnviron method), \hyperpage{39}
   \item set() (src.fileEnviron.BashFileEnviron method), \hyperpage{40}
   \item set() (src.fileEnviron.BatFileEnviron method), \hyperpage{41}
-  \item set() (src.fileEnviron.ContextFileEnviron method), \hyperpage{41}
+  \item set() (src.fileEnviron.ContextFileEnviron method), \hyperpage{42}
   \item set() (src.fileEnviron.FileEnviron method), \hyperpage{43}
-  \item set() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{44}
-  \item set() (src.fileEnviron.ScreenEnviron method), \hyperpage{45}
+  \item set() (src.fileEnviron.LauncherFileEnviron method), \hyperpage{45}
+  \item set() (src.fileEnviron.ScreenEnviron method), \hyperpage{46}
   \item set\_a\_product() (src.environment.SalomeEnviron method), \hyperpage{39}
   \item set\_application\_env() (src.environment.SalomeEnviron method), \hyperpage{39}
   \item set\_attrs() (src.colorama.winterm.WinTerm method), \hyperpage{32}
   \item set\_cpp\_env() (src.environment.SalomeEnviron method), \hyperpage{39}
   \item set\_cursor\_position() (src.colorama.winterm.WinTerm method), \hyperpage{32}
   \item set\_full\_environ() (src.environment.SalomeEnviron method), \hyperpage{39}
-  \item set\_products() (src.environment.SalomeEnviron method), \hyperpage{39}
-  \item set\_python\_libdirs() (src.environment.SalomeEnviron method), \hyperpage{39}
-  \item set\_salome\_generic\_product\_env() (src.environment.SalomeEnviron method), \hyperpage{39}
-  \item set\_salome\_minimal\_product\_env() (src.environment.SalomeEnviron method), \hyperpage{39}
+  \item set\_products() (src.environment.SalomeEnviron method), \hyperpage{40}
+  \item set\_python\_libdirs() (src.environment.SalomeEnviron method), \hyperpage{40}
+  \item set\_salome\_generic\_product\_env() (src.environment.SalomeEnviron method), \hyperpage{40}
+  \item set\_salome\_minimal\_product\_env() (src.environment.SalomeEnviron method), \hyperpage{40}
   \item set\_title() (in module src.colorama.ansi), \hyperpage{30}
   \item set\_title() (src.colorama.winterm.WinTerm method), \hyperpage{32}
   \item SetConsoleTextAttribute() (in module src.colorama.win32), \hyperpage{32}
-  \item setPath() (src.pyconf.Container method), \hyperpage{59}
+  \item setCurrentLogger() (in module src.logger), \hyperpage{48}
+  \item setPath() (src.pyconf.Container method), \hyperpage{60}
   \item setStream() (src.pyconf.ConfigReader method), \hyperpage{59}
   \item Shell (class in src.environment), \hyperpage{40}
   \item should\_wrap() (src.colorama.ansitowin32.AnsiToWin32 method), \hyperpage{31}
-  \item show\_command\_log() (in module src.logger), \hyperpage{47}
+  \item show\_command\_log() (in module src.logger), \hyperpage{48}
   \item show\_in\_editor() (in module src.system), \hyperpage{63}
   \item show\_progress() (in module src.fork), \hyperpage{46}
-  \item smartcopy() (src.Path method), \hyperpage{66}
+  \item smartcopy() (src.Path method), \hyperpage{67}
   \item special\_path\_separator() (in module src.fileEnviron), \hyperpage{46}
   \item src (module), \hyperpage{66}
   \item src.architecture (module), \hyperpage{34}
   \item src.environment (module), \hyperpage{36}
   \item src.fileEnviron (module), \hyperpage{40}
   \item src.fork (module), \hyperpage{46}
-  \item src.logger (module), \hyperpage{46}
+  \item src.logger (module), \hyperpage{47}
   \item src.options (module), \hyperpage{48}
   \item src.printcolors (module), \hyperpage{49}
-  \item src.product (module), \hyperpage{50}
+  \item src.product (module), \hyperpage{51}
   \item src.pyconf (module), \hyperpage{55}
   \item src.system (module), \hyperpage{62}
-  \item src.template (module), \hyperpage{63}
-  \item src.test\_module (module), \hyperpage{63}
+  \item src.template (module), \hyperpage{64}
+  \item src.test\_module (module), \hyperpage{64}
   \item src.xmlManager (module), \hyperpage{64}
   \item start() (src.ElementTree.TreeBuilder method), \hyperpage{33}
   \item StreamWrapper (class in src.colorama.ansitowin32), \hyperpage{31}
   \item style() (src.colorama.winterm.WinTerm method), \hyperpage{32}
   \item SubElement() (in module src.ElementTree), \hyperpage{33}
-  \item substitute() (in module src.template), \hyperpage{63}
+  \item substitute() (in module src.template), \hyperpage{64}
   \item svn\_extract() (in module src.system), \hyperpage{63}
-  \item symlink() (src.Path method), \hyperpage{66}
+  \item symlink() (src.Path method), \hyperpage{67}
 
   \indexspace
   \bigletter T
-  \item Test (class in src.test\_module), \hyperpage{63}
-  \item timedelta\_total\_seconds() (in module src.logger), \hyperpage{47}
+  \item Test (class in src.test\_module), \hyperpage{64}
+  \item timedelta\_total\_seconds() (in module src.logger), \hyperpage{48}
   \item tofix() (in module src.debug), \hyperpage{36}
   \item tostring() (in module src.ElementTree), \hyperpage{33}
   \item TreeBuilder (class in src.ElementTree), \hyperpage{33}
   \item write() (src.ElementTree.ElementTree method), \hyperpage{33}
   \item write() (src.fileEnviron.ScreenEnviron method), \hyperpage{46}
   \item write() (src.logger.Logger method), \hyperpage{47}
-  \item write() (src.pyconf.ConfigOutputStream method), \hyperpage{57}
+  \item write() (src.pyconf.ConfigOutputStream method), \hyperpage{58}
   \item write\_and\_convert() (src.colorama.ansitowin32.AnsiToWin32 method), \hyperpage{31}
   \item write\_back() (in module src.fork), \hyperpage{46}
   \item write\_cfgForPy\_file() (src.environment.FileEnvWriter method), \hyperpage{37}
-  \item write\_env\_file() (src.environment.FileEnvWriter method), \hyperpage{37}
+  \item write\_env\_file() (src.environment.FileEnvWriter method), \hyperpage{38}
   \item write\_plain\_text() (src.colorama.ansitowin32.AnsiToWin32 method), \hyperpage{31}
-  \item write\_report() (in module src.xmlManager), \hyperpage{65}
+  \item write\_report() (in module src.xmlManager), \hyperpage{66}
   \item write\_test\_margin() (src.test\_module.Test method), \hyperpage{64}
   \item write\_tree() (src.xmlManager.XmlLogFile method), \hyperpage{65}
-  \item writeToStream() (src.pyconf.Container method), \hyperpage{59}
-  \item writeToStream() (src.pyconf.Mapping method), \hyperpage{60}
+  \item writeToStream() (src.pyconf.Container method), \hyperpage{60}
+  \item writeToStream() (src.pyconf.Mapping method), \hyperpage{61}
   \item writeToStream() (src.pyconf.Sequence method), \hyperpage{61}
-  \item writeValue() (src.pyconf.Container method), \hyperpage{59}
+  \item writeValue() (src.pyconf.Container method), \hyperpage{60}
 
   \indexspace
   \bigletter X
   \item XML() (in module src.ElementTree), \hyperpage{33}
-  \item XmlLogFile (class in src.xmlManager), \hyperpage{64}
+  \item XmlLogFile (class in src.xmlManager), \hyperpage{65}
   \item XMLTreeBuilder (class in src.ElementTree), \hyperpage{33}
 
   \indexspace
index 181fc55eee19c5541b9ad9291c12c9d74e8e37a9..c1ffc995890a38ac0a27b7c5ff6b20c0f544e823 100644 (file)
@@ -1,4 +1,4 @@
-This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) (preloaded format=pdflatex 2018.4.13)  19 JUN 2018 11:14
+This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017) (preloaded format=pdflatex 2018.4.13)  26 JUN 2018 15:51
 entering extended mode
  restricted \write18 enabled.
  %&-line parsing enabled.
@@ -1290,42 +1290,42 @@ ult( )\T1/ptm/m/n/10 ,
  []
 
 [34] [35] [36]
-Underfull \hbox (badness 10000) in paragraph at lines 3174--3174
+Underfull \hbox (badness 10000) in paragraph at lines 3197--3197
 []\T1/ptm/m/it/10 filename\T1/ptm/m/n/10 , \T1/ptm/m/it/10 ad-di-tional_env={}\
 T1/ptm/m/n/10 , \T1/ptm/m/it/10 for_package=None\T1/ptm/m/n/10 ,
  []
 
-[37] [38] [39] [40] [41] [42] [43] [44] [45]
-Underfull \hbox (badness 10000) in paragraph at lines 4693--4693
-[]\T1/ptm/m/it/10 config\T1/ptm/m/n/10 , \T1/ptm/m/it/10 silent_sysstd=False\T1
-/ptm/m/n/10 , \T1/ptm/m/it/10 all_in_terminal=False\T1/ptm/m/n/10 , \T1/ptm/m/i
-t/10 mi-
+[37] [38] [39] [40] [41] [42] [43] [44] [45] [46]
+Underfull \hbox (badness 10000) in paragraph at lines 4716--4716
+[]\T1/ptm/m/it/10 config=None\T1/ptm/m/n/10 , \T1/ptm/m/it/10 silent_sysstd=Fal
+se\T1/ptm/m/n/10 , \T1/ptm/m/it/10 all_in_terminal=False\T1/ptm/m/n/10 , \T1/pt
+m/m/it/10 mi-
  []
 
-[46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60]
-Underfull \hbox (badness 10000) in paragraph at lines 6933--6937
+[47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61]
+Underfull \hbox (badness 10000) in paragraph at lines 6991--6995
 []\T1/ptm/m/n/10 Examples: makePath(`', `suf-fix') -> `suf-fix' makePath(`prefi
 x', `suf-fix') -> `pre-fix.suffix'
  []
 
-[61] [62]
+[62] [63]
 LaTeX Font Info:    Font shape `TS1/pcr/bx/n' in size <10> not available
 (Font)              Font shape `TS1/pcr/b/n' tried instead on input line 1.
- [63] [64]
-Underfull \hbox (badness 10000) in paragraph at lines 7495--7497
+ [64] [65]
+Underfull \hbox (badness 10000) in paragraph at lines 7553--7555
 []\T1/ptm/m/n/10 its at-tributes {key :
  []
 
-[65] [66] [67] [68]
-Chapter 5.
-[69
+[66] [67] [68] [69] [70
 
-] [70
+]
+Chapter 5.
+[71] [72
 
-] [71
+] [73
 
 
-] (./salomeTools.ind [72
+] (./salomeTools.ind [74
 
 
 ]
@@ -1433,7 +1433,7 @@ Underfull \hbox (badness 10000) in paragraph at lines 72--73
 \T1/ptm/m/n/10 (src.colorama.winterm.WinStyle at-tribute),
  []
 
-[73
+[75
 
 ]
 Overfull \hbox (17.33415pt too wide) in paragraph at lines 79--80
@@ -1500,277 +1500,282 @@ Overfull \hbox (12.37378pt too wide) in paragraph at lines 170--171
 []\T1/ptm/m/n/10 extract_params() (src.colorama.ansitowin32.AnsiToWin32
  []
 
-[74]
-Underfull \hbox (badness 10000) in paragraph at lines 223--224
+[76]
+Underfull \hbox (badness 10000) in paragraph at lines 225--226
 []\T1/ptm/m/n/10 get_node_text() (src.xmlManager.ReadXmlFile
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 224--225
+Underfull \hbox (badness 10000) in paragraph at lines 226--227
 []\T1/ptm/m/n/10 get_position() (src.colorama.winterm.WinTerm
  []
 
 
-Overfull \hbox (16.98375pt too wide) in paragraph at lines 237--238
+Overfull \hbox (16.98375pt too wide) in paragraph at lines 239--240
 []\T1/ptm/m/n/10 get_win32_calls() (src.colorama.ansitowin32.AnsiToWin32
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 245--246
+Underfull \hbox (badness 10000) in paragraph at lines 249--250
 []\T1/ptm/m/n/10 getRootAttrib() (src.xmlManager.ReadXmlFile
  []
 
-
-Underfull \hbox (badness 10000) in paragraph at lines 273--274
+[77]
+Underfull \hbox (badness 10000) in paragraph at lines 278--279
 []\T1/ptm/m/n/10 is_defined() (src.fileEnviron.LauncherFileEnviron
  []
 
-[75]
-Underfull \hbox (badness 10000) in paragraph at lines 275--276
+
+Underfull \hbox (badness 10000) in paragraph at lines 280--281
 []\T1/ptm/m/n/10 is_stream_closed() (in mod-ule
  []
 
 
-Underfull \hbox (badness 5260) in paragraph at lines 295--296
+Underfull \hbox (badness 5260) in paragraph at lines 302--303
 []\T1/ptm/m/n/10 LIGHTBLACK_EX (src.colorama.ansi.AnsiFore at-
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 296--297
+Underfull \hbox (badness 10000) in paragraph at lines 303--304
 []\T1/ptm/m/n/10 LIGHTBLUE_EX (src.colorama.ansi.AnsiBack at-
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 297--298
+Underfull \hbox (badness 10000) in paragraph at lines 304--305
 []\T1/ptm/m/n/10 LIGHTBLUE_EX (src.colorama.ansi.AnsiFore at-
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 298--299
+Underfull \hbox (badness 10000) in paragraph at lines 305--306
 []\T1/ptm/m/n/10 LIGHTCYAN_EX (src.colorama.ansi.AnsiBack
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 299--300
+Underfull \hbox (badness 10000) in paragraph at lines 306--307
 []\T1/ptm/m/n/10 LIGHTCYAN_EX (src.colorama.ansi.AnsiFore at-
  []
 
 
-Underfull \hbox (badness 5490) in paragraph at lines 301--302
+Underfull \hbox (badness 5490) in paragraph at lines 308--309
 []\T1/ptm/m/n/10 LIGHTGREEN_EX (src.colorama.ansi.AnsiFore at-
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 302--303
+Underfull \hbox (badness 10000) in paragraph at lines 309--310
 []\T1/ptm/m/n/10 LIGHTMAGENTA_EX (src.colorama.ansi.AnsiBack
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 303--304
+Underfull \hbox (badness 10000) in paragraph at lines 310--311
 []\T1/ptm/m/n/10 LIGHTMAGENTA_EX (src.colorama.ansi.AnsiFore
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 304--305
+Underfull \hbox (badness 10000) in paragraph at lines 311--312
 []\T1/ptm/m/n/10 LIGHTRED_EX (src.colorama.ansi.AnsiBack at-
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 305--306
+Underfull \hbox (badness 10000) in paragraph at lines 312--313
 []\T1/ptm/m/n/10 LIGHTRED_EX (src.colorama.ansi.AnsiFore at-
  []
 
 
-Underfull \hbox (badness 7273) in paragraph at lines 307--308
+Underfull \hbox (badness 7273) in paragraph at lines 314--315
 []\T1/ptm/m/n/10 LIGHTWHITE_EX (src.colorama.ansi.AnsiFore at-
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 314--315
+Underfull \hbox (badness 10000) in paragraph at lines 321--322
 []\T1/ptm/m/n/10 load_cfg_environment()
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 314--315
+Underfull \hbox (badness 10000) in paragraph at lines 321--322
 \T1/ptm/m/n/10 (src.environment.SalomeEnviron method),
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 325--326
+Underfull \hbox (badness 10000) in paragraph at lines 332--333
 []\T1/ptm/m/n/10 MAGENTA (src.colorama.winterm.WinColor at-
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 360--361
+Underfull \hbox (badness 10000) in paragraph at lines 367--368
 []\T1/ptm/m/n/10 parseKeyValuePair() (src.pyconf.ConfigReader
  []
 
-
-Underfull \hbox (badness 10000) in paragraph at lines 362--363
+[78]
+Underfull \hbox (badness 10000) in paragraph at lines 369--370
 []\T1/ptm/m/n/10 parseMappingBody() (src.pyconf.ConfigReader
  []
 
-[76]
-Underfull \hbox (badness 10000) in paragraph at lines 376--377
+
+Underfull \hbox (badness 10000) in paragraph at lines 383--384
 []\T1/ptm/m/n/10 prepare_testbase_from_dir() (src.test_module.Test
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 377--378
+Underfull \hbox (badness 10000) in paragraph at lines 384--385
 []\T1/ptm/m/n/10 prepare_testbase_from_git() (src.test_module.Test
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 378--379
+Underfull \hbox (badness 10000) in paragraph at lines 385--386
 []\T1/ptm/m/n/10 prepare_testbase_from_svn() (src.test_module.Test
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 382--383
+Underfull \hbox (badness 10000) in paragraph at lines 389--390
 []\T1/ptm/m/n/10 prepend() (src.fileEnviron.LauncherFileEnviron
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 385--386
+Underfull \hbox (badness 10000) in paragraph at lines 392--393
 []\T1/ptm/m/n/10 prepend_value() (src.fileEnviron.ContextFileEnviron
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 423--424
+Underfull \hbox (badness 10000) in paragraph at lines 429--430
 []\T1/ptm/m/n/10 put_txt_log_in_appli_log_dir()
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 449--450
+Underfull \hbox (badness 10000) in paragraph at lines 455--456
 []\T1/ptm/m/n/10 reset_all() (src.colorama.ansitowin32.AnsiToWin32
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 454--455
+Underfull \hbox (badness 10000) in paragraph at lines 460--461
 []\T1/ptm/m/n/10 run_env_script() (src.environment.SalomeEnviron
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 455--456
+Underfull \hbox (badness 10000) in paragraph at lines 461--462
 []\T1/ptm/m/n/10 run_env_script() (src.fileEnviron.ScreenEnviron
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 459--460
+Underfull \hbox (badness 10000) in paragraph at lines 465--466
 []\T1/ptm/m/n/10 run_simple_env_script()
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 459--460
+Underfull \hbox (badness 10000) in paragraph at lines 465--466
 \T1/ptm/m/n/10 (src.environment.SalomeEnviron method),
  []
 
-[77]
-Underfull \hbox (badness 10000) in paragraph at lines 481--482
+[79]
+Underfull \hbox (badness 10000) in paragraph at lines 477--478
+[]\T1/ptm/m/n/10 sendMessageToCurrentLogger() (in mod-ule
+ []
+
+
+Underfull \hbox (badness 10000) in paragraph at lines 488--489
 []\T1/ptm/m/n/10 set_a_product() (src.environment.SalomeEnviron
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 484--485
+Underfull \hbox (badness 10000) in paragraph at lines 491--492
 []\T1/ptm/m/n/10 set_console() (src.colorama.winterm.WinTerm
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 485--486
+Underfull \hbox (badness 10000) in paragraph at lines 492--493
 []\T1/ptm/m/n/10 set_cpp_env() (src.environment.SalomeEnviron
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 487--488
+Underfull \hbox (badness 10000) in paragraph at lines 494--495
 []\T1/ptm/m/n/10 set_full_environ() (src.environment.SalomeEnviron
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 488--489
+Underfull \hbox (badness 10000) in paragraph at lines 495--496
 []\T1/ptm/m/n/10 set_products() (src.environment.SalomeEnviron
  []
 
 
-Underfull \hbox (badness 6445) in paragraph at lines 489--490
+Underfull \hbox (badness 6445) in paragraph at lines 496--497
 []\T1/ptm/m/n/10 set_python_libdirs() (src.environment.SalomeEnviron
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 490--491
+Underfull \hbox (badness 10000) in paragraph at lines 497--498
 []\T1/ptm/m/n/10 set_salome_generic_product_env()
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 490--491
+Underfull \hbox (badness 10000) in paragraph at lines 497--498
 \T1/ptm/m/n/10 (src.environment.SalomeEnviron method),
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 491--492
+Underfull \hbox (badness 10000) in paragraph at lines 498--499
 []\T1/ptm/m/n/10 set_salome_minimal_product_env()
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 491--492
+Underfull \hbox (badness 10000) in paragraph at lines 498--499
 \T1/ptm/m/n/10 (src.environment.SalomeEnviron method),
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 494--495
+Underfull \hbox (badness 10000) in paragraph at lines 501--502
 []\T1/ptm/m/n/10 SetConsoleTextAttribute() (in mod-ule
  []
 
 
-Overfull \hbox (3.09415pt too wide) in paragraph at lines 498--499
+Overfull \hbox (3.09415pt too wide) in paragraph at lines 506--507
 []\T1/ptm/m/n/10 should_wrap() (src.colorama.ansitowin32.AnsiToWin32
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 559--560
+Underfull \hbox (badness 10000) in paragraph at lines 567--568
 []\T1/ptm/m/n/10 write() (src.colorama.ansitowin32.AnsiToWin32
  []
 
 
-Underfull \hbox (badness 10000) in paragraph at lines 560--561
+Underfull \hbox (badness 10000) in paragraph at lines 568--569
 []\T1/ptm/m/n/10 write() (src.colorama.ansitowin32.StreamWrapper
  []
 
-
-Overfull \hbox (25.864pt too wide) in paragraph at lines 565--566
+[80]
+Overfull \hbox (25.864pt too wide) in paragraph at lines 573--574
 []\T1/ptm/m/n/10 write_and_convert() (src.colorama.ansitowin32.AnsiToWin32
  []
 
-[78]
-Underfull \hbox (badness 10000) in paragraph at lines 568--569
+
+Underfull \hbox (badness 10000) in paragraph at lines 576--577
 []\T1/ptm/m/n/10 write_env_file() (src.environment.FileEnvWriter
  []
 
 
-Overfull \hbox (16.8337pt too wide) in paragraph at lines 569--570
+Overfull \hbox (16.8337pt too wide) in paragraph at lines 577--578
 []\T1/ptm/m/n/10 write_plain_text() (src.colorama.ansitowin32.AnsiToWin32
  []
 
-[79
+[81
 
 ])
-Package atveryend Info: Empty hook `BeforeClearDocument' on input line 8022.
-Package atveryend Info: Empty hook `AfterLastShipout' on input line 8022.
+Package atveryend Info: Empty hook `BeforeClearDocument' on input line 8080.
+Package atveryend Info: Empty hook `AfterLastShipout' on input line 8080.
  (./salomeTools.aux)
-Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 8022.
-Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 8022.
+Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 8080.
+Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 8080.
 
 Package rerunfilecheck Info: File `salomeTools.out' has not changed.
-(rerunfilecheck)             Checksum: C17A5699956F0A7FE0D4242598FFB5FE;3075.
-Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 8022.
+(rerunfilecheck)             Checksum: 101E36BBBDB8D120FE7A2C74AB3C41F0;3075.
+Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 8080.
  ) 
 Here is how much of TeX's memory you used:
- 15051 strings out of 492982
- 234938 string characters out of 6124607
- 346000 words of memory out of 5000000
- 17564 multiletter control sequences out of 15000+600000
+ 15069 strings out of 492982
+ 235454 string characters out of 6124607
+ 346380 words of memory out of 5000000
+ 17572 multiletter control sequences out of 15000+600000
  64980 words of font info for 97 fonts, out of 8000000 for 9000
  1142 hyphenation exceptions out of 8191
- 37i,12n,45p,550b,637s stack positions out of 5000i,500n,10000p,200000b,80000s
+ 37i,12n,45p,550b,639s stack positions out of 5000i,500n,10000p,200000b,80000s
 {/data/tmplgls/wambeke/share/texlive/2017/texmf-dist/fonts/enc/dvips/base/8r.
 enc}</data/tmplgls/wambeke/share/texlive/2017/texmf-dist/fonts/type1/public/ams
 fonts/cm/cmmi5.pfb></data/tmplgls/wambeke/share/texlive/2017/texmf-dist/fonts/t
@@ -1785,10 +1790,10 @@ ic/uhvr8a.pfb></data/tmplgls/wambeke/share/texlive/2017/texmf-dist/fonts/type1/
 urw/times/utmb8a.pfb></data/tmplgls/wambeke/share/texlive/2017/texmf-dist/fonts
 /type1/urw/times/utmr8a.pfb></data/tmplgls/wambeke/share/texlive/2017/texmf-dis
 t/fonts/type1/urw/times/utmri8a.pfb>
-Output written on salomeTools.pdf (83 pages, 695959 bytes).
+Output written on salomeTools.pdf (85 pages, 699075 bytes).
 PDF statistics:
- 1902 PDF objects out of 2073 (max. 8388607)
- 1781 compressed objects within 18 object streams
- 713 named destinations out of 1000 (max. 500000)
+ 1931 PDF objects out of 2073 (max. 8388607)
+ 1807 compressed objects within 19 object streams
+ 723 named destinations out of 1000 (max. 500000)
  218 words of extra memory for PDF output out of 10000 (max. 10000000)
 
index 22178a3ac2b015a2c5367f13ab9dfe0836a7cf88..628fdc88df02b1f65da7ec7be41e7f1aa94b6248 100644 (file)
@@ -20,5 +20,5 @@
 \BOOKMARK [1][-]{section.4.1}{\376\377\000s\000r\000c}{chapter.4}% 20
 \BOOKMARK [0][-]{chapter.5}{\376\377\000R\000e\000l\000e\000a\000s\000e\000\040\000N\000o\000t\000e\000s}{}% 21
 \BOOKMARK [1][-]{section.5.1}{\376\377\000R\000e\000l\000e\000a\000s\000e\000\040\000n\000o\000t\000e\000s}{chapter.5}% 22
-\BOOKMARK [0][-]{section*.538}{\376\377\000P\000y\000t\000h\000o\000n\000\040\000M\000o\000d\000u\000l\000e\000\040\000I\000n\000d\000e\000x}{}% 23
-\BOOKMARK [0][-]{section*.539}{\376\377\000I\000n\000d\000e\000x}{}% 24
+\BOOKMARK [0][-]{section*.546}{\376\377\000P\000y\000t\000h\000o\000n\000\040\000M\000o\000d\000u\000l\000e\000\040\000I\000n\000d\000e\000x}{}% 23
+\BOOKMARK [0][-]{section*.547}{\376\377\000I\000n\000d\000e\000x}{}% 24
index 096dc2bf5ab23ee8193a19c5876a20f585b92727..649815d8a9bacd040b8bbcfa307b80a4f94e026f 100644 (file)
Binary files a/doc/build/latex/salomeTools.pdf and b/doc/build/latex/salomeTools.pdf differ
index ee3892d8a45dbeaf355e7f81bd4900c05ee384f1..b0579f921e2c2f9d5ed327eed152148cf78e2757 100644 (file)
@@ -55,7 +55,7 @@
 
 
 \title{salomeTools Documentation}
-\date{Jun 19, 2018}
+\date{Jun 26, 2018}
 \release{5.0.0dev}
 \author{CEA DEN/DANS/DM2S/STMF/LGLS}
 \newcommand{\sphinxlogo}{\vbox{}}
@@ -355,11 +355,11 @@ The \sphinxstylestrong{doc} command displays sat documentation.
 \subsection{Usage}
 \label{\detokenize{commands/doc:usage}}\begin{itemize}
 \item {} 
-Show (in a web browser) the sat documentation:
+Show (in a web browser) the sat documentation in format xml/html:
 
 \fvset{hllines={, ,}}%
 \begin{sphinxVerbatim}[commandchars=\\\{\}]
-\PYG{n}{sat} \PYG{n}{doc} \PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{n}{html}
+\PYG{n}{sat} \PYG{n}{doc} \PYG{o}{\PYGZhy{}}\PYG{o}{\PYGZhy{}}\PYG{n}{xml}
 \end{sphinxVerbatim}
 
 \item {} 
@@ -2850,43 +2850,39 @@ output) in the directory \textless{}APPLICATION DIR\textgreater{}/LOGS/\textless
 
 \subsubsection{src.debug module}
 \label{\detokenize{commands/apidoc/src:module-src.debug}}\label{\detokenize{commands/apidoc/src:src-debug-module}}\index{src.debug (module)}
-This file assume DEBUG functionalities use
-\begin{itemize}
-\item {} 
-print debug messages in sys.stderr for salomeTools
-
-\item {} 
-show pretty print debug representation from instances of SAT classes
-(pretty print src.pyconf.Config), and python dict/list etc. (as ‘aVariable’)
-
-\end{itemize}
-
-WARNING: obviously supposedly show messages in SAT development phase, not production
-
-usage:
-\textgreater{}\textgreater{} import debug as DBG
-\textgreater{}\textgreater{} DBG.write(“aTitle”, aVariable)        \# not shown in production 
-\textgreater{}\textgreater{} DBG.write(“aTitle”, aVariable, True)  \# unconditionaly shown (as show=True)
-
-to set show message as development phase:
-\textgreater{}\textgreater{} DBG.push\_debug(True)
-
-to set no show message as production phase:
-\textgreater{}\textgreater{} DBG.push\_debug(False)
+This file assume DEBUG functionalities use.
+Print salomeTools debug messages in sys.stderr.
+Show pretty print debug representation from instances of SAT classes 
+(pretty print src.pyconf.Config)
 
-to set show message temporary as development phase, only in a method:
-\textgreater{}\textgreater{} def aMethodToDebug(…):
-\textgreater{}\textgreater{}   DBG.push\_debug(True)              \#force show as appended status
-\textgreater{}\textgreater{}   etc. method code with some DBG.write()
-\textgreater{}\textgreater{}   DBG.pop\_debug()                   \#restore previous status (show or not show)
-\textgreater{}\textgreater{}   return
-
-to set a message for future fix, as temporary problem to not forget:
-DBG.tofix(“aTitle”, aVariable, True/False) \#True/False in production shown, or not
-
-in command line interface you could redirect stderr to file ‘myDebug.log’:
-\textgreater{}\textgreater{} sat compile … 2\textgreater{} myDebug.log   \# only stderr
-\textgreater{}\textgreater{} sat compile … \&\textgreater{} myDebug.log   \# stdout and stderr
+\begin{DUlineblock}{0em}
+\item[] Warning: supposedly show messages in SAT development phase, not production
+\item[] 
+\item[] Usage:
+\item[] \textgreater{}\textgreater{} import debug as DBG
+\item[] \textgreater{}\textgreater{} DBG.write(“aTitle”, aVariable)        \# not shown in production 
+\item[] \textgreater{}\textgreater{} DBG.write(“aTitle”, aVariable, True)  \# unconditionaly shown (as show=True)
+\item[] 
+\item[] to set show message as development phase:
+\item[] \textgreater{}\textgreater{} DBG.push\_debug(True)
+\item[] 
+\item[] to set no show message as production phase:
+\item[] \textgreater{}\textgreater{} DBG.push\_debug(False)
+\item[] 
+\item[] to set show message temporary as development phase, only in a method:
+\item[] \textgreater{}\textgreater{} def aMethodToDebug(…):
+\item[] \textgreater{}\textgreater{}   DBG.push\_debug(True)              \#force show as appended status
+\item[] \textgreater{}\textgreater{}   etc. method code with some DBG.write()
+\item[] \textgreater{}\textgreater{}   DBG.pop\_debug()                   \#restore previous status (show or not show)
+\item[] \textgreater{}\textgreater{}   return
+\item[] 
+\item[] to set a message for future fix, as temporary problem to not forget:
+\item[] DBG.tofix(“aTitle”, aVariable, True/False) \#True/False in production shown, or not
+\item[] 
+\item[] in command line interface you could redirect stderr to file ‘myDebug.log’:
+\item[] \textgreater{}\textgreater{} sat compile … 2\textgreater{} myDebug.log   \# only stderr
+\item[] \textgreater{}\textgreater{} sat compile … \&\textgreater{} myDebug.log   \# stdout and stderr
+\end{DUlineblock}
 \index{InStream (class in src.debug)}
 
 \begin{fulllineitems}
@@ -2914,6 +2910,26 @@ keep value before lost as self.value
 \end{fulllineitems}
 
 
+\end{fulllineitems}
+
+\index{format\_color\_exception() (in module src.debug)}
+
+\begin{fulllineitems}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.debug.format_color_exception}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.debug.}}\sphinxbfcode{\sphinxupquote{format\_color\_exception}}}{\emph{msg}, \emph{limit=None}, \emph{trace=None}}{}
+Format a stack trace and the exception information.
+as traceback.format\_exception(), with color
+with traceback only if (\_debug) or (DBG.\_user in DBG.\_developpers)
+
+\end{fulllineitems}
+
+\index{format\_exception() (in module src.debug)}
+
+\begin{fulllineitems}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.debug.format_exception}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.debug.}}\sphinxbfcode{\sphinxupquote{format\_exception}}}{\emph{msg}, \emph{limit=None}, \emph{trace=None}}{}
+Format a stack trace and the exception information.
+as traceback.format\_exception(), without color
+with traceback only if (\_debug) or (DBG.\_user in DBG.\_developpers)
+
 \end{fulllineitems}
 
 \index{getLocalEnv() (in module src.debug)}
@@ -2949,6 +2965,14 @@ indent multi lines message
 
 \end{fulllineitems}
 
+\index{isTypeConfig() (in module src.debug)}
+
+\begin{fulllineitems}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.debug.isTypeConfig}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.debug.}}\sphinxbfcode{\sphinxupquote{isTypeConfig}}}{\emph{var}}{}
+To know if var is instance from Config/pyconf
+
+\end{fulllineitems}
+
 \index{pop\_debug() (in module src.debug)}
 
 \begin{fulllineitems}
@@ -2986,8 +3010,7 @@ returns as file .pyconf
 \begin{fulllineitems}
 \phantomsection\label{\detokenize{commands/apidoc/src:src.debug.tofix}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.debug.}}\sphinxbfcode{\sphinxupquote{tofix}}}{\emph{title}, \emph{var=''}, \emph{force=None}}{}
 write sys.stderr a message if \_debug{[}-1{]}==True or optionaly force=True
-use this only if no logger accessible for classic 
-logger.warning(message) or logger.debug(message)
+use this only if no logger accessible for classic logger.warning(message)
 
 \end{fulllineitems}
 
@@ -4690,7 +4713,7 @@ Implements the classes and method relative to the logging
 \index{Logger (class in src.logger)}
 
 \begin{fulllineitems}
-\phantomsection\label{\detokenize{commands/apidoc/src:src.logger.Logger}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{src.logger.}}\sphinxbfcode{\sphinxupquote{Logger}}}{\emph{config}, \emph{silent\_sysstd=False}, \emph{all\_in\_terminal=False}, \emph{micro\_command=False}}{}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.logger.Logger}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{class }}\sphinxcode{\sphinxupquote{src.logger.}}\sphinxbfcode{\sphinxupquote{Logger}}}{\emph{config=None}, \emph{silent\_sysstd=False}, \emph{all\_in\_terminal=False}, \emph{micro\_command=False}}{}
 Bases: \sphinxcode{\sphinxupquote{object}}
 
 Class to handle log mechanism.
@@ -4813,6 +4836,36 @@ the same date and time in separate variables.
 
 \end{fulllineitems}
 
+\index{getCurrentLogger() (in module src.logger)}
+
+\begin{fulllineitems}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.logger.getCurrentLogger}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.logger.}}\sphinxbfcode{\sphinxupquote{getCurrentLogger}}}{}{}
+get current logging logger, set as DefaultLogger if not set yet
+
+\end{fulllineitems}
+
+\index{getDefaultLogger() (in module src.logger)}
+
+\begin{fulllineitems}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.logger.getDefaultLogger}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.logger.}}\sphinxbfcode{\sphinxupquote{getDefaultLogger}}}{}{}
+get simple logging logger DefaultLogger, set it as current
+
+\end{fulllineitems}
+
+\index{getUnittestLogger() (in module src.logger)}
+
+\begin{fulllineitems}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.logger.getUnittestLogger}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.logger.}}\sphinxbfcode{\sphinxupquote{getUnittestLogger}}}{}{}
+get simple logging logger UnittestLogger, set it as current
+
+\end{fulllineitems}
+
+\index{isCurrentLoggerUnittest() (in module src.logger)}
+
+\begin{fulllineitems}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.logger.isCurrentLoggerUnittest}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.logger.}}\sphinxbfcode{\sphinxupquote{isCurrentLoggerUnittest}}}{}{}
+\end{fulllineitems}
+
 \index{list\_log\_file() (in module src.logger)}
 
 \begin{fulllineitems}
@@ -4838,6 +4891,24 @@ list
 
 \end{fulllineitems}
 
+\index{sendMessageToCurrentLogger() (in module src.logger)}
+
+\begin{fulllineitems}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.logger.sendMessageToCurrentLogger}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.logger.}}\sphinxbfcode{\sphinxupquote{sendMessageToCurrentLogger}}}{\emph{message}, \emph{level}}{}
+assume relay from obsolescent
+logger.write(msg, 1/2/3…) to future
+logging.critical/warning/info…(msg) (as logging package tips)
+
+\end{fulllineitems}
+
+\index{setCurrentLogger() (in module src.logger)}
+
+\begin{fulllineitems}
+\phantomsection\label{\detokenize{commands/apidoc/src:src.logger.setCurrentLogger}}\pysiglinewithargsret{\sphinxcode{\sphinxupquote{src.logger.}}\sphinxbfcode{\sphinxupquote{setCurrentLogger}}}{\emph{logger}}{}
+temporary send all in stdout as simple logging logger
+
+\end{fulllineitems}
+
 \index{show\_command\_log() (in module src.logger)}
 
 \begin{fulllineitems}
@@ -5057,19 +5128,6 @@ args is the full raw list of passed options
 
 \end{fulllineitems}
 
-\index{print\_help() (src.options.Options method)}
-
-\begin{fulllineitems}
-\phantomsection\label{\detokenize{commands/apidoc/src:src.options.Options.print_help}}\pysiglinewithargsret{\sphinxbfcode{\sphinxupquote{print\_help}}}{}{}
-Method that display all options stored in self.options and there help
-\begin{quote}\begin{description}
-\item[{Returns}] \leavevmode
-None
-
-\end{description}\end{quote}
-
-\end{fulllineitems}
-
 
 \end{fulllineitems}
 
index 749d490674aa0ed7206a1078d24d9618d6ef3006..93daa3f44af35f4715f32142685e869d37495bf0 100644 (file)
 \contentsline {subsubsection}{src.architecture module}{34}{subsubsection*.162}
 \contentsline {subsubsection}{src.compilation module}{34}{subsubsection*.169}
 \contentsline {subsubsection}{src.debug module}{35}{subsubsection*.188}
-\contentsline {subsubsection}{src.environment module}{36}{subsubsection*.202}
-\contentsline {subsubsection}{src.fileEnviron module}{40}{subsubsection*.240}
-\contentsline {subsubsection}{src.fork module}{46}{subsubsection*.305}
-\contentsline {subsubsection}{src.logger module}{46}{subsubsection*.311}
-\contentsline {subsubsection}{src.options module}{48}{subsubsection*.324}
-\contentsline {subsubsection}{src.printcolors module}{49}{subsubsection*.336}
-\contentsline {subsubsection}{src.product module}{50}{subsubsection*.349}
-\contentsline {subsubsection}{src.pyconf module}{55}{subsubsection*.379}
-\contentsline {subsubsection}{src.system module}{62}{subsubsection*.451}
-\contentsline {subsubsection}{src.template module}{63}{subsubsection*.457}
-\contentsline {subsubsection}{src.test\_module module}{63}{subsubsection*.462}
-\contentsline {subsubsection}{src.xmlManager module}{64}{subsubsection*.482}
-\contentsline {subsubsection}{Module contents}{66}{subsubsection*.496}
-\contentsline {chapter}{\numberline {5}Release Notes}{69}{chapter.5}
-\contentsline {section}{\numberline {5.1}Release notes}{69}{section.5.1}
-\contentsline {chapter}{Python Module Index}{71}{section*.538}
-\contentsline {chapter}{Index}{73}{section*.539}
+\contentsline {subsubsection}{src.environment module}{36}{subsubsection*.205}
+\contentsline {subsubsection}{src.fileEnviron module}{40}{subsubsection*.243}
+\contentsline {subsubsection}{src.fork module}{46}{subsubsection*.308}
+\contentsline {subsubsection}{src.logger module}{47}{subsubsection*.314}
+\contentsline {subsubsection}{src.options module}{48}{subsubsection*.333}
+\contentsline {subsubsection}{src.printcolors module}{49}{subsubsection*.344}
+\contentsline {subsubsection}{src.product module}{51}{subsubsection*.357}
+\contentsline {subsubsection}{src.pyconf module}{55}{subsubsection*.387}
+\contentsline {subsubsection}{src.system module}{62}{subsubsection*.459}
+\contentsline {subsubsection}{src.template module}{64}{subsubsection*.465}
+\contentsline {subsubsection}{src.test\_module module}{64}{subsubsection*.470}
+\contentsline {subsubsection}{src.xmlManager module}{64}{subsubsection*.490}
+\contentsline {subsubsection}{Module contents}{66}{subsubsection*.504}
+\contentsline {chapter}{\numberline {5}Release Notes}{71}{chapter.5}
+\contentsline {section}{\numberline {5.1}Release notes}{71}{section.5.1}
+\contentsline {chapter}{Python Module Index}{73}{section*.546}
+\contentsline {chapter}{Index}{75}{section*.547}
index b3038cfe97d62f10d7101ccacdc9bf41cab793b2..f985c3295231fdf574985043730befa9eff01a55 100644 (file)
@@ -10,9 +10,9 @@ The **doc** command displays sat documentation.
 
 Usage
 =====
-* Show (in a web browser) the sat documentation: ::
+* Show (in a web browser) the sat documentation in format xml/html: ::
 
-    sat doc --html
+    sat doc --xml
 
 * Show (in evince, for example) the (same) sat documentation in format pdf: ::
 
index 84429e4d3f5bf98be045c6a3763f879848cfa984..a8e1fd6de949d37000c264a961d7bf2d9ae6f38b 100755 (executable)
@@ -1,6 +1,7 @@
 #!/usr/bin/env python
 #-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
+
+#  Copyright (C) 2010-2018  CEA/DEN
 #
 #  This library is free software; you can redistribute it and/or
 #  modify it under the terms of the GNU Lesser General Public
 #  You should have received a copy of the GNU Lesser General Public
 #  License along with this library; if not, write to the Free Software
 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-'''This file is the main entry file to salomeTools
-'''
 
-# python imports
+"""
+This file is the main entry file to use salomeTools,
+in mode Command Line Argument(s) (CLI)
+"""
+
 import os
 import sys
-import re
-import tempfile
-import imp
-import types
-import gettext
-import traceback
 
-# salomeTools imports
-import src
+# exit OKSYS and KOSYS seems equal on linux or windows
+OKSYS = 0  # OK
+KOSYS = 1  # KO
 
 # get path to salomeTools sources
-satdir  = os.path.dirname(os.path.realpath(__file__))
+satdir = os.path.dirname(os.path.realpath(__file__))
+srcdir = os.path.join(satdir, 'src')
 cmdsdir = os.path.join(satdir, 'commands')
 
-# Make the src package accessible from all code
-sys.path.append(satdir)
-sys.path.append(cmdsdir)
-
-import config
-
-# load resources for internationalization
-#es = gettext.translation('salomeTools', os.path.join(satdir, 'src', 'i18n'))
-#es.install()
-gettext.install('salomeTools', os.path.join(satdir, 'src', 'i18n'))
-
-# The possible hooks : 
-# pre is for hooks to be executed before commands
-# post is for hooks to be executed after commands
-C_PRE_HOOK = "pre"
-C_POST_HOOK = "post"
-
-def find_command_list(dirPath):
-    ''' Parse files in dirPath that end with .py : it gives commands list
-    
-    :param dirPath str: The directory path where to search the commands
-    :return: cmd_list : the list containing the commands name 
-    :rtype: list
-    '''
-    cmd_list = []
-    for item in os.listdir(dirPath):
-        if item.endswith('.py'):
-            cmd_list.append(item[:-len('.py')])
-    return cmd_list
-
-# The list of valid salomeTools commands
-#lCommand = ['config', 'compile', 'prepare']
-lCommand = find_command_list(cmdsdir)
-
-# Define all possible option for salomeTools command :  sat <option> <args>
-parser = src.options.Options()
-parser.add_option('h', 'help', 'boolean', 'help', 
-                  _("shows global help or help on a specific command."))
-parser.add_option('o', 'overwrite', 'list', "overwrite", 
-                  _("overwrites a configuration parameters."))
-parser.add_option('g', 'debug', 'boolean', 'debug_mode', 
-                  _("run salomeTools in debug mode."))
-parser.add_option('v', 'verbose', 'int', "output_verbose_level", 
-                  _("change output verbose level (default is 3)."))
-parser.add_option('b', 'batch', 'boolean', "batch", 
-                  _("batch mode (no question)."))
-parser.add_option('t', 'all_in_terminal', 'boolean', "all_in_terminal", 
-                  _("All traces in the terminal (for example compilation logs)."))
-parser.add_option('l', 'logs_paths_in_file', 'string', "logs_paths_in_file", 
-                  _("Put the command result and paths to log files in ."))
-
-class Sat(object):
-    '''The main class that stores all the commands of salomeTools
-    '''
-    def __init__(self, opt='', datadir=None):
-        '''Initialization
-        
-        :param opt str: The sat options 
-        :param: datadir str : the directory that contain all the external 
-                              data (like software pyconf and software scripts)
-        '''
-        # Read the salomeTools options (the list of possible options is 
-        # at the beginning of this file)
-        try:
-            (options, argus) = parser.parse_args(opt)
-        except Exception as exc:
-            write_exception(exc)
-            sys.exit(-1)
-
-        # initialization of class attributes       
-        self.__dict__ = dict()
-        self.cfg = None # the config that will be read using pyconf module
-        self.arguments = opt
-        self.options = options # the options passed to salomeTools
-        self.datadir = datadir # default value will be <salomeTools root>/data
-        # set the commands by calling the dedicated function
-        self._setCommands(cmdsdir)
-        
-        # if the help option has been called, print help and exit
-        if options.help:
-            try:
-                self.print_help(argus)
-                sys.exit(0)
-            except Exception as exc:
-                write_exception(exc)
-                sys.exit(1)
-
-    def __getattr__(self, name):
-        ''' overwrite of __getattr__ function in order to display 
-            a customized message in case of a wrong call
-        
-        :param name str: The name of the attribute 
-        '''
-        if name in self.__dict__:
-            return self.__dict__[name]
-        else:
-            raise AttributeError(name + _(" is not a valid command"))
-    
-    def _setCommands(self, dirPath):
-        '''set class attributes corresponding to all commands that are 
-           in the dirPath directory
-        
-        :param dirPath str: The directory path containing the commands 
-        '''
-        # loop on the commands name
-        for nameCmd in lCommand:
-            
-            # Exception for the jobs command that requires the paramiko module
-            if nameCmd == "jobs":
-                try:
-                    saveout = sys.stderr
-                    ff = tempfile.TemporaryFile()
-                    sys.stderr = ff
-                    import paramiko
-                    sys.stderr = saveout
-                except:
-                    sys.stderr = saveout
-                    continue
-
-            # load the module that has name nameCmd in dirPath
-            (file_, pathname, description) = imp.find_module(nameCmd, [dirPath])
-            module = imp.load_module(nameCmd, file_, pathname, description)
-            
-            def run_command(args='',
-                            options=None,
-                            batch = False,
-                            verbose = -1,
-                            logger_add_link = None):
-                '''The function that will load the configuration (all pyconf)
-                and return the function run of the command corresponding to module
-                
-                :param args str: The arguments of the command 
-                '''
-                # Make sure the internationalization is available
-                gettext.install('salomeTools', os.path.join(satdir, 'src', 'i18n'))
-                
-                # Get the arguments in a list and remove the empty elements
-                if type(args) == type(''):
-                    # split by spaces without considering spaces in quotes
-                    argv_0 = re.findall(r'(?:"[^"]*"|[^\s"])+', args)
-                else:
-                    argv_0 = args
-                
-                if argv_0 != ['']:
-                    while "" in argv_0: argv_0.remove("")
-                
-                # Format the argv list in order to prevent strings 
-                # that contain a blank to be separated
-                argv = []
-                elem_old = ""
-                for elem in argv_0:
-                    if argv == [] or elem_old.startswith("-") or elem.startswith("-"):
-                        argv.append(elem)
-                    else:
-                        argv[-1] += " " + elem
-                    elem_old = elem
-                           
-                # if it is provided by the command line, get the application
-                appliToLoad = None
-                if argv not in [[''], []] and argv[0][0] != "-":
-                    appliToLoad = argv[0].rstrip('*')
-                    argv = argv[1:]
-                
-                # Check if the global options of salomeTools have to be changed
-                if options:
-                    options_save = self.options
-                    self.options = options  
-
-                # read the configuration from all the pyconf files    
-                cfgManager = config.ConfigManager()
-                self.cfg = cfgManager.get_config(datadir=self.datadir, 
-                                                 application=appliToLoad, 
-                                                 options=self.options, 
-                                                 command=__nameCmd__)
-                               
-                # Set the verbose mode if called
-                if verbose > -1:
-                    verbose_save = self.options.output_verbose_level
-                    self.options.__setattr__("output_verbose_level", verbose)    
-
-                # Set batch mode if called
-                if batch:
-                    batch_save = self.options.batch
-                    self.options.__setattr__("batch", True)
-
-                # set output level
-                if self.options.output_verbose_level is not None:
-                    self.cfg.USER.output_verbose_level = self.options.output_verbose_level
-                if self.cfg.USER.output_verbose_level < 1:
-                    self.cfg.USER.output_verbose_level = 0
-                silent = (self.cfg.USER.output_verbose_level == 0)
-
-                # create log file
-                micro_command = False
-                if logger_add_link:
-                    micro_command = True
-                logger_command = src.logger.Logger(self.cfg, 
-                                   silent_sysstd=silent,
-                                   all_in_terminal=self.options.all_in_terminal,
-                                   micro_command=micro_command)
-                
-                # Check that the path given by the logs_paths_in_file option
-                # is a file path that can be written
-                if self.options.logs_paths_in_file and not micro_command:
-                    try:
-                        self.options.logs_paths_in_file = os.path.abspath(
-                                                self.options.logs_paths_in_file)
-                        dir_file = os.path.dirname(self.options.logs_paths_in_file)
-                        if not os.path.exists(dir_file):
-                            os.makedirs(dir_file)
-                        if os.path.exists(self.options.logs_paths_in_file):
-                            os.remove(self.options.logs_paths_in_file)
-                        file_test = open(self.options.logs_paths_in_file, "w")
-                        file_test.close()
-                    except Exception as e:
-                        msg = _("WARNING: the logs_paths_in_file option will "
-                                "not be taken into account.\nHere is the error:")
-                        logger_command.write("%s\n%s\n\n" % (
-                                             src.printcolors.printcWarning(msg),
-                                             str(e)))
-                        self.options.logs_paths_in_file = None
-                
-                options_launched = ""
-                res = None
-                try:
-                    # Execute the hooks (if there is any) 
-                    # and run method of the command
-                    self.run_hook(__nameCmd__, C_PRE_HOOK, logger_command)
-                    res = __module__.run(argv, self, logger_command)
-                    self.run_hook(__nameCmd__, C_POST_HOOK, logger_command)
-                    if res is None:
-                        res = 0
-                        
-                except Exception as e:
-                    # Get error
-                    logger_command.write("\n***** ", 1)
-                    logger_command.write(src.printcolors.printcError(
-                                                       "salomeTools ERROR:"), 1)
-                    logger_command.write("\n" + str(e) + "\n\n", 1)
-                    # get stack
-                    __, __, exc_traceback = sys.exc_info()
-                    fp = tempfile.TemporaryFile()
-                    traceback.print_tb(exc_traceback, file=fp)
-                    fp.seek(0)
-                    stack = fp.read()
-                    verbosity = 5
-                    if self.options.debug_mode:
-                        verbosity = 1
-                    logger_command.write("TRACEBACK: %s" % stack.replace('"',"'"),
-                                         verbosity)
-                finally:
-                    # set res if it is not set in the command
-                    if res is None:
-                        res = 1
-                                            
-                    # come back to the original global options
-                    if options:
-                        options_launched = get_text_from_options(self.options)
-                        self.options = options_save
-                    
-                    # come back in the original batch mode if 
-                    # batch argument was called
-                    if batch:
-                        self.options.__setattr__("batch", batch_save)
-
-                    # come back in the original verbose mode if 
-                    # verbose argument was called                        
-                    if verbose > -1:
-                        self.options.__setattr__("output_verbose_level", 
-                                                 verbose_save)
-                    # put final attributes in xml log file 
-                    # (end time, total time, ...) and write it
-                    launchedCommand = ' '.join([self.cfg.VARS.salometoolsway +
-                                                os.path.sep +
-                                                'sat',
-                                                options_launched,
-                                                __nameCmd__, 
-                                                ' '.join(argv_0)])
-                    launchedCommand = launchedCommand.replace('"', "'")
-                    
-                    # Add a link to the parent command      
-                    if logger_add_link is not None:
-                        logger_add_link.add_link(logger_command.logFileName,
-                                                 __nameCmd__,
-                                                 res,
-                                                 launchedCommand)
-                        logger_add_link.l_logFiles += logger_command.l_logFiles
-                                            
-                    # Put the final attributes corresponding to end time and
-                    # Write the file to the hard drive
-                    logger_command.end_write(
-                                        {"launchedCommand" : launchedCommand})
-                    
-                    if res != 0:
-                        res = 1
-                        
-                    # print the log file path if 
-                    # the maximum verbose mode is invoked
-                    if not micro_command:
-                        logger_command.write("\nPath to the xml log file :\n",
-                                             5)
-                        logger_command.write("%s\n\n" % src.printcolors.printcInfo(
-                                                logger_command.logFilePath), 5)
-
-                    # If the logs_paths_in_file was called, write the result
-                    # and log files in the given file path
-                    if self.options.logs_paths_in_file and not micro_command:
-                        file_res = open(self.options.logs_paths_in_file, "w")
-                        file_res.write(str(res) + "\n")
-                        for i, filepath in enumerate(logger_command.l_logFiles):
-                            file_res.write(filepath)
-                            if i < len(logger_command.l_logFiles):
-                                file_res.write("\n")
-                                file_res.flush()
-                
-                return res
-
-            # Make sure that run_command will be redefined 
-            # at each iteration of the loop
-            globals_up = {}
-            globals_up.update(run_command.__globals__)
-            globals_up.update({'__nameCmd__': nameCmd, '__module__' : module})
-            func = types.FunctionType(run_command.__code__,
-                                      globals_up,
-                                      run_command.__name__,
-                                      run_command.__defaults__,
-                                      run_command.__closure__)
-
-            # set the attribute corresponding to the command
-            self.__setattr__(nameCmd, func)
-
-    def run_hook(self, cmd_name, hook_type, logger):
-        '''Execute a hook file for a given command regarding the fact 
-           it is pre or post
-        
-        :param cmd_name str: The the command on which execute the hook
-        :param hook_type str: pre or post
-        :param logger Logger: the logging instance to use for the prints
-        '''
-        # The hooks must be defined in the application pyconf
-        # So, if there is no application, do not do anything
-        if not src.config_has_application(self.cfg):
-            return
-
-        # The hooks must be defined in the application pyconf in the
-        # APPLICATION section, hook : { command : 'script_path.py'}
-        if "hook" not in self.cfg.APPLICATION \
-                    or cmd_name not in self.cfg.APPLICATION.hook:
-            return
-
-        # Get the hook_script path and verify that it exists
-        hook_script_path = self.cfg.APPLICATION.hook[cmd_name]
-        if not os.path.exists(hook_script_path):
-            raise src.SatException(_("Hook script not found: %s") % 
-                                   hook_script_path)
-        
-        # Try to execute the script, catch the exception if it fails
-        try:
-            # import the module (in the sense of python)
-            pymodule = imp.load_source(cmd_name, hook_script_path)
-            
-            # format a message to be printed at hook execution
-            msg = src.printcolors.printcWarning(_("Run hook script"))
-            msg = "%s: %s\n" % (msg, 
-                                src.printcolors.printcInfo(hook_script_path))
-            
-            # run the function run_pre_hook if this function is called 
-            # before the command, run_post_hook if it is called after
-            if hook_type == C_PRE_HOOK and "run_pre_hook" in dir(pymodule):
-                logger.write(msg, 1)
-                pymodule.run_pre_hook(self.cfg, logger)
-            elif hook_type == C_POST_HOOK and "run_post_hook" in dir(pymodule):
-                logger.write(msg, 1)
-                pymodule.run_post_hook(self.cfg, logger)
-
-        except Exception as exc:
-            msg = _("Unable to run hook script: %s") % hook_script_path
-            msg += "\n" + str(exc)
-            raise src.SatException(msg)
-
-    def print_help(self, opt):
-        '''Prints help for a command. Function called when "sat -h <command>"
-        
-        :param argv str: the options passed (to get the command name)
-        '''
-        # if no command as argument (sat -h)
-        if len(opt)==0:
-            print_help()
-            return
-        # get command name
-        command = opt[0]
-        # read the configuration from all the pyconf files
-        cfgManager = config.ConfigManager()
-        self.cfg = cfgManager.get_config(datadir=self.datadir)
-
-        # Check if this command exists
-        if not hasattr(self, command):
-            raise src.SatException(_("Command '%s' does not exist") % command)
-        
-        # Print salomeTools version
-        print_version()
-        
-        # load the module
-        module = self.get_module(command)
+# Make the src & commands package accessible from all code
+sys.path.insert(0, satdir)
+sys.path.insert(0, srcdir) # TODO remove that
+sys.path.insert(0, cmdsdir) # TODO remove that
 
-        # print the description of the command that is done in the command file
-        if hasattr( module, "description" ) :
-            print(src.printcolors.printcHeader( _("Description:") ))
-            print(module.description() + '\n')
+import src.logger as LOG
+import src.debug as DBG # Easy print stderr (for DEBUG only)
 
-        # print the description of the command options
-        if hasattr( module, "parser" ) :
-            module.parser.print_help()
+logger = LOG.getDefaultLogger()
 
-    def get_module(self, module):
-        '''Loads a command. Function called only by print_help
-        
-        :param module str: the command to load
-        '''
-        # Check if this command exists
-        if not hasattr(self, module):
-            raise src.SatException(_("Command '%s' does not exist") % module)
+#################################
+# MAIN
+#################################
+if __name__ == "__main__":
+    from src.salomeTools import Sat # it is time to do import
 
-        # load the module
-        (file_, pathname, description) = imp.find_module(module, [cmdsdir])
-        module = imp.load_module(module, file_, pathname, description)
-        return module
+    _debug = False # Have to be False in production (for programmers DEBUG only)
+    DBG.push_debug(_debug) # as __main__ with sys.exit so no need pop_debug
 
-def get_text_from_options(options):
-    text_options = ""
-    for attr in dir(options):
-        if attr.startswith("__"):
-            continue
-        if options.__getattr__(attr) != None:
-            option_contain = options.__getattr__(attr)
-            if type(option_contain)==type([]):
-                option_contain = ",".join(option_contain)
-            if type(option_contain)==type(True):
-                option_contain = ""
-            text_options+= "--%s %s " % (attr, option_contain)
-    return text_options
-                
+    args = sys.argv[1:] # skip useless "sat'
+    sat = Sat(logger) # instantiate the salomeTools class
 
-def print_version():
-    '''prints salomeTools version (in src/internal_config/salomeTools.pyconf)
-    '''
-    # read the config 
-    cfgManager = config.ConfigManager()
-    cfg = cfgManager.get_config()
-    # print the key corresponding to salomeTools version
-    print(src.printcolors.printcHeader( _("Version: ") ) + 
-          cfg.INTERNAL.sat_version + '\n')
+    try:
+      returnCode = sat.execute_cli(args)
+    except Exception as e:
+      # error as may be unknown problem
+      # verbose debug message with traceback if developers
+      msg = "Exception raised for execute_cli('%s'):\n" % " ".join(args)
+      logger.critical(DBG.format_exception(msg))
+      logger.close() # important to close logger
+      sys.exit(KOSYS)
 
+    # no Exception but may be known problem
+    DBG.write("execute_cli return code", returnCode)
+    if returnCode.isOk():
+      # OK no trace
+      logger.step("sat exit code: %s" % returnCode)
+    else:
+      # KO warning as known problem have to say why
+      logger.warning("sat exit code: %s" % returnCode)
+    logger.close() # important to close logger
+    sys.exit(returnCode.toSys())
 
-def print_help():
-    '''prints salomeTools general help
-    
-    :param options str: the options
-    '''
-    print_version()
-    
-    print(src.printcolors.printcHeader( _("Usage: ") ) + 
-          "sat [sat_options] <command> [product] [command_options]\n")
 
-    parser.print_help()
+else:
+    logger.critical("forbidden/unexpected mode for __name__ '%s'" % __name__)
+    logger.close() # important to close logger
+    sys.exit(KOSYS)
 
-    # display all the available commands.
-    print(src.printcolors.printcHeader(_("Available commands are:\n")))
-    for command in lCommand:
-        print(" - %s" % (command))
-        
-    # Explain how to get the help for a specific command
-    print(src.printcolors.printcHeader(_("\nGetting the help for a specific"
-                                    " command: ")) + "sat --help <command>\n")
 
-def write_exception(exc):
-    '''write exception in case of error in a command
-    
-    :param exc exception: the exception to print
-    '''
-    sys.stderr.write("\n***** ")
-    sys.stderr.write(src.printcolors.printcError("salomeTools ERROR:"))
-    sys.stderr.write("\n" + str(exc) + "\n")
 
-# ###############################
-# MAIN : terminal command usage #
-# ###############################
-if __name__ == "__main__":  
-    # Initialize the code that will be returned by the terminal command 
-    code = 0
-    (options, args) = parser.parse_args(sys.argv[1:])
-    
-    # no arguments : print general help
-    if len(args) == 0:
-        print_help()
-        sys.exit(0)
-    
-    # instantiate the salomeTools class with correct options
-    sat = Sat(sys.argv[1:])
-    # the command called
-    command = args[0]
-    # get dynamically the command function to call
-    fun_command = sat.__getattr__(command)
-    # Run the command using the arguments
-    code = fun_command(args[1:])
-    
-    # exit salomeTools with the right code (0 if no errors, else 1)
-    if code is None: code = 0
-    sys.exit(code)
-        
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 4f522e2..4d0b046
 #  License along with this library; if not, write to the Free Software
 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 
-"""\
-This file assume DEBUG functionalities use
-
-- print debug messages in sys.stderr for salomeTools
-- show pretty print debug representation from instances of SAT classes
-  (pretty print src.pyconf.Config), and python dict/list etc. (as 'aVariable')
-
-WARNING: obviously supposedly show messages in SAT development phase, not production
-
-usage:
->> import debug as DBG
->> DBG.write("aTitle", aVariable)        # not shown in production 
->> DBG.write("aTitle", aVariable, True)  # unconditionaly shown (as show=True)
-
-to set show message as development phase:
->> DBG.push_debug(True)
-
-to set no show message as production phase:
->> DBG.push_debug(False)
-
-to set show message temporary as development phase, only in a method:
->> def aMethodToDebug(...):
->>   DBG.push_debug(True)              #force show as appended status
->>   etc. method code with some DBG.write()
->>   DBG.pop_debug()                   #restore previous status (show or not show)
->>   return
-
-to set a message for future fix, as temporary problem to not forget:
-DBG.tofix("aTitle", aVariable, True/False) #True/False in production shown, or not
+"""
+This file assume DEBUG functionalities use.
+Print salomeTools debug messages in sys.stderr.
+Show pretty print debug representation from instances of SAT classes 
+(pretty print src.pyconf.Config)
 
-in command line interface you could redirect stderr to file 'myDebug.log':
->> sat compile ... 2> myDebug.log   # only stderr
->> sat compile ... &> myDebug.log   # stdout and stderr
+| Warning: supposedly show messages in SAT development phase, not production
+| 
+| Usage:
+| >> import debug as DBG
+| >> DBG.write("aTitle", aVariable)        # not shown in production 
+| >> DBG.write("aTitle", aVariable, True)  # unconditionaly shown (as show=True)
+| 
+| to set show message as development phase:
+| >> DBG.push_debug(True)
+| 
+| to set no show message as production phase:
+| >> DBG.push_debug(False)
+| 
+| to set show message temporary as development phase, only in a method:
+| >> def aMethodToDebug(...):
+| >>   DBG.push_debug(True)              #force show as appended status
+| >>   etc. method code with some DBG.write()
+| >>   DBG.pop_debug()                   #restore previous status (show or not show)
+| >>   return
+| 
+| to set a message for future fix, as temporary problem to not forget:
+| DBG.tofix("aTitle", aVariable, True/False) #True/False in production shown, or not
+| 
+| in command line interface you could redirect stderr to file 'myDebug.log':
+| >> sat compile ... 2> myDebug.log   # only stderr
+| >> sat compile ... &> myDebug.log   # stdout and stderr
 """
 
 import os
 import sys
+import traceback
 import StringIO as SIO
 import pprint as PP
 
 _debug = [False] #support push/pop for temporary activate debug outputs
 
+_user = os.environ['USER']
+# wambeke is christian at home
+_developpers = ["christian", "wambeke", "crouzet"] # crouzet, kloss ...
+
+
 def indent(text, amount=2, ch=' '):
     """indent multi lines message"""
     padding = amount * ch
     return ''.join(padding + line for line in text.splitlines(True))
 
+def isTypeConfig(var):
+    """To know if var is instance from Config/pyconf"""
+    typ = str(type(var))
+    # print "isTypeConfig" ,type, dir(var)
+    if ".pyconf.Config" in typ: return True
+    if ".pyconf.Mapping" in typ: return True
+    if ".pyconf.Sequence" in typ: return True
+    # print "NOT isTypeConfig %s" % typ
+    return False
+    
 def write(title, var="", force=None, fmt="\n#### DEBUG: %s:\n%s\n"):
     """write sys.stderr a message if _debug[-1]==True or optionaly force=True"""
     if _debug[-1] or force:
-        if 'src.pyconf.' in str(type(var)): 
-            sys.stderr.write(fmt % (title, indent(getStrConfigDbg(var))))
-        elif type(var) is not str:
-            sys.stderr.write(fmt % (title, indent(PP.pformat(var))))
-        else:
-            sys.stderr.write(fmt % (title, indent(var)))
+      tvar = type(var)
+      typ = str(tvar)
+      if isTypeConfig(var):
+        sys.stderr.write(fmt % (title, indent(COLS.toColor(getStrConfigDbg(var)))))
+        return
+      if 'UnittestStream' in typ:
+        sys.stderr.write(fmt % (title, indent(var.getLogs())))
+        return  
+      if tvar is not str and tvar is not unicode:
+        sys.stderr.write(fmt % (title, indent(PP.pformat(var))))
+        return
+      sys.stderr.write(fmt % (title, indent(var)))
+      return
     return
 
 def tofix(title, var="", force=None):
-    """\
+    """
     write sys.stderr a message if _debug[-1]==True or optionaly force=True
-    use this only if no logger accessible for classic 
-    logger.warning(message) or logger.debug(message)
+    use this only if no logger accessible for classic logger.warning(message)
     """
     fmt = "\n#### TOFIX: %s:\n%s\n"
     write(title, var, force, fmt)
@@ -96,14 +117,59 @@ def pop_debug():
         sys.stderr.write("\nERROR: pop_debug: too much pop.")
         return None
 
+
+def format_exception(msg, limit=None, trace=None):
+  """
+  Format a stack trace and the exception information.
+  as traceback.format_exception(), without color
+  with traceback only if (_debug) or (DBG._user in DBG._developpers)
+  """
+  etype, value, tb = sys.exc_info()
+  if (_debug[-1]) or (_user in _developpers):
+    res = msg
+    if tb:
+      res += "\nTraceback (most recent call last):\n"
+      res += "".join(traceback.format_tb(tb, limit))  # [:-1])
+    res += "\n"
+    res += "\n".join(traceback.format_exception_only(etype, value))
+    return res
+  else:
+    res = msg
+    res += "".join(traceback.format_exception_only(etype, value))
+    return res
+
+def format_color_exception(msg, limit=None, trace=None):
+  """
+  Format a stack trace and the exception information.
+  as traceback.format_exception(), with color
+  with traceback only if (_debug) or (DBG._user in DBG._developpers)
+  """
+  etype, value, tb = sys.exc_info()
+  if (_debug[-1]) or (_user in _developpers):
+    res = "<red>" + msg
+    if tb:
+      res += "<yellow>\nTraceback (most recent call last):\n"
+      res += "".join(traceback.format_tb(tb, limit))  # [:-1])
+    res += "\n<red>"
+    res += "\n".join(traceback.format_exception_only(etype, value))
+    return res + "<reset>"
+  else:
+    res = "<red>" + msg  # + "<bright>"
+    res += "".join(traceback.format_exception_only(etype, value))
+    return res + "<reset>"
+
+
 ###############################################
 # utilitaires divers pour debug
 ###############################################
 
 class OutStream(SIO.StringIO):
-    """utility class for pyconf.Config output iostream"""
+    """
+    utility class for pyconf.Config output iostream
+    """
     def close(self):
-      """because Config.__save__ calls close() stream as file
+      """
+      because Config.__save__ calls close() stream as file
       keep value before lost as self.value
       """
       self.value = self.getvalue()
@@ -133,7 +199,7 @@ def getStrConfigStd(config):
     return outStream.value
 
 def getStrConfigDbg(config):
-    """\
+    """
     set string as saveConfigDbg, 
     as (path expression evaluation) for debug
     """
@@ -143,41 +209,61 @@ def getStrConfigDbg(config):
 
 def saveConfigDbg(config, aStream, indent=0, path=""):
     """pyconf returns multilines (path expression evaluation) for debug"""
-    _saveConfigRecursiveDbg(config, aStream, indent, path)
+    _saveConfigRecursiveDbg(config, aStream, indent, path, 0)
     aStream.close() # as config.__save__()
 
-def _saveConfigRecursiveDbg(config, aStream, indent, path):
+def _saveConfigRecursiveDbg(config, aStream, indent, path, nb):
     """pyconf inspired from Mapping.__save__"""
     debug = False
+    nbp = nb + 1 # depth recursive
     if indent <= 0: 
       indentp = 0
     else:
-      indentp = indentp + 2
+      indentp = indent + 2
+      
+    if nbp > 10: # protection
+      # raise Exception("!!! ERROR: Circular reference after %s" % aStream.getvalue())
+      # raise Exception("!!! ERROR: Circular reference %s" % path)
+      aStream.write("<red>!!! ERROR: Circular reference after %s<reset>\n" % path)
+      return
+    
     indstr = indent * ' ' # '':no indent, ' ':indent
     strType = str(type(config))
+    if debug: print "saveDbg Type", path, strType
+    
     if "Sequence" in strType:
       for i in range(len(config)):
-        _saveConfigRecursiveDbg(config[i], aStream, indentp, path+"[%i]" % i)
+        _saveConfigRecursiveDbg(config[i], aStream, indentp, path+"[%i]" % i, nbp)
       return
-    try: 
+    '''
+    if "Reference" in strType:
+      try:
+        #evaluate = value.resolve(config)
+        aStream.write("<header>%s%s<reset> : %s <yellow>--> '%s'<reset>\n" % (indstr, path, config, str(config)))
+      except Exception as e:  
+        aStream.write("<header>%s%s<reset> : <red>!!! ERROR: %s !!!<reset>\n" % (indstr, path, e.message))     
+      return
+    '''
+    
+    try: #type config, mapping
       order = object.__getattribute__(config, 'order')
       data = object.__getattribute__(config, 'data')
     except:
       aStream.write("%s%s : '%s'\n" % (indstr, path, str(config)))
       return     
-    for key in sorted(order):
+    for key in sorted(data): #order): # data as sort alphabetical, order as initial order
       value = data[key]
       strType = str(type(value))
-      if debug: print indstr + 'strType = %s' % strType, key
+      if debug: print 'strType', path, key, strType
       if "Config" in strType:
-        _saveConfigRecursiveDbg(value, aStream, indentp, path+"."+key)
+        _saveConfigRecursiveDbg(value, aStream, indentp, path+"."+key, nbp)
         continue
       if "Mapping" in strType:
-        _saveConfigRecursiveDbg(value, aStream, indentp, path+"."+key)
+        _saveConfigRecursiveDbg(value, aStream, indentp, path+"."+key, nbp)
         continue
       if "Sequence" in strType:
         for i in range(len(value)):
-          _saveConfigRecursiveDbg(value[i], aStream, indentp, path+"."+key+"[%i]" % i)
+          _saveConfigRecursiveDbg(value.data[i], aStream, indentp, path+"."+key+"[%i]" % i, nbp)
         continue
       if "Expression" in strType:
         try:
old mode 100644 (file)
new mode 100755 (executable)
index d1aa350..f50ae77
@@ -25,10 +25,13 @@ import os
 import datetime
 import re
 import tempfile
+import shutil
 
 import src
-from . import printcolors
-from . import xmlManager
+import printcolors
+import xmlManager
+
+import src.debug as DBG
 
 log_macro_command_file_expression = "^[0-9]{8}_+[0-9]{6}_+.*\.xml$"
 log_all_command_file_expression = "^.*[0-9]{8}_+[0-9]{6}_+.*\.xml$"
@@ -38,7 +41,7 @@ class Logger(object):
     Class to handle log mechanism.
     """
     def __init__(self,
-                 config,
+                 config= None,
                  silent_sysstd=False,
                  all_in_terminal=False,
                  micro_command = False):
@@ -48,6 +51,7 @@ class Logger(object):
         :param silent_sysstd boolean: if True, do not write anything
                                       in terminal.
         """
+        DBG.write("src.logger.Logger", id(self))
         self.config = config
         self.default_level = 3
         self.silentSysStd = silent_sysstd
@@ -156,12 +160,9 @@ class Logger(object):
                                           ("sat command ...")
         """
         xmlLinks = self.xmlFile.xmlroot.find("Links")
-        src.xmlManager.add_simple_node(xmlLinks,
-                                       "link", 
-                                       text = log_file_name,
-                                       attrib = {"command" : command_name,
-                                                 "passed" : command_res,
-                                           "launchedCommand" : full_launched_command})
+        flc = src.xmlManager.escapeSequence(full_launched_command)
+        att = {"command" : command_name, "passed" : command_res, "launchedCommand" : flc}
+        src.xmlManager.add_simple_node(xmlLinks, "link", text = log_file_name, attrib = att)
 
     def write(self, message, level=None, screenOnly=False):
         """\
@@ -173,6 +174,12 @@ class Logger(object):
                           to the message 0 < level < 6.
         :param screenOnly boolean: if True, do not write in log file.
         """
+        # avoid traces if unittest
+        if isCurrentLoggerUnittest():
+            # print("doing unittest")
+            sendMessageToCurrentLogger(message, level)
+            return
+
         # do not write message starting with \r to log file
         if not message.startswith("\r") and not screenOnly:
             self.xmlFile.append_node_text("Log", 
@@ -245,10 +252,28 @@ class Logger(object):
         
         # Call the method to write the xml file on the hard drive
         self.xmlFile.write_tree(stylesheet = "command.xsl")
+
+        # so unconditionnaly copy stylesheet file(s)
+        xslDir = os.path.join(self.config.VARS.srcDir, 'xsl')
+        xslCommand = "command.xsl"
+        # xslHat = "hat.xsl" # have to be completed (one time at end)
+        xsltest = "test.xsl"
+        imgLogo = "LOGO-SAT.png"
+        files_to_copy = [xslCommand, xsltest, imgLogo]
+
+        logDir = src.get_log_path(self.config)
+        # copy the stylesheets in the log directory as soon as possible here
+        # because referenced in self.xmlFile.write_tree above
+        # OP We use copy instead of copy2 to update the creation date
+        #    So we can clean the LOGS directories easily
+        for f in files_to_copy:
+          f_init = os.path.join(xslDir, f)
+          f_target = os.path.join(logDir, f)
+          if not os.path.isfile(f_target): # do not overrride
+            shutil.copy(f_init, logDir)
         
         # Dump the config in a pyconf file in the log directory
-        logDir = src.get_log_path(self.config)
-        dumpedPyconfFileName = (self.config.VARS.datehour 
+        dumpedPyconfFileName = (self.config.VARS.datehour
                                 + "_" 
                                 + self.config.VARS.command 
                                 + ".pyconf")
@@ -409,3 +434,86 @@ def update_hat_xml(logDir, application=None, notShownCommands = []):
     
     # Write the file on the hard drive
     xmlHat.write_tree('hat.xsl')
+
+
+# TODO for future
+# prepare skip to logging logger sat5.1
+# suppose only one logger in sat5.1
+_currentLogger = []
+
+def getCurrentLogger():
+  """get current logging logger, set as DefaultLogger if not set yet"""
+  if len(_currentLogger) == 0:
+    import src.loggingSimple as LOGSI
+    logger = LOGSI.getDefaultLogger()
+    _currentLogger.append(logger)
+    logger.warning("set by default current logger as %s" % logger.name)
+  return _currentLogger[0]
+
+def getDefaultLogger():
+  """get simple logging logger DefaultLogger, set it as current"""
+  import src.loggingSimple as LOGSI
+  logger = LOGSI.getDefaultLogger()
+  setCurrentLogger(logger) # set it as current
+  return logger
+
+def getUnittestLogger():
+  """get simple logging logger UnittestLogger, set it as current"""
+  import src.loggingSimple as LOGSI
+  logger = LOGSI.getUnittestLogger()
+  setCurrentLogger(logger) # set it as current
+  return logger
+
+def setCurrentLogger(logger):
+  """temporary send all in stdout as simple logging logger"""
+  if len(_currentLogger) == 0:
+    _currentLogger.append(logger)
+    logger.warning("set current logger as %s" % logger.name)
+  else:
+    if _currentLogger[0].name != logger.name:
+      # logger.debug("quit current logger as default %s" % _currentLogger[0].name)
+      _currentLogger[0] = logger
+      logger.warning("change current logger as %s" % logger.name)
+  return _currentLogger[0]
+
+def isCurrentLoggerUnittest():
+    logger = getCurrentLogger()
+    if "Unittest" in logger.name:
+      res = True
+    else:
+      res = False
+    DBG.write("isCurrentLoggerUnittest %s" % logger.name, res)
+    return res
+
+def sendMessageToCurrentLogger(message, level):
+    """
+    assume relay from obsolescent
+    logger.write(msg, 1/2/3...) to future
+    logging.critical/warning/info...(msg) (as logging package tips)
+    """
+    logger = getCurrentLogger()
+    if level is None:
+      lev = 2
+    else:
+      lev = level
+    if lev <= 1:
+      logger.critical(message)
+      return
+    if lev == 2:
+      logger.warning(message)
+      return
+    if lev == 3:
+      logger.info(message)
+      return
+    if lev == 4:
+      logger.step(message)
+      return
+    if lev == 5:
+      logger.trace(message)
+      return
+    if lev >= 6:
+      logger.debug(message)
+      return
+    msg = "What is this level: '%s' for message:\n%s" % (level, message)
+    logger.warning(msg)
+    return
diff --git a/src/loggingSimple.py b/src/loggingSimple.py
new file mode 100755 (executable)
index 0000000..7073e4d
--- /dev/null
@@ -0,0 +1,509 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+salomeTools logger. using logging package
+
+| http://sametmax.com/ecrire-des-logs-en-python/
+|
+| Define two LoggerSat instances in salomeTools, no more need.
+|   - _loggerDefault as production/development logger
+|   - _loggerUnittest as unittest logger
+|
+
+"""
+
+
+import os
+import sys
+import time
+import random
+import logging as LOGI
+
+from logging.handlers import BufferingHandler
+import pprint as PP
+
+import src.debug as DBG  # Easy print stderr (for DEBUG only)
+
+_verbose = False
+_name = "loggingSimple"
+_loggerDefaultName = 'SimpleDefaultLogger'
+_loggerUnittestName = 'SimpleUnittestLogger'
+
+_STEP = LOGI.INFO - 1  # step level is just below INFO
+_TRACE = LOGI.INFO - 2  # trace level is just below STEP
+
+LOGI.STEP = _STEP  # only for coherency,
+LOGI.TRACE = _TRACE  # only for coherency,
+
+_knownLevels = "CRITICAL ERROR WARNING INFO STEP TRACE DEBUG".upper().split()
+_knownLevelsStr = "[%s]" % "|".join(_knownLevels)
+
+
+#################################################################
+# utilities methods
+#################################################################
+
+def filterLevel(aLevel):
+  """
+  filter levels logging values from firsts characters levels.
+  No case sensitive
+
+  | example:
+  | 'i' -> 'INFO'
+  | 'cRiT' -> 'CRITICAL'
+  """
+  aLev = aLevel.upper()
+  knownLevels = _knownLevels
+  maxLen = max([len(i) for i in knownLevels])
+  for i in range(maxLen):
+    for lev in knownLevels:
+      if aLev == lev[:i]:
+        # DBG.write("filterLevel", "%s -> %s" % (aLevel, lev))
+        return lev
+  msg = "Unknown level '%s', accepted are:\n%s" % (aLev, ", ".join(knownLevels))
+  return msg
+  # raise Exception(msg)
+
+
+def indent(msg, nb, car=" "):
+  """indent nb car (spaces) multi lines message except first one"""
+  s = msg.split("\n")
+  res = ("\n" + car * nb).join(s)
+  return res
+
+
+def indentUnittest(msg, prefix=" | "):
+  """
+  indent multi lines message except first one with prefix.
+  prefix default is designed for less spaces for size logs files
+  and keep logs human eye readable
+  """
+  s = msg.split("\n")
+  res = ("\n" + prefix).join(s)
+  return res
+
+
+def log(msg, force=False):
+  """elementary log when no logging.Logger yet"""
+  prefix = "---- %s.log: " % _name
+  nb = len(prefix)
+  if _verbose or force:
+    print(prefix + indent(msg, nb))
+
+
+# just for debug info where is import logging
+log("import logging on %s" % LOGI.__file__)
+
+
+def getStrDirLogger(logger):
+  """
+  Returns multi line string for logger description, with dir(logger).
+  Used for debug
+  """
+  lgr = logger  # shortcut
+  msg = "%s(name=%s, dateLogger=%s):\n%s\n"
+  cName = lgr.__class__.__name__
+  res = msg % (cName, lgr.name, lgr.dateLogger, PP.pformat(dir(lgr)))
+  return res
+
+
+def getStrHandler(handler):
+  """
+  Returns one line string for handler description
+  (as inexisting __repr__)
+  to avoid create inherited classe(s) handler
+  """
+  h = handler  # shortcut
+  msg = "%s(name=%s)"
+  cName = h.__class__.__name__
+  res = msg % (cName, h.get_name())
+  return res
+
+
+def getStrShort(msg):
+  """Returns short string for msg (as first caracters without line feed"""
+  # log("getStrShort " + str(msg), True)
+  res = msg.replace("\n", "//")[0:30]
+  return res
+
+
+def getStrLogRecord(logRecord):
+  """
+  Returns one line string for simple logging LogRecord description
+  """
+  msg = "LogRecord(level='%s', msg='%s...')"
+  shortMsg = getStrShort(logRecord.msg)
+  levelName = logRecord.levelname
+  res = msg % (levelName, shortMsg)
+  return res
+
+
+def getListOfStrLogRecord(listOfLogRecord):
+  """
+  Returns one line string for logging LogRecord description
+  """
+  res = [getStrLogRecord(l) for l in listOfLogRecord]
+  return res
+
+
+#################################################################
+# salometools logger classes
+#################################################################
+
+try:
+  unicode
+  _unicode = True
+except NameError:
+  _unicode = False
+
+
+def getMessage(self):
+  """
+  modified from logging.__init__.LogRecord.getMessage,
+  better message on format error
+  Return the message for this LogRecord.
+
+  Return the message for this LogRecord after merging any user-supplied
+  arguments with the message.
+  """
+  if not _unicode:  # if no unicode support...
+    msg = str(self.msg)
+  else:
+    msg = self.msg
+    if not isinstance(msg, basestring):
+      try:
+        msg = str(self.msg)
+      except UnicodeError:
+        msg = self.msg  # Defer encoding till later
+  if self.args:
+    try:  # better message on format error
+      msg = msg % self.args
+    except Exception as e:
+      msg = "ERROR: %s with args %s" % (msg, PP.pformat(self.args))
+      log(msg, True)
+  return msg
+
+
+LOGI.LogRecord.getMessage = getMessage  # better message if error
+
+
+#################################################################
+class LoggerSimple(LOGI.Logger):
+  """
+  Inherited class logging.Logger for logger salomeTools
+
+  | add a level STEP as log.step(msg)
+  | add a level TRACE as log.trace(msg)
+  | below log.info(msg)
+  | above log.debug(msg)
+  | to assume message step inside files xml 'command's internal traces'
+  | to assume store long log asci in files txt outside files xml
+  |
+  | see: /usr/lib64/python2.7/logging/__init__.py etc.
+  """
+
+  def __init__(self, name, level=LOGI.INFO):
+    """
+    Initialize the logger with a name and an optional level.
+    """
+    super(LoggerSimple, self).__init__(name, level)
+    LOGI.addLevelName(_STEP, "STEP")
+    LOGI.addLevelName(_TRACE, "TRACE")
+    self.dateLogger = "NoDateLogger"
+    self.dateHour = None  # datehour of main command
+    self.isClosed = False
+    self.STEP = _STEP
+    self.TRACE = _TRACE
+
+  def close(self):
+    """
+    final stuff for logger, done at end salomeTools
+    flushed and closed xml files have to be not overriden/appended
+    """
+    if self.isClosed:
+      raise Exception("logger closed yet: %s" % self)
+    log("close stuff logger %s" % self)  # getStrDirLogger(self)
+    for handl in list(self.handlers):  # get original list
+      log("close stuff handler %s" % getStrHandler(handl))
+      handl.close()  # Tidy up any resources used by the handler.
+      self.removeHandler(handl)
+    # todo etc
+    self.isClosed = True  # done at end of execution
+    return
+
+  def __repr__(self):
+    """one line string representation"""
+    msg = "%s(name=%s, dateLogger=%s, handlers=%s)"
+    cName = self.__class__.__name__
+    h = [getStrHandler(h) for h in self.handlers]
+    h = "[" + ", ".join(h) + "]"
+    res = msg % (cName, self.name, self.dateLogger, h)
+    return res
+
+  def trace(self, msg, *args, **kwargs):
+    """
+    Log 'msg % args' with severity '_TRACE'.
+    """
+    log("trace stuff logger '%s' msg '%s...'" % (self.name, getStrShort(msg)))
+    if self.isEnabledFor(_TRACE):
+      self._log(_TRACE, msg, args, **kwargs)
+
+  def step(self, msg, *args, **kwargs):
+    """
+    Log 'msg % args' with severity '_STEP'.
+    """
+    log("step stuff logger '%s' msg '%s...'" % (self.name, getStrShort(msg)))
+    if self.isEnabledFor(_STEP):
+      self._log(_STEP, msg, args, **kwargs)
+
+  def setLevelMainHandler(self, level):
+    handl =  self.handlers[0]  # get main handler
+    log("setLevelMainHandler %s" % level)
+    handl.setLevel(level)
+
+
+#################################################################
+class UnittestFormatter(LOGI.Formatter):
+  """
+  this formatter prefixes level name and indents all messages
+  """
+  def format(self, record):
+    # print "", record.levelname #type(record), dir(record)
+    # nb = len("2018-03-17 12:15:41 :: INFO     :: ")
+    res = super(UnittestFormatter, self).format(record)
+    res = indentUnittest(res)
+    return res
+
+#################################################################
+class DefaultFormatter(LOGI.Formatter):
+  """
+  this formatter prefixes level name and indents all messages but INFO stay "as it"
+  """
+  def format(self, record):
+    # print "", record.levelname #type(record), dir(record)
+    # nb = len("2018-03-17 12:15:41 :: INFO     :: ")
+    if record.levelname == "INFO":
+      res = record.getMessage()
+    else:
+      res = super(DefaultFormatter, self).format(record)
+      res = indentUnittest(res)
+    return res
+
+
+#################################################################
+class UnittestStream(object):
+  """
+  write my stream class
+  only write and flush are used for the streaming
+
+  | https://docs.python.org/2/library/logging.handlers.html
+  | https://stackoverflow.com/questions/31999627/storing-logger-messages-in-a-string
+  """
+
+  def __init__(self):
+    self._logs = ''
+
+  def getLogs(self):
+    return self._logs
+
+  def getLogsAndClear(self):
+    res = self._logs
+    self._logs = ''
+    return res
+
+  def write(self, astr):
+    """final method called when message is logged"""
+    # log("UnittestStream.write('%s')" % astr, True) # for debug ...
+    self._logs += astr
+
+  def flush(self):
+    pass
+
+  def __str__(self):
+    return self._logs
+
+
+#################################################################
+class StreamHandlerSimple(LOGI.StreamHandler):
+  """
+  A handler class which writes logging records, appropriately formatted,
+  to a stream. Note that this class does not close the stream, as
+  sys.stdout or sys.stderr may be used.
+
+  from logging.StreamHandler class,
+  modified for 'no return' mode line if '...' at end of record message
+  """
+
+  def emit(self, record):
+    """
+    Emit a record.
+
+    If a formatter is specified, it is used to format the record.
+    The record is then written to the stream with a trailing newline.  If
+    exception information is present, it is formatted using
+    traceback.print_exception and appended to the stream.  If the stream
+    has an 'encoding' attribute, it is used to determine how to do the
+    output to the stream.
+    """
+    # log("StreamHandlerSimple.emit('%s')" % record, True) # for debug ...
+    try:
+      msg = self.format(record)
+      stream = self.stream
+      fs = '%s\n'
+      ufs = u'%s\n'
+      if not _unicode:  # if no unicode support...
+        stream.write(fs % msg)
+      else:
+        try:
+          if (isinstance(msg, unicode) and
+            getattr(stream, 'encoding', None)):
+            # ufs = u'%s\n'
+            try:
+              stream.write(ufs % msg)
+            except UnicodeEncodeError:
+              # Printing to terminals sometimes fails. For example,
+              # with an encoding of 'cp1251', the above write will
+              # work if written to a stream opened or wrapped by
+              # the codecs module, but fail when writing to a
+              # terminal even when the codepage is set to cp1251.
+              # An extra encoding step seems to be needed.
+              stream.write((ufs % msg).encode(stream.encoding))
+          else:
+            stream.write(fs % msg)
+        except UnicodeError:
+          stream.write(fs % msg.encode("UTF-8"))
+      self.flush()
+    except (KeyboardInterrupt, SystemExit):
+      raise
+    except:
+      self.handleError(record)
+
+
+
+#################################################################
+# methods to define two LoggerSimple instances in salomeTools,
+# no more need
+#################################################################
+def initLoggerAsDefault(logger, fmt=None, level=None):
+  """
+  init logger as prefixed message and indented message if multi line
+  exept info() outed 'as it' without any format.
+  level could be modified during execution
+  """
+  log("initLoggerAsDefault name=%s\nfmt='%s' level='%s'" % (logger.name, fmt, level))
+  #handler = StreamHandlerSimple(sys.stdout)  # Logging vers console
+  handler = LOGI.StreamHandler(sys.stdout)  # Logging vers console
+  handler.set_name(logger.name + "_console")
+  if fmt is not None:
+    # formatter = UnittestFormatter(fmt, "%y-%m-%d %H:%M:%S")
+    formatter = DefaultFormatter(fmt, "%y-%m-%d %H:%M:%S")
+    handler.setFormatter(formatter)
+  handler.idCommandHandlers = 0
+  logger.addHandler(handler)
+  # as RootLogger is level WARNING
+  # my logger is not notset but low, handlers needs setlevel greater
+  logger.setLevel(LOGI.DEBUG)
+  # import src/debug as DBG
+  # tmp = (logger.getEffectiveLevel(), LOGI.NOTSET, logger.level, logger.parent.level)
+  # DBG.write("logger levels tmp, True)
+  if level is not None:  # level could be modified during execution
+    handler.setLevel(level)  # on screen log as user wants
+  else:
+    handler.setLevel(LOGI.STEP)  # on screen no log step, which are in xml files
+  return
+
+
+def initLoggerAsUnittest(logger, fmt=None, level=None):
+  """
+  init logger as silent on stdout/stderr
+  used for retrieve messages in memory for post execution unittest
+  https://docs.python.org/2/library/logging.handlers.html
+  """
+  log("initLoggerAsUnittest name=%s\nfmt='%s' level='%s'" % (logger.name, fmt, level))
+  stream = UnittestStream()
+  handler = LOGI.StreamHandler(stream)  # Logging vers stream
+  handler.set_name(logger.name + "_unittest")
+  if fmt is not None:
+    # formatter = LOGI.Formatter(fmt, "%Y-%m-%d %H:%M:%S")
+    formatter = UnittestFormatter(fmt, "%Y-%m-%d %H:%M:%S")
+    handler.setFormatter(formatter)
+  handler.idCommandHandlers = 0
+  logger.addHandler(handler)
+  logger.stream = stream
+  logger.getLogs = stream.getLogs
+  logger.getLogsAndClear = stream.getLogsAndClear
+  if level is not None:
+    logger.setLevel(level)
+  else:
+    logger.setLevel(LOGI.DEBUG)
+
+
+def getDefaultLogger():
+  log("getDefaultLogger %s" % _loggerDefaultName)
+  # case multithread may be problem as not LOGI._acquireLock()
+  previousClass = LOGI._loggerClass
+  LOGI.setLoggerClass(LoggerSimple)  # to get LoggerSimple instance with trace etc.
+  res = LOGI.getLogger(_loggerDefaultName)
+  LOGI.setLoggerClass(previousClass)
+  return res
+
+
+def getUnittestLogger():
+  log("getUnittestLogger %s" % _loggerUnittestName)
+  # case multithread may be problem as not LOGI._acquireLock()
+  previousClass = LOGI._loggerClass
+  LOGI.setLoggerClass(LoggerSimple)  # to get LoggerSimple instance with trace etc.
+  res = LOGI.getLogger(_loggerUnittestName)
+  LOGI.setLoggerClass(previousClass)
+  return res
+
+
+#################################################################
+# small tests as demonstration, see unittest also
+#################################################################
+def testLogger_2(logger):
+  """small test"""
+  # print getStrDirLogger(logger)
+  logger.debug('test logger debug')
+  logger.trace('test logger trace')
+  logger.info('test logger info')
+  logger.warning('test logger warning')
+  logger.error('test logger error')
+  logger.critical('test logger critical')
+  logger.info('\ntest logger info:\n- second line\n- third line\n')
+  logger.warning('test logger warning:\n- second line\n- third line')
+
+def testMain_2():
+  print("\n**** DEFAULT logger")
+  logdef = getDefaultLogger()
+  # use of setColorLevelname <color>...<reset>, so do not use %(levelname)-8s
+  initLoggerAsDefault(logdef, '%(levelname)-8s :: %(message)s', level=LOGI.DEBUG)
+  testLogger_2(logdef)
+
+  print("\n**** UNITTEST logger")
+  loguni = getUnittestLogger()
+  initLoggerAsUnittest(loguni, '%(asctime)s :: %(levelname)-8s :: %(message)s', level=LOGI.DEBUG)
+  testLogger_2(loguni)  # is silent
+  # log("loguni.getLogs():\n%s" % loguni.getLogs())
+  print("loguni.streamUnittest:\n%s" % loguni.getLogs())
+
+
+#################################################################
+# in production, or not (if __main__)
+#################################################################
+if __name__ == "__main__":
+  # for example, not in production
+  # get path to salomeTools sources
+  curdir = os.path.dirname(os.path.dirname(__file__))
+  # Make the src & commands package accessible from all code
+  sys.path.insert(0, curdir)
+  testMain_2()
+  # here we have sys.exit()
+else:
+  # in production
+  # get two LoggerSat instance used in salomeTools, no more needed.
+  _loggerDefault = getDefaultLogger()
+  _loggerUnittest = getUnittestLogger()
+  initLoggerAsDefault(_loggerDefault, '%(levelname)-8s :: %(message)s')
+  initLoggerAsUnittest(_loggerUnittest, '%(asctime)s :: %(levelname)s :: %(message)s')
old mode 100644 (file)
new mode 100755 (executable)
index 2cfeae0..b84eae1
 #  You should have received a copy of the GNU Lesser General Public
 #  License along with this library; if not, write to the Free Software
 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-'''The Options class that manages the access to all options passed as 
-   parameters in salomeTools command lines
-'''
+
+"""
+The Options class that manages the access to all options passed as 
+parameters in salomeTools command lines
+"""
+
 import getopt
 import sys
+import pprint as PP
+
 from . import printcolors
 
+import src
+import src.debug as DBG # Easy print stderr (for DEBUG only)
+
 class OptResult(object):
-    '''An instance of this class will be the object manipulated
-       in code of all salomeTools commands
-       The aim of this class is to have an elegant syntax 
-       to manipulate the options. 
-       ex: 
-       print(options.level)
-       5
-    '''
+    """
+    An instance of this class will be the object manipulated
+    in code of all salomeTools commands
+    The aim of this class is to have an elegant syntax to manipulate the options.
+    
+    | Example:        
+    | >> options, remainderArgs = command.parseArguments(args)
+    | >> print(options.output_verbose_level)
+    | >> 'INFO'
+    """
     def __init__(self):
-        '''Initialization
-        '''
+        """Initialization
+        """
         self.__dict__ = dict()
 
     def __getattr__(self, name):
-        '''Overwrite of the __getattr__ function 
-           to customize it for option usage
+        """
+        Overwrite of the __getattr__ function 
+        to customize it for option usage
         
-        :param name str: The attribute to get the value.
-        :return: the value corresponding to the attribute.
-        :rtype: str,int,list,boolean
-        '''
+        :param name: (str) The attribute to get the value.
+        :return: (str int list boolean level)
+          the value corresponding to the attribute.
+        """
         if name in self.__dict__:
             return self.__dict__[name]
         else:
-            raise AttributeError(name + _(u" is not a valid option"))
+            raise AttributeError("--" + name + _(u" is not a valid option"))
 
     def __setattr__(self, name, value):
-        '''Overwrite of the __setattr__ function 
-           to customize it for option usage
+        """
+        Overwrite of the __setattr__ function 
+        to customize it for option usage
         
-        :param name str: The attribute to set.
-        :param value str: The value  corresponding to the attribute.
-        :return: Nothing.
-        :rtype: N\A
-        '''
-        object.__setattr__(self,name,value)
-
-class Options:
-    '''Class to manage all salomeTools options
-    '''
+        :param name: (str) The attribute to set.
+        :param value: (str) The value  corresponding to the attribute.
+        :return: None
+        """
+        object.__setattr__(self, name, value)
+
+    def __repr__(self):
+        aStr = PP.pformat(self.__dict__)
+        res = "%s(\n %s\n)" % (self.__class__.__name__, aStr[1:-1])
+        return res
+
+class Options(object):
+    """
+    Class to manage all salomeTools options
+    """
     def __init__(self):
-        '''Initialization
-        '''
+        """Initialization
+        """
         # The options field stocks all options of a command 
         # in a list that contains dicts
         self.options = []
         # The list of available option type
-        self.availableOptions = ["boolean", "string", "int", "float",
-                                  "long", "list", "list2"]
+        self.availableOptions = "noboolean boolean string int float long list list2 level".split()
+        self.noArgOptions = "noboolean boolean".split()
         self.default = None
+        self.results = {}
 
-    def add_option(self, shortName, longName,
-                    optionType, destName, helpString="", default = None):
-        '''Method to add an option to a command. It gets all attributes
-           of an option and append it in the options field
+    def add_option(self, shortName, longName, optionType, destName, helpString="", default=None):
+        """
+        Add an option to a command. It gets all attributes
+        of an option and append it in the options field
         
-        :param shortName str: The short name of the option
-                              (ex "l" for level option).
-        :param longName str: The long name of the option 
-                             (ex "level" for level option).
-        :param optionType str: The type of the option (ex "int").
-        :param destName str: The name that will be used in the code.
-        :param helpString str: The text to display 
-                               when user ask for help on a command.     
-        :return: Nothing.
-        :rtype: N\A
-        '''
+        :param shortName: (str) 
+          The short name of the option (as '-l' for level option).
+        :param longName: (str) 
+          The long name of the option (as '--level' for level option).
+        :param optionType: (str) The type of the option (ex "int").
+        :param destName: (str) The name that will be used in the code.
+        :param helpString: (str) 
+          The text to display when user ask for help on a command.     
+        :return: None
+        """
+        tmp = [o['shortName'] for o in self.options if o['shortName'] != '']
+        if shortName in tmp: 
+          raise Exception("option '-%s' existing yet" % shortName)
+        tmp = [o['longName'] for o in self.options if o['longName'] != '']
+        if longName in tmp: 
+          raise Exception("option '--%s' existing yet" % longName)
+
         option = dict()
         option['shortName'] = shortName
         option['longName'] = longName
 
         if optionType not in self.availableOptions:
-            print("error optionType", optionType, "not available.")
-            sys.exit(-1)
+          raise Exception("error optionType '%s' not available." % optionType)
 
         option['optionType'] = optionType
         option['destName'] = destName
         option['helpString'] = helpString
         option['result'] = default
+        
         self.options.append(option)
+        
+    def getDetailOption(self, option):
+        """
+        for convenience 
+        
+        :return: (tuple) 4-elements (shortName, longName, optionType, helpString)
+        """
+        oos = option['shortName']
+        ool = option['longName']
+        oot = option['optionType']
+        ooh = option['helpString']
+        return (oos, ool, oot, ooh)
 
-    def print_help(self):
-        '''Method that display all options stored in self.options and there help
+    def get_help(self):
+        """
+        Returns all options stored in self.options 
+        as help message colored string
         
-        :return: Nothing.
-        :rtype: N\A
-        '''
+        :return: (str) colored string
+        """
+        msg = ""
         # Do nothing if there are no options
-        if len(self.options) == 0:
-            return
 
-        # for all options, print its values. 
-        # "shortname" is an optional field of the options 
-        print(printcolors.printcHeader(_("Available options are:")))
+        #there is -h option, always
+        #if len(self.options) == 0:
+        #    return _("No available options.")
+
+        # for all options, gets its values. 
+        # "shortname" is an mandatory field of the options, could be '' 
+        msg += printcolors.printcHeader(_("Available options are:"))
         for option in self.options:
-            if 'shortName' in option and len(option['shortName']) > 0:
-                print(" -%(shortName)1s, --%(longName)s"
-                      " (%(optionType)s)\n\t%(helpString)s\n" % option)
+            oos, ool, oot, ooh = self.getDetailOption(option)
+            if len(oos) > 0:
+                msg += "\n -%1s, --%s (%s)\n" % (oos, ool, oot)
             else:
-                print(" --%(longName)s (%(optionType)s)\n\t%(helpString)s\n"
-                       % option)
+                msg += "\n --%s (%s)\n" % (ool, oot)
+                
+            msg += "%s\n" % self.indent(ooh, 10)
+        return msg
 
+    def indent(self, text, amount, car=" "):
+        """indent multi lines message"""
+        padding = amount * car
+        return ''.join(padding + line for line in text.splitlines(True))
+               
     def parse_args(self, argList=None):
-        '''Method that instantiates the class OptResult 
-           that gives access to all options in the code
+        """
+        Instantiates the class OptResult 
+        that gives access to all options in the code
         
-        :param argList list: the raw list of arguments that were passed
-        :return: optResult, args : optResult is the option instance 
-                                   to manipulate in the code. args 
-                                   is the full raw list of passed options 
-        :rtype: (class 'common.options.OptResult',list)
-        '''
+        :param argList: (list) the raw list of arguments that were passed
+        :return: (OptResult, list) as (optResult, args) 
+          optResult is the option instance to manipulate in the code. 
+          args is the full raw list of passed options 
+        """
+        # see https://pymotw.com/2/getopt/
         if argList is None:
             argList = sys.argv[1:]
         
+        DBG.write("parse_args", argList)
+        # DBG.write("options", self.options)
         # format shortNameOption and longNameOption 
         # to make right arguments to getopt.getopt function
         shortNameOption = ""
         longNameOption = []
         for option in self.options:
             shortNameOption = shortNameOption + option['shortName']
-            if option['shortName'] != "" and option['optionType'] != "boolean":
+            if option['shortName'] != "" and option['optionType'] not in self.noArgOptions:
                 shortNameOption = shortNameOption + ":"
 
             if option['longName'] != "":
-                if option['optionType'] != "boolean":
+                if option['optionType'] not in self.noArgOptions:
                     longNameOption.append(option['longName'] + "=")
                 else:
                     longNameOption.append(option['longName'])
 
         # call to getopt.getopt function to get the option 
         # passed in the command regarding the available options
-        optlist, args = getopt.getopt(argList, shortNameOption, longNameOption)
-        
+        try:
+          optlist, args = getopt.getopt(argList, shortNameOption, longNameOption)
+        except Exception as e:
+          msg = str(e) + " on '%s'\n\n" % " ".join(argList) + self.get_help()
+          raise Exception(msg)
+
         # instantiate and completing the optResult that will be returned
         optResult = OptResult()
         for option in self.options:
@@ -169,6 +223,8 @@ class Options:
                         option['result'] = opt[1]
                     elif optionType == "boolean":
                         option['result'] = True
+                    elif optionType == "noboolean":
+                        option['result'] = False
                     elif optionType == "int":
                         option['result'] = int(opt[1])
                     elif optionType == "float":
@@ -179,18 +235,67 @@ class Options:
                         if option['result'] is None:
                             option['result'] = list()
                         option['result'].append(opt[1])
+                    elif optionType == "level": #logger logging levels
+                        option['result'] = self.filterLevel(opt[1])
                     elif optionType == "list2":
                         if option['result'] is None:
                             option['result'] = list()
-                        if opt[1].find(",") == -1:
-                            option['result'].append(opt[1])
-                        else:
-                            elts = filter(lambda l: len(l) > 0, opt[1].split(","))
-                            option['result'].extend(elts)
+                        option['result'] = self.filterList2(opt[1])
 
             optResult.__setattr__(option['destName'], option['result'])
             # free the option in order to be able to make 
             # a new free call of options (API case)
             option['result'] = None
+
+        self.results = {"optlist": optlist, "optResult": optResult, "args": args, "argList": argList}
+        DBG.write("results", self.results)
         return optResult, args
+        
+    def filterLevel(self, aLevel):
+      """filter level logging values"""
+      import src.loggingSat as LOG
+      aLev = aLevel.upper()
+      knownLevels = LOG._knownLevels
+      maxLen = max([len(i) for i in knownLevels])
+      for i in range(maxLen):
+        for lev in knownLevels:
+          if aLev == lev[:i]:
+            DBG.write("filterLevel", "%s -> %s" % (aLevel, lev)) 
+            return lev
+      msg = "Unknown level '%s', accepted are:\n%s" % (aLev, ", ".join(knownLevels))
+      raise Exception(msg)
+      
+    def filterList2(self, aStr):
+      """filter a list as 'KERNEL,YACS,etc.'"""
+      aList = aStr.strip().split(",")
+      # fix list leading ',' as ',KERNEL,...'
+      aList = [i for i in aList if i != ""] # split old list leadin "," as ",KERNEL,ETC..."
+      return aList
+      
+
+    def __repr__(self): 
+        """
+        repr for only self.options and self.results (if present)
+        """
+        aDict = {'options': self.options, 'results': self.results}
+        aStr = PP.pformat(aDict)
+        res = "%s(\n %s\n)" % (self.__class__.__name__, aStr[1:-1])
+        return res
+        
+    def __str__(self): 
+        """
+        str for only resume expected self.options
+        """
+        #aDict = [(k["longName"], k["shortName", k["helpString"]) for k in self.options}
+        #aList = [(k, self.options[k]) for k in sorted(self.options.keys())]
+        aDict = {}
+        for o in self.options:
+          aDict[o["longName"]] = (o["shortName"], o["helpString"])
+        aStr = PP.pformat(aDict)
+        res = "%s(\n %s)" % (self.__class__.__name__, aStr[1:-1])
+        return res
+        
+    def debug_write(self):
+        DBG.write("options and results", self, True)
+
 
diff --git a/src/returnCode.py b/src/returnCode.py
new file mode 100644 (file)
index 0000000..1af9116
--- /dev/null
@@ -0,0 +1,234 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2018-20xx  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+"""
+This file contains ReturnCode class
+
+| Usage:
+| >> import returnCode as RCO
+"""
+
+import pprint as PP
+
+# global module variable
+_OK_STATUS = "OK"
+_KO_STATUS = "KO"
+_NA_STATUS = "NA" # not applicable
+_UNKNOWN_STATUS = "ND" # not defined
+_KNOWNFAILURE_STATUS = "KF"
+_TIMEOUT_STATUS = "TIMEOUT"
+
+#####################################################
+class ReturnCode(object):
+  """
+  assume simple return code for methods, with explanation as 'why'.
+  Obviously why is 'why it is not OK', 
+  but also why is 'why it is OK' (if you want). 
+  Optionaly contains a return value as self.getValue()
+  
+  | Usage:
+  | >> import returnCode as RCO
+  | 
+  | >> aValue = doSomethingToReturn()
+  | >> return RCO.ReturnCode("KO", "there is no problem here", aValue)
+  | >> return RCO.ReturnCode("KO", "there is a problem here because etc", None)
+  | >> return RCO.ReturnCode("TIMEOUT_STATUS", "too long here because etc")
+  | >> return RCO.ReturnCode("NA", "not applicable here because etc")
+  | 
+  | >> rc = doSomething()
+  | >> print("short returnCode string", str(rc))
+  | >> print("long returnCode string with value", repr(rc))
+  | 
+  | >> rc1 = RCO.ReturnCode("OK", ...)
+  | >> rc2 = RCO.ReturnCode("KO", ...)
+  | >> rcFinal = rc1 + rc2
+  | >> print("long returnCode string with value", repr(rcFinal)) # KO!
+  | 
+  | >> rc = doSomething()
+  | >> if rc.isOk(): doSomethingAsOK()
+  | >> if not rc.isOk(): doSomethingAsKO()
+  | 
+  | >> rc = doSomething().raiseIfKo() # raise Exception if KO
+  | >> doSomethingWithValue(rc.getValue()) # here i am sure that is OK
+  """
+
+  # redunctant but useful class variables
+  OK_STATUS = _OK_STATUS
+  KO_STATUS = _KO_STATUS
+  NA_STATUS = _NA_STATUS # not applicable
+  UNKNOWN_STATUS = _UNKNOWN_STATUS # not defined
+  KNOWNFAILURE_STATUS = _KNOWNFAILURE_STATUS
+  TIMEOUT_STATUS = _TIMEOUT_STATUS
+
+  # an integer for sys.exit(anInteger)
+  # OKSYS and KOSYS seems equal on linux or windows
+  OKSYS = 0  # OK 
+  KOSYS = 1  # KO
+  NASYS = 2  # KO not applicable return code
+  NDSYS = 3  # KO not defined return code
+  KFSYS = 4  # KO known failure return code
+  TOSYS = 5  # KO time out
+  
+  _TOSYS = { 
+    OK_STATUS: OKSYS,
+    KO_STATUS: KOSYS,
+    NA_STATUS: NASYS,
+    UNKNOWN_STATUS: NDSYS,
+    KNOWNFAILURE_STATUS: KFSYS,
+    TIMEOUT_STATUS: TOSYS, 
+  }
+  _DEFAULT_WHY = "No given explanation"
+  _DEFAULT_VALUE = None
+
+  def __init__(self, status=None, why=None, value=None):
+    self._why = self._DEFAULT_WHY 
+    self._value = self._DEFAULT_VALUE
+    if status is None:
+      self._status = self.UNKNOWN_STATUS
+    else:
+      self.setStatus(status, why, value)
+    
+  def __repr__(self):
+    """complete with value, 'ok, why, value' message"""
+    res = '%s: %s --value: %s' % (self._status, self._why, PP.pformat(self._value))
+    return res
+  
+  def __str__(self):
+    """without value, only simple 'ok, why' message"""
+    res = '%s: %s' % (self._status, self._why)
+    return res
+
+  def indent(self, text, amount=5, ch=' '):
+    """indent multi lines message"""
+    padding = amount * ch
+    res = ''.join(padding + line for line in text.splitlines(True))
+    return res[amount:]
+
+  def __add__(self, rc2):
+    """allows expression 'returnCode1 + returnCode2 + ...' """
+    isOk = self.isOk() and rc2.isOk()
+    newWhy = self._toList(self.getWhy()) + self._toList(rc2.getWhy())
+    newValue = self._toList(self.getValue()) + self._toList(rc2.getValue())    
+    if isOk: 
+      return ReturnCode("OK", newWhy, newValue)
+    else:
+      return ReturnCode("KO", newWhy, newValue)
+    
+  def __radd__(self, other):
+    # see http://www.marinamele.com/2014/04/modifying-add-method-of-python-class.html
+    if other == 0:
+      return self
+    else:
+      return self.__add__(other) 
+    
+  def _toList(self, strOrList):
+    """internal use"""
+    if type(strOrList) is not list: 
+      return [strOrList]
+    else:
+      return strOrList
+
+  def toSys(self):
+    """return system return code as bash or bat"""
+    try:
+      return self._TOSYS[self._status]
+    except:
+      return self._TOSYS[self.NA_STATUS]
+
+  def toXmlPassed(self):
+    """return xml  return code as '0' (passed) or '1' (not passed)"""
+    if self.isOk(): 
+      return "0"
+    else:
+      return "1"
+    
+  def getWhy(self):
+    """return why as str or list if sum or some ReturnCode"""
+    return self._why
+    
+  def setWhy(self, why):
+    self._why = why
+    
+  def getValue(self):
+    return self._value
+    
+  def setValue(self, value):
+    """choice as not deep copying if mutables value"""
+    # TODO deepcopy maybe for value, not yet
+    self._value = value
+    
+  def setStatus(self, status, why=None, value=None):
+    if why is None: 
+      aWhy = self._DEFAULT_WHY
+    else:
+      aWhy = why
+      
+    if status in self._TOSYS.keys():
+      self._status = status
+      self._why = aWhy
+    else:
+      self._status = self.NA_STATUS
+      self._why = "Error status '%s' for '%s'" % (status, aWhy)
+      
+    if value is not None:
+      # TODO deepcopy maybe for value, not yet
+      self._value = value
+    else:
+      self._value = self._DEFAULT_VALUE
+      
+  def getStatus(self):
+    return self._status
+
+  def isOk(self):
+    """
+    return True if ok.
+    inexisting method isKo(), use more explicit/readability 'if not res.isOk()'
+    """
+    return (self._status == self.OK_STATUS)
+  
+  def raiseIfKo(self):
+    """
+    raise an exception with message why if not ok, else return self.
+    This trick is to write usage
+    
+    | Usage:
+    | >> rc = doSomething().raiseIfKo() # raise Exception if KO
+    | >> doSomethingWithValue(rc.getValue()) # here i am sure that is OK
+    """
+    if self.isOk(): 
+      return self
+    else:
+      raise Exception(self.getWhy())
+
+def ReturnCodeFromList(aListOfReturnCodes):
+  """
+  Create ReturnCode from list of ReturnCode
+  
+  convenience over "+" operand
+  """
+  res = "OK"
+  whyes = []
+  for rc in aListOfReturnCodes:
+    if not rc.isOk():
+      res = "KO"
+    whyes.append(str(rc))
+  reswhy = "\n  ".join(whyes)
+  return ReturnCode(res, "\n  " + reswhy)
+    
+    
\ No newline at end of file
diff --git a/src/salomeTools.py b/src/salomeTools.py
new file mode 100755 (executable)
index 0000000..ef3857e
--- /dev/null
@@ -0,0 +1,732 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+#  Copyright (C) 2010-2012  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+"""
+This file is the main API file for salomeTools
+
+| Warning: NO '__main__ ' call allowed,
+|          Use 'sat' (in parent directory)
+|
+| Usage: see file ../sat
+"""
+
+import sys
+
+# exit OKSYS and KOSYS seems equal on linux or windows
+_OKSYS = 0  # OK
+_KOSYS = 1  # KO
+
+########################################################################
+# NO __main__ entry allowed, use sat
+########################################################################
+if __name__ == "__main__":
+    msg = """
+ERROR: 'salomeTools.py' is not main command entry (CLI) for salomeTools.
+       Use 'sat' instead.\n\n"""
+    sys.stderr.write(msg)
+    sys.exit(_KOSYS)
+
+# python imports
+import os
+import re
+import tempfile
+import imp
+import types
+import gettext
+import traceback
+
+import src
+import src.debug as DBG # Easy print stderr (for DEBUG only)
+import src.returnCode as RCO # Easy (ok/ko, why) return methods code
+import src.utilsSat as UTS
+
+# get path to salomeTools sources
+satdir  = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+srcdir = os.path.join(satdir, 'src')
+cmdsdir = os.path.join(satdir, 'commands')
+
+import commands.config as CONFIG
+
+# load resources for internationalization
+gettext.install("salomeTools", os.path.join(srcdir, "i18n"))
+
+_LANG = os.environ["LANG"] # original locale
+
+# The possible hooks : 
+# pre is for hooks to be executed before commands
+# post is for hooks to be executed after commands
+C_PRE_HOOK = "pre"
+C_POST_HOOK = "post"
+
+# Define all possible option for salomeTools command :  sat <option> <args>
+parser = src.options.Options()
+parser.add_option('h', 'help', 'boolean', 'help', 
+                  _("shows global help or help on a specific command."))
+parser.add_option('o', 'overwrite', 'list', "overwrite", 
+                  _("overwrites a configuration parameters."))
+parser.add_option('g', 'debug', 'boolean', 'debug_mode', 
+                  _("run salomeTools in debug mode."))
+parser.add_option('v', 'verbose', 'int', "output_verbose_level", 
+                  _("change output verbose level (default is 3)."))
+parser.add_option('b', 'batch', 'boolean', "batch", 
+                  _("batch mode (no question)."))
+parser.add_option('t', 'all_in_terminal', 'boolean', "all_in_terminal", 
+                  _("All traces in the terminal (for example compilation logs)."))
+parser.add_option('l', 'logs_paths_in_file', 'string', "logs_paths_in_file", 
+                  _("Put the command result and paths to log files in ."))
+
+
+########################################################################
+# utility methods
+########################################################################
+def find_command_list(dirPath):
+    ''' Parse files in dirPath that end with .py : it gives commands list
+    
+    :param dirPath str: The directory path where to search the commands
+    :return: cmd_list : the list containing the commands name 
+    :rtype: list
+    '''
+    cmd_list = []
+    for item in os.listdir(dirPath):
+        if "__init__" in item: continue # skip __init__.py
+        if item.endswith('.py'):
+            cmd_list.append(item[:-len('.py')])
+    return cmd_list
+
+
+# The list of valid salomeTools commands from cmdsdir
+# ['config', 'compile', 'prepare', ...]
+_COMMANDS_NAMES = find_command_list(cmdsdir)
+lCommand = find_command_list(cmdsdir) # obsolete
+
+def getCommandsList():
+    """Gives commands list (as basename of files .py in directory commands""" 
+    return _COMMANDS_NAMES
+
+def launchSat(command, logger=None):
+    """
+    launch sat as subprocess.Popen
+    command as string ('sat --help' for example)
+    used for unittest, or else...
+    
+    :return: RCO.ReturnCode with getValue as subprocess.Popen output
+    """
+    if "sat" not in command.split()[0]:
+      raise Exception(_("Not a valid command for launchSat: '%s'") % command)
+    env = dict(os.environ) # copy
+    # theorically useless, in user environ $PATH,
+    # on ne sait jamais
+    # https://docs.python.org/2/library/os.html
+    # On some platforms, including FreeBSD and Mac OS X, 
+    # setting environ may cause memory leaks.
+    # see test/initializeTest.py
+    if satdir not in env["PATH"].split(":"):
+      env["PATH"] = satdir + ":" + env["PATH"]
+    # TODO setLocale not 'fr' on subprocesses, why not?
+    # env["LANG"] == ''
+    res = UTS.Popen(command, env=env, logger=logger) # logger or not.
+    return res
+
+def setNotLocale():
+    """force english at any moment"""
+    os.environ["LANG"] = ''
+    gettext.install("salomeTools", os.path.join(srcdir, "i18n"))
+    DBG.write("setNotLocale", os.environ["LANG"])
+    
+def setLocale():
+    """
+    reset initial locale at any moment 
+    'fr' or else (TODO) from initial environment var '$LANG'
+    'i18n' as 'internationalization'
+    """
+    os.environ["LANG"] = _LANG
+    gettext.install("salomeTools", os.path.join(srcdir, "i18n"))
+    DBG.write("setLocale", os.environ["LANG"])
+    
+def getVersion():
+    """get version number as string"""
+    return src.__version__
+def assumeAsList(strOrList):
+    """return a list as sys.argv if string"""
+    if type(strOrList) is list:
+      return list(strOrList) # copy
+    else:
+      res = strOrList.split(" ")
+      return [r for r in res if r != ""] # supposed string to split for convenience
+
+
+########################################################################
+# Sat class
+########################################################################
+class Sat(object):
+    """
+    The main class that stores all the commands of salomeTools
+    """
+    def __init__(self, logger=None):
+        """
+        Initialization
+
+        :param logger: The logger, if set from parent
+        """
+        # initialization of class attributes
+        self.__dict__ = dict()
+        # logger from parent
+        # future only one logger from src.loggingSimple at 2018/06
+        # to replace old loggers from src.logger
+        self.mainLogger = logger
+        src.logger.setCurrentLogger(logger)
+        self.cfg = None  # the config that will be read using pyconf module
+        self.arguments = None
+        self.remaindersArgs = None
+        self.options = None  # the options passed to salomeTools
+        self.datadir = None  # default value will be <salomeTools root>/data
+
+    def obsolete__init__(self, opt='', datadir=None):
+        '''Initialization
+
+        :param opt str: The sat options
+        :param: datadir str : the directory that contain all the external
+                              data (like software pyconf and software scripts)
+        '''
+        # Read the salomeTools options (the list of possible options is
+        # at the beginning of this file)
+        argList = self.assumeAsList(opt)
+        options, argus = parser.parse_args(argList)
+
+        # initialization of class attributes
+        self.__dict__ = dict()
+        self.cfg = None  # the config that will be read using pyconf module
+        self.arguments = argList
+        self.options = options  # the options passed to salomeTools
+        self.datadir = datadir  # default value will be <salomeTools root>/data
+        # set the commands by calling the dedicated function
+        self._setCommands(cmdsdir)
+
+        # if the help option has been called, print help and exit
+        if options.help:
+            try:
+                self.print_help(argus)
+                sys.exit(0)
+            except Exception as exc:
+                write_exception(exc)
+                sys.exit(1)
+
+    ##################################################################
+    def setInternals(self, opt=None, datadir=None):
+        """set the commands by calling the dedicated function etc..."""
+        options, remaindersArgs = parser.parse_args(opt)
+        self.arguments = opt
+        self.options = options # the generic options passed to salomeTools
+        self.remaindersArgs = remaindersArgs  # the command and their options
+        self.datadir = datadir # default value will be <salomeTools root>/data
+        self._setCommands(cmdsdir)
+
+    def getConfig(self):
+        return self.cfg
+
+    ##################################################################
+    def execute_cli(self, args):
+        """
+        assume launch command from args, pyconf config known yet
+        """
+        argList = self.assumeAsList(args)
+        # no arguments : print general help
+        if len(argList) == 0:
+          self.mainLogger.info(get_help())
+          return RCO.ReturnCode("OK", "no args as sat --help")
+
+        self.setInternals(opt=argList, datadir=None)
+
+        # print general help on -h
+        if self.options.help and len(self.remaindersArgs) == 0:
+          self.mainLogger.info(get_help())
+          return RCO.ReturnCode("OK", "help done")
+
+        DBG.write("options", self.options)
+        DBG.write("remaindersArgs", self.remaindersArgs)
+
+        if len(self.remaindersArgs) == 0:
+          return RCO.ReturnCode("KO", "Nothing to do")
+
+        # print command help on -h --help after name command
+        if "-h" in self.remaindersArgs or "--help" in self.remaindersArgs:
+          self.mainLogger.info(self.get_help(self.remaindersArgs))
+          return RCO.ReturnCode("OK", "sat --help command")
+
+        # print command help on -h and continue if something do do more
+        if self.options.help and len(self.remaindersArgs) >= 1:
+          self.mainLogger.info(self.get_help(self.remaindersArgs))
+
+        command = self.remaindersArgs[0]
+        # get dynamically the command function to call
+        fun_command = self.__getattr__(command)
+        # Run the command using the arguments
+        code = fun_command(self.remaindersArgs[1:])
+
+        if code is None: code = 0 # what?! do not know why so respect history
+
+        # return salomeTools command with the right message
+        # code (0 if no errors, else 1)
+        if code == _KOSYS:
+          return RCO.ReturnCode("KO", "problem on execute_cli 'sat %s'" % " ".join(argList))
+        else:
+          return RCO.ReturnCode("OK", "execute_cli 'sat %s' done" % " ".join(argList))
+
+    '''
+    # OBSOLETE... see file ../sat
+    # ###############################
+    # MAIN : terminal command usage #
+    # ###############################
+    if __name__ == "__main__":  
+        # Initialize the code that will be returned by the terminal command 
+        code = 0
+        (options, args) = parser.parse_args(sys.argv[1:])
+
+        # no arguments : print general help
+        if len(args) == 0:
+            print_help()
+            sys.exit(0)
+
+        # instantiate the salomeTools class with correct options
+        sat = Sat(sys.argv[1:])
+        # the command called
+        command = args[0]
+        # get dynamically the command function to call
+        fun_command = sat.__getattr__(command)
+        # Run the command using the arguments
+        code = fun_command(args[1:])
+
+        # exit salomeTools with the right code (0 if no errors, else 1)
+        if code is None: code = 0
+        sys.exit(code)
+
+    '''
+
+    def __getattr__(self, name):
+        '''
+        overwrite of __getattr__ function in order to display
+        a customized message in case of a wrong call
+        
+        :param name str: The name of the attribute 
+        '''
+        if name in self.__dict__:
+            return self.__dict__[name]
+        else:
+            raise AttributeError(name + _(" is not a valid command"))
+
+    def assumeAsList(self, strOrList):
+        # DBG.write("Sat assumeAsList", strOrList, True)
+        return assumeAsList(strOrList)
+    
+    def _setCommands(self, dirPath):
+        '''set class attributes corresponding to all commands that are 
+           in the dirPath directory
+        
+        :param dirPath str: The directory path containing the commands 
+        '''
+        # loop on the commands name
+        for nameCmd in lCommand:
+            DBG.write("load module command '%s.py'" % nameCmd, "")
+            # Exception for the jobs command that requires the paramiko module
+            if nameCmd == "jobs":
+                try:
+                    saveout = sys.stderr
+                    ff = tempfile.TemporaryFile()
+                    sys.stderr = ff
+                    import paramiko
+                    sys.stderr = saveout
+                except:
+                    sys.stderr = saveout
+                    continue
+
+            # load the module that has name nameCmd in dirPath
+            (file_, pathname, description) = imp.find_module(nameCmd, [dirPath])
+            module = imp.load_module(nameCmd, file_, pathname, description)
+            
+            def run_command(args='',
+                            options=None,
+                            batch = False,
+                            verbose = -1,
+                            logger_add_link = None):
+                '''
+                The function that will load the configuration (all pyconf)
+                and return the function run of the command corresponding to module
+                
+                :param args str: The arguments of the command 
+                '''
+                # Make sure the internationalization is available
+                gettext.install('salomeTools', os.path.join(satdir, 'src', 'i18n'))
+                
+                # Get the arguments in a list and remove the empty elements
+                if type(args) == type(''):
+                    # split by spaces without considering spaces in quotes
+                    argv_0 = re.findall(r'(?:"[^"]*"|[^\s"])+', args)
+                else:
+                    argv_0 = args
+                
+                if argv_0 != ['']:
+                    while "" in argv_0: argv_0.remove("")
+                
+                # Format the argv list in order to prevent strings 
+                # that contain a blank to be separated
+                argv = []
+                elem_old = ""
+                for elem in argv_0:
+                    if argv == [] or elem_old.startswith("-") or elem.startswith("-"):
+                        argv.append(elem)
+                    else:
+                        argv[-1] += " " + elem
+                    elem_old = elem
+                           
+                # if it is provided by the command line, get the application
+                appliToLoad = None
+                if argv not in [[''], []] and argv[0][0] != "-":
+                    appliToLoad = argv[0].rstrip('*')
+                    argv = argv[1:]
+                
+                # Check if the global options of salomeTools have to be changed
+                if options:
+                    options_save = self.options
+                    self.options = options  
+
+                # read the configuration from all the pyconf files    
+                cfgManager = CONFIG.ConfigManager()
+                self.cfg = cfgManager.get_config(datadir=self.datadir, 
+                                                 application=appliToLoad, 
+                                                 options=self.options, 
+                                                 command=__nameCmd__)
+                               
+                # Set the verbose mode if called
+                if verbose > -1:
+                    verbose_save = self.options.output_verbose_level
+                    self.options.__setattr__("output_verbose_level", verbose)    
+
+                # Set batch mode if called
+                if batch:
+                    batch_save = self.options.batch
+                    self.options.__setattr__("batch", True)
+
+                # set output level
+                if self.options.output_verbose_level is not None:
+                    self.cfg.USER.output_verbose_level = self.options.output_verbose_level
+                if self.cfg.USER.output_verbose_level < 1:
+                    self.cfg.USER.output_verbose_level = 0
+                silent = (self.cfg.USER.output_verbose_level == 0)
+
+                # create log file
+                micro_command = False
+                if logger_add_link:
+                    micro_command = True
+                logger_command = src.logger.Logger(self.cfg,
+                                   silent_sysstd=silent,
+                                   all_in_terminal=self.options.all_in_terminal,
+                                   micro_command=micro_command)
+                
+                # Check that the path given by the logs_paths_in_file option
+                # is a file path that can be written
+                if self.options.logs_paths_in_file and not micro_command:
+                    try:
+                        self.options.logs_paths_in_file = os.path.abspath(
+                                                self.options.logs_paths_in_file)
+                        dir_file = os.path.dirname(self.options.logs_paths_in_file)
+                        if not os.path.exists(dir_file):
+                            os.makedirs(dir_file)
+                        if os.path.exists(self.options.logs_paths_in_file):
+                            os.remove(self.options.logs_paths_in_file)
+                        file_test = open(self.options.logs_paths_in_file, "w")
+                        file_test.close()
+                    except Exception as e:
+                        msg = _("WARNING: the logs_paths_in_file option will "
+                                "not be taken into account.\nHere is the error:")
+                        logger_command.write("%s\n%s\n\n" % (
+                                             src.printcolors.printcWarning(msg),
+                                             str(e)))
+                        self.options.logs_paths_in_file = None
+                
+                options_launched = ""
+                res = None
+                try:
+                    # Execute the hooks (if there is any) 
+                    # and run method of the command
+                    self.run_hook(__nameCmd__, C_PRE_HOOK, logger_command)
+                    res = __module__.run(argv, self, logger_command)
+                    self.run_hook(__nameCmd__, C_POST_HOOK, logger_command)
+                    if res is None:
+                        res = 0
+                        
+                except Exception as e:
+                    # Get error
+                    logger_command.write("\n***** ", 1)
+                    logger_command.write(src.printcolors.printcError(
+                                                       "salomeTools ERROR:"), 1)
+                    logger_command.write("\n" + str(e) + "\n\n", 1)
+                    # get stack
+                    __, __, exc_traceback = sys.exc_info()
+                    fp = tempfile.TemporaryFile()
+                    traceback.print_tb(exc_traceback, file=fp)
+                    fp.seek(0)
+                    stack = fp.read()
+                    verbosity = 5
+                    if self.options.debug_mode:
+                        verbosity = 1
+                    logger_command.write("TRACEBACK: %s" % stack.replace('"',"'"),
+                                         verbosity)
+                finally:
+                    # set res if it is not set in the command
+                    if res is None:
+                        res = 1
+                                            
+                    # come back to the original global options
+                    if options:
+                        options_launched = get_text_from_options(self.options)
+                        self.options = options_save
+                    
+                    # come back in the original batch mode if 
+                    # batch argument was called
+                    if batch:
+                        self.options.__setattr__("batch", batch_save)
+
+                    # come back in the original verbose mode if 
+                    # verbose argument was called                        
+                    if verbose > -1:
+                        self.options.__setattr__("output_verbose_level", 
+                                                 verbose_save)
+                    # put final attributes in xml log file 
+                    # (end time, total time, ...) and write it
+                    launchedCommand = ' '.join([self.cfg.VARS.salometoolsway +
+                                                os.path.sep +
+                                                'sat',
+                                                options_launched,
+                                                __nameCmd__, 
+                                                ' '.join(argv_0)])
+                    # TODO may be no need as call escapeSequence xml
+                    launchedCommand = launchedCommand.replace('"', "'")
+                    
+                    # Add a link to the parent command      
+                    if logger_add_link is not None:
+                        logger_add_link.add_link(logger_command.logFileName,
+                                                 __nameCmd__,
+                                                 res,
+                                                 launchedCommand)
+                        logger_add_link.l_logFiles += logger_command.l_logFiles
+                                            
+                    # Put the final attributes corresponding to end time and
+                    # Write the file to the hard drive
+                    logger_command.end_write(
+                                        {"launchedCommand" : launchedCommand})
+                    
+                    if res != 0:
+                        res = 1
+                        
+                    # print the log file path if 
+                    # the maximum verbose mode is invoked
+                    if not micro_command:
+                        logger_command.write("\nPath to the xml log file :\n",
+                                             5)
+                        logger_command.write("%s\n\n" % src.printcolors.printcInfo(
+                                                logger_command.logFilePath), 5)
+
+                    # If the logs_paths_in_file was called, write the result
+                    # and log files in the given file path
+                    if self.options.logs_paths_in_file and not micro_command:
+                        file_res = open(self.options.logs_paths_in_file, "w")
+                        file_res.write(str(res) + "\n")
+                        for i, filepath in enumerate(logger_command.l_logFiles):
+                            file_res.write(filepath)
+                            if i < len(logger_command.l_logFiles):
+                                file_res.write("\n")
+                                file_res.flush()
+                
+                return res
+
+            # Make sure that run_command will be redefined 
+            # at each iteration of the loop
+            globals_up = {}
+            globals_up.update(run_command.__globals__)
+            globals_up.update({'__nameCmd__': nameCmd, '__module__' : module})
+            func = types.FunctionType(run_command.__code__,
+                                      globals_up,
+                                      run_command.__name__,
+                                      run_command.__defaults__,
+                                      run_command.__closure__)
+
+            # set the attribute corresponding to the command
+            self.__setattr__(nameCmd, func)
+
+    def run_hook(self, cmd_name, hook_type, logger):
+        '''Execute a hook file for a given command regarding the fact 
+           it is pre or post
+        
+        :param cmd_name str: The the command on which execute the hook
+        :param hook_type str: pre or post
+        :param logger Logger: the logging instance to use for the prints
+        '''
+        # The hooks must be defined in the application pyconf
+        # So, if there is no application, do not do anything
+        if not src.config_has_application(self.cfg):
+            return
+
+        # The hooks must be defined in the application pyconf in the
+        # APPLICATION section, hook : { command : 'script_path.py'}
+        if "hook" not in self.cfg.APPLICATION \
+                    or cmd_name not in self.cfg.APPLICATION.hook:
+            return
+
+        # Get the hook_script path and verify that it exists
+        hook_script_path = self.cfg.APPLICATION.hook[cmd_name]
+        if not os.path.exists(hook_script_path):
+            raise src.SatException(_("Hook script not found: %s") % 
+                                   hook_script_path)
+        
+        # Try to execute the script, catch the exception if it fails
+        try:
+            # import the module (in the sense of python)
+            pymodule = imp.load_source(cmd_name, hook_script_path)
+            
+            # format a message to be printed at hook execution
+            msg = src.printcolors.printcWarning(_("Run hook script"))
+            msg = "%s: %s\n" % (msg, 
+                                src.printcolors.printcInfo(hook_script_path))
+            
+            # run the function run_pre_hook if this function is called 
+            # before the command, run_post_hook if it is called after
+            if hook_type == C_PRE_HOOK and "run_pre_hook" in dir(pymodule):
+                logger.write(msg, 1)
+                pymodule.run_pre_hook(self.cfg, logger)
+            elif hook_type == C_POST_HOOK and "run_post_hook" in dir(pymodule):
+                logger.write(msg, 1)
+                pymodule.run_post_hook(self.cfg, logger)
+
+        except Exception as exc:
+            msg = _("Unable to run hook script: %s") % hook_script_path
+            msg += "\n" + str(exc)
+            raise src.SatException(msg)
+
+    def get_help(self, opt):
+        '''Prints help for a command. Function called when "sat -h <command>"
+        
+        :param argv str: the options passed (to get the command name)
+        '''
+        # if no command as argument (sat -h)
+        if len(opt)==0:
+            return get_help()
+        # get command name
+        command = opt[0]
+        # read the configuration from all the pyconf files
+        cfgManager = CONFIG.ConfigManager()
+        self.cfg = cfgManager.get_config(datadir=self.datadir)
+
+        # Check if this command exists
+        if not hasattr(self, command):
+            raise src.SatException(_("Command '%s' does not exist") % command)
+        
+        # Print salomeTools version
+        msg = "\n" + get_version() + "\n\n"
+        
+        # load the module
+        module = self.get_module(command)
+
+        # print the description of the command that is done in the command file
+        if hasattr( module, "description" ) :
+            msg += src.printcolors.printcHeader( _("Description:") )
+            msg += '\n' + module.description() + '\n\n'
+
+        # print the description of the command options
+        if hasattr( module, "parser" ):
+            msg += module.parser.get_help()
+
+        msg += "\n -h, --help (boolean)\n          shows help on command.\n"
+        return msg
+
+    def get_module(self, module):
+        '''Loads a command. Function called only by print_help
+        
+        :param module str: the command to load
+        '''
+        # Check if this command exists
+        if not hasattr(self, module):
+            raise src.SatException(_("Command '%s' does not exist") % module)
+
+        # load the module
+        (file_, pathname, description) = imp.find_module(module, [cmdsdir])
+        module = imp.load_module(module, file_, pathname, description)
+        return module
+
+##################################################################
+def get_text_from_options(options):
+    text_options = ""
+    for attr in dir(options):
+        if attr.startswith("__"):
+            continue
+        if options.__getattr__(attr) != None:
+            option_contain = options.__getattr__(attr)
+            if type(option_contain)==type([]):
+                option_contain = ",".join(option_contain)
+            if type(option_contain)==type(True):
+                option_contain = ""
+            text_options+= "--%s %s " % (attr, option_contain)
+    return text_options
+                
+
+def get_version():
+    '''
+    get colorized salomeTools version (in src/internal_config/salomeTools.pyconf).
+    returns string
+    '''
+    # read the config 
+    cfgManager = CONFIG.ConfigManager()
+    cfg = cfgManager.get_config()
+    # print the key corresponding to salomeTools version
+    msg = (src.printcolors.printcHeader( _("Version: ") ) + cfg.INTERNAL.sat_version)
+    return msg
+
+
+def get_help():
+    '''
+    get salomeTools general help.
+    returns string
+    '''
+    msg = "\n" + get_version() + "\n\n"
+    msg += src.printcolors.printcHeader( _("Usage: ") ) + \
+          "sat [sat_options] <command> [product] [command_options]\n\n"
+
+    msg += parser.get_help() + "\n"
+
+    # display all the available commands.
+    msg += src.printcolors.printcHeader(_("Available commands are:")) + "\n"
+    for command in lCommand:
+        msg += " - %s\n" % (command)
+
+    msg += "\n"
+    # Explain how to get the help for a specific command
+    msg += src.printcolors.printcHeader(
+        _("Getting the help for a specific command: ")) + \
+        "\n>> sat --help <command>\n"
+    return msg
+
+def write_exception(exc):
+    '''write exception in case of error in a command
+    
+    :param exc exception: the exception to print
+    '''
+    sys.stderr.write("\n***** ")
+    sys.stderr.write(src.printcolors.printcError("salomeTools ERROR:"))
+    sys.stderr.write("\n" + str(exc) + "\n")
+
+
diff --git a/src/utilsSat.py b/src/utilsSat.py
new file mode 100644 (file)
index 0000000..e60eec9
--- /dev/null
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+"""
+utilities for sat
+general useful simple methods
+all-in-one import srs.utilsSat as UTS
+
+| Usage:
+| >> import srsc.utilsSat as UTS
+| >> UTS.Popen('ls && etc...', ...)
+"""
+
+import os
+import shutil
+import errno
+import stat
+import time
+
+import re
+import tempfile
+import subprocess as SP
+
+import src.returnCode as RCO
+import src.debug as DBG # Easy print stderr (for DEBUG only)
+
+
+##############################################################################
+# subprocess utilities, with logger functionnalities (trace etc.)
+##############################################################################
+    
+def Popen(command, shell=True, cwd=None, env=None, stdout=SP.PIPE, stderr=SP.PIPE, logger=None):
+  """
+  make subprocess.Popen(cmd), with 
+  call logger.trace and logger.error if problem as returncode != 0 
+  """
+  if True: #try:  
+    proc = SP.Popen(command, shell=shell, cwd=cwd, env=env, stdout=stdout, stderr=SP.STDOUT)
+    res_out, res_err = proc.communicate() # res_err = None as stderr=SP.STDOUT
+    rc = proc.returncode
+    
+    DBG.write("Popen logger returncode", (rc, res_out))
+    
+    if rc == 0:
+      if logger is not None:
+        logger.trace("<OK> launch command rc=%s cwd=<info>%s<reset>:\n%s" % (rc, cwd, command))
+        logger.trace("<OK> result command stdout&stderr:\n%s" % res_out)
+      return RCO.ReturnCode("OK", "Popen command done", value=res_out)
+    else:
+      if logger is not None:
+        logger.warning("<KO> launch command rc=%s cwd=<info>%s<reset>:\n%s" % (rc, cwd, command))
+        logger.warning("<KO> result command stdout&stderr:\n%s" % res_out)
+      return RCO.ReturnCode("KO", "Popen command problem", value=res_out)
+  else: #except Exception as e:
+    logger.error("<KO> launch command cwd=%s:\n%s" % (cwd, command))
+    logger.error("launch command exception:\n%s" % e)
+    return RCO.ReturnCode("KO", "Popen command problem")
+
+
+def sleep(sec):
+    time.sleep(sec)
index ca8ec61e0d35869bd6f33a310ce5d20fe6168a62..d619980da281368a9bf182596bca6b5517c17dee 100644 (file)
@@ -44,8 +44,40 @@ class XmlLogFile(object):
         src.ensure_path_exists(os.path.dirname(filePath))
         # Initialize the field that contain the xml in memory
         self.xmlroot = etree.Element(rootname, attrib = attrib)
-    
-    def write_tree(self, stylesheet=None, file_path = None):
+
+    def escapeSequence(self, aStr):
+        """
+        See xml specification:
+        The ampersand character(&) and the left angle bracket(<) MUST NOT appear in their
+        literal form, except when used as markup delimiters, or within a comment, a processing
+        instruction, or a CDATA section.
+        If they are needed elsewhere, they MUST be escaped using either numeric character references
+        or the strings '&amp;' and '&lt;' respectively.
+        The right angle bracket(>) may be
+        represented using the string '&gt;', and MUST,
+        for compatibility, be escaped using either '&gt;' or a character reference
+        when it appears in the string " ]]> " in content,
+        when that string is not marking the end of a CDATA section.
+        You can use these escape sequences:
+        < (less - than) as &#60; or &lt;
+        > (greater - than) as &#62; or &gt;
+        & (ampersand) as &#38;
+        ' (apostrophe or single quote) as &#39;
+        " (double-quote) as &#34;
+        """
+        replaces = [ ('&', '&amp;'),
+                     ('>', '&gt;'),
+                     ('<', '&lt;'),
+                     ("'", '&#39;'),
+                     ('"', '&#34;'),
+                    ]
+        res = aStr
+        for ini, fin in replaces: # order matters
+          res = res.replace(ini, fin)
+        return res
+
+
+def write_tree(self, stylesheet=None, file_path = None):
         '''Write the xml tree in the log file path. Add the stylesheet if asked.
         
         :param stylesheet str: The stylesheet to apply to the xml file
diff --git a/test/APPLI_TEST/APPLI_TEST.pyconf b/test/APPLI_TEST/APPLI_TEST.pyconf
new file mode 100644 (file)
index 0000000..5fc08b3
--- /dev/null
@@ -0,0 +1,45 @@
+
+APPLICATION :
+{
+    name : 'APPLI_TEST'
+    workdir : $LOCAL.workdir + $VARS.sep + $APPLICATION.name + '-' + $VARS.dist
+    base : 'base'
+    tag : 'master'
+    get_method : 'git'
+    environ :
+    {
+        ACCEPT_SALOME_WARNINGS : '1'
+        LC_NUMERIC : 'C'
+        TESTS_ROOT_DIR : "/tmp/" + $VARS.user+ "/TESTS/APPLI_TEST"
+    }
+    products :
+    {
+        # PREREQUISITES :
+        'Python' : 'native'
+
+        # SALOME MODULES :
+        'CONFIGURATION'
+        'MEDCOUPLING'
+        'KERNEL'
+        'GUI'
+        'GEOM'
+        'SMESH'
+
+    }
+    grid_to_test : 'SALOME_V8'
+    profile :
+    {
+        launcher_name : "appli_test"
+        product : "SALOME"
+    }
+    virtual_app:
+    {
+        name : "appli_test"
+        application_name : "APPLI"
+    }
+    test_base : 
+    {
+        name : "SALOME"
+        tag : "SalomeV8"
+    }
+}
diff --git a/test/README_config_0_3_9.txt b/test/README_config_0_3_9.txt
new file mode 100644 (file)
index 0000000..4605ae9
--- /dev/null
@@ -0,0 +1,2 @@
+#TODO
+switch pyconf.py 0.3.7.1 -> 0.3.9, here for test
diff --git a/test/__init__.py b/test/__init__.py
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/test/_testTools/HTMLTestRunner.py b/test/_testTools/HTMLTestRunner.py
deleted file mode 100644 (file)
index 0439bf4..0000000
+++ /dev/null
@@ -1,824 +0,0 @@
-"""
-A TestRunner for use with the Python unit testing framework. It
-generates a HTML report to show the result at a glance.
-
-The simplest way to use this is to invoke its main method. E.g.
-
-    import unittest
-    import HTMLTestRunner
-
-    ... define your tests ...
-
-    if __name__ == '__main__':
-        HTMLTestRunner.main()
-
-
-For more customization options, instantiates a HTMLTestRunner object.
-HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g.
-
-    # output to a file
-    fp = file('my_report.html', 'wb')
-    runner = HTMLTestRunner.HTMLTestRunner(
-                stream=fp,
-                title='My unit test',
-                description='This demonstrates the report output by HTMLTestRunner.'
-                )
-
-    # Use an external stylesheet.
-    # See the Template_mixin class for more customizable options
-    runner.STYLESHEET_TMPL = '<link rel="stylesheet" href="my_stylesheet.css" type="text/css">'
-
-    # run the test
-    runner.run(my_test_suite)
-
-
-------------------------------------------------------------------------
-Copyright (c) 2004-2007, Wai Yip Tung
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-* Redistributions of source code must retain the above copyright notice,
-  this list of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the above copyright
-  notice, this list of conditions and the following disclaimer in the
-  documentation and/or other materials provided with the distribution.
-* Neither the name Wai Yip Tung nor the names of its contributors may be
-  used to endorse or promote products derived from this software without
-  specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-"""
-
-# URL: http://tungwaiyip.info/software/HTMLTestRunner.html
-
-__author__ = "Wai Yip Tung"
-__version__ = "0.8.2"
-
-
-"""
-Change History
-
-Version 0.8.2
-* Show output inline instead of popup window (Viorel Lupu).
-
-Version in 0.8.1
-* Validated XHTML (Wolfgang Borgert).
-* Added description of test classes and test cases.
-
-Version in 0.8.0
-* Define Template_mixin class for customization.
-* Workaround a IE 6 bug that it does not treat <script> block as CDATA.
-
-Version in 0.7.1
-* Back port to Python 2.3 (Frank Horowitz).
-* Fix missing scroll bars in detail log (Podi).
-"""
-
-# TODO: color stderr
-# TODO: simplify javascript using ,ore than 1 class in the class attribute?
-
-import datetime
-import StringIO
-import sys
-import time
-import unittest
-from xml.sax import saxutils
-
-
-# ------------------------------------------------------------------------
-# The redirectors below are used to capture output during testing. Output
-# sent to sys.stdout and sys.stderr are automatically captured. However
-# in some cases sys.stdout is already cached before HTMLTestRunner is
-# invoked (e.g. calling logging.basicConfig). In order to capture those
-# output, use the redirectors for the cached stream.
-#
-# e.g.
-#   >>> logging.basicConfig(stream=HTMLTestRunner.stdout_redirector)
-#   >>>
-
-class OutputRedirector(object):
-    """ Wrapper to redirect stdout or stderr """
-    def __init__(self, fp):
-        self.fp = fp
-
-    def write(self, s):
-        self.fp.write(s)
-
-    def writelines(self, lines):
-        self.fp.writelines(lines)
-
-    def flush(self):
-        self.fp.flush()
-
-stdout_redirector = OutputRedirector(sys.stdout)
-stderr_redirector = OutputRedirector(sys.stderr)
-
-
-
-# ----------------------------------------------------------------------
-# Template
-
-class Template_mixin(object):
-    """
-    Define a HTML template for report customerization and generation.
-
-    Overall structure of an HTML report
-
-    HTML
-    +------------------------+
-    |<html>                  |
-    |  <head>                |
-    |                        |
-    |   STYLESHEET           |
-    |   +----------------+   |
-    |   |                |   |
-    |   +----------------+   |
-    |                        |
-    |  </head>               |
-    |                        |
-    |  <body>                |
-    |                        |
-    |   HEADING              |
-    |   +----------------+   |
-    |   |                |   |
-    |   +----------------+   |
-    |                        |
-    |   REPORT               |
-    |   +----------------+   |
-    |   |                |   |
-    |   +----------------+   |
-    |                        |
-    |   ENDING               |
-    |   +----------------+   |
-    |   |                |   |
-    |   +----------------+   |
-    |                        |
-    |  </body>               |
-    |</html>                 |
-    +------------------------+
-    """
-
-    STATUS = {
-    0: 'pass',
-    1: 'fail',
-    2: 'error',
-    }
-
-    DEFAULT_TITLE = 'Unit Test Report'
-    DEFAULT_DESCRIPTION = ''
-
-    # ------------------------------------------------------------------------
-    # HTML Template
-
-    HTML_TMPL = r"""<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-    <title>%(title)s</title>
-    <meta name="generator" content="%(generator)s"/>
-    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-    %(stylesheet)s
-</head>
-<body>
-<script language="javascript" type="text/javascript"><!--
-output_list = Array();
-
-/* level - 0:Summary; 1:Failed; 2:All */
-function showCase(level) {
-    trs = document.getElementsByTagName("tr");
-    for (var i = 0; i < trs.length; i++) {
-        tr = trs[i];
-        id = tr.id;
-        if (id.substr(0,2) == 'ft') {
-            if (level < 1) {
-                tr.className = 'hiddenRow';
-            }
-            else {
-                tr.className = '';
-            }
-        }
-        if (id.substr(0,2) == 'pt') {
-            if (level > 1) {
-                tr.className = '';
-            }
-            else {
-                tr.className = 'hiddenRow';
-            }
-        }
-    }
-}
-
-
-function showClassDetail(cid, count) {
-    var id_list = Array(count);
-    var toHide = 1;
-    for (var i = 0; i < count; i++) {
-        tid0 = 't' + cid.substr(1) + '.' + (i+1);
-        tid = 'f' + tid0;
-        tr = document.getElementById(tid);
-        if (!tr) {
-            tid = 'p' + tid0;
-            tr = document.getElementById(tid);
-        }
-        id_list[i] = tid;
-        if (tr.className) {
-            toHide = 0;
-        }
-    }
-    for (var i = 0; i < count; i++) {
-        tid = id_list[i];
-        if (toHide) {
-            document.getElementById('div_'+tid).style.display = 'none'
-            document.getElementById(tid).className = 'hiddenRow';
-        }
-        else {
-            document.getElementById(tid).className = '';
-        }
-    }
-}
-
-
-function showTestDetail(div_id){
-    var details_div = document.getElementById(div_id)
-    var displayState = details_div.style.display
-    // alert(displayState)
-    if (displayState != 'block' ) {
-        displayState = 'block'
-        details_div.style.display = 'block'
-    }
-    else {
-        details_div.style.display = 'none'
-    }
-}
-
-
-function html_escape(s) {
-    s = s.replace(/&/g,'&amp;');
-    s = s.replace(/</g,'&lt;');
-    s = s.replace(/>/g,'&gt;');
-    return s;
-}
-
-/* obsoleted by detail in <div>
-function showOutput(id, name) {
-    var w = window.open("", //url
-                    name,
-                    "resizable,scrollbars,status,width=800,height=450");
-    d = w.document;
-    d.write("<pre>");
-    d.write(html_escape(output_list[id]));
-    d.write("\n");
-    d.write("<a href='javascript:window.close()'>close</a>\n");
-    d.write("</pre>\n");
-    d.close();
-}
-*/
---></script>
-
-%(heading)s
-%(report)s
-%(ending)s
-
-</body>
-</html>
-"""
-    # variables: (title, generator, stylesheet, heading, report, ending)
-
-
-    # ------------------------------------------------------------------------
-    # Stylesheet
-    #
-    # alternatively use a <link> for external style sheet, e.g.
-    #   <link rel="stylesheet" href="$url" type="text/css">
-
-    STYLESHEET_TMPL = """
-<style type="text/css" media="screen">
-body        { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
-table       { font-size: 100%; }
-pre         { }
-
-/* -- heading ---------------------------------------------------------------------- */
-h1 {
-       font-size: 16pt;
-       color: gray;
-}
-.heading {
-    margin-top: 0ex;
-    margin-bottom: 1ex;
-}
-
-.heading .attribute {
-    margin-top: 1ex;
-    margin-bottom: 0;
-}
-
-.heading .description {
-    margin-top: 4ex;
-    margin-bottom: 6ex;
-}
-
-/* -- css div popup ------------------------------------------------------------------------ */
-a.popup_link {
-}
-
-a.popup_link:hover {
-    color: red;
-}
-
-.popup_window {
-    display: none;
-    position: relative;
-    left: 0px;
-    top: 0px;
-    /*border: solid #627173 1px; */
-    padding: 10px;
-    background-color: #E6E6D6;
-    font-family: "Lucida Console", "Courier New", Courier, monospace;
-    text-align: left;
-    font-size: 8pt;
-    width: 500px;
-}
-
-}
-/* -- report ------------------------------------------------------------------------ */
-#show_detail_line {
-    margin-top: 3ex;
-    margin-bottom: 1ex;
-}
-#result_table {
-    width: 80%;
-    border-collapse: collapse;
-    border: 1px solid #777;
-}
-#header_row {
-    font-weight: bold;
-    color: white;
-    background-color: #777;
-}
-#result_table td {
-    border: 1px solid #777;
-    padding: 2px;
-}
-#total_row  { font-weight: bold; }
-.passClass  { background-color: #6c6; }
-.failClass  { background-color: #c60; }
-.errorClass { background-color: #c00; }
-.passCase   { color: #6c6; }
-.failCase   { color: #c60; font-weight: bold; }
-.errorCase  { color: #c00; font-weight: bold; }
-.hiddenRow  { display: none; }
-.testcase   { margin-left: 2em; }
-
-
-/* -- ending ---------------------------------------------------------------------- */
-#ending {
-}
-
-</style>
-"""
-
-
-
-    # ------------------------------------------------------------------------
-    # Heading
-    #
-
-    HEADING_TMPL = """<div class='heading'>
-<h1>%(title)s</h1>
-%(parameters)s
-<p class='description'>%(description)s</p>
-</div>
-
-""" # variables: (title, parameters, description)
-
-    HEADING_ATTRIBUTE_TMPL = """<p class='attribute'><strong>%(name)s:</strong> %(value)s</p>
-""" # variables: (name, value)
-
-
-
-    # ------------------------------------------------------------------------
-    # Report
-    #
-
-    REPORT_TMPL = """
-<p id='show_detail_line'>Show
-<a href='javascript:showCase(0)'>Summary</a>
-<a href='javascript:showCase(1)'>Failed</a>
-<a href='javascript:showCase(2)'>All</a>
-</p>
-<table id='result_table'>
-<colgroup>
-<col align='left' />
-<col align='right' />
-<col align='right' />
-<col align='right' />
-<col align='right' />
-<col align='right' />
-</colgroup>
-<tr id='header_row'>
-    <td>Test Group/Test case</td>
-    <td>Count</td>
-    <td>Pass</td>
-    <td>Fail</td>
-    <td>Error</td>
-    <td>View</td>
-</tr>
-%(test_list)s
-<tr id='total_row'>
-    <td>Total</td>
-    <td>%(count)s</td>
-    <td>%(Pass)s</td>
-    <td>%(fail)s</td>
-    <td>%(error)s</td>
-    <td>&nbsp;</td>
-</tr>
-</table>
-""" # variables: (test_list, count, Pass, fail, error)
-
-    REPORT_CLASS_TMPL = r"""
-<tr class='%(style)s'>
-    <td>%(desc)s</td>
-    <td>%(count)s</td>
-    <td>%(Pass)s</td>
-    <td>%(fail)s</td>
-    <td>%(error)s</td>
-    <td><a href="javascript:showClassDetail('%(cid)s',%(count)s)">Detail</a></td>
-</tr>
-""" # variables: (style, desc, count, Pass, fail, error, cid)
-
-
-    REPORT_TEST_WITH_OUTPUT_TMPL = r"""
-<tr id='%(tid)s' class='%(Class)s'>
-    <td class='%(style)s'><div class='testcase'>%(desc)s</div></td>
-    <td colspan='5' align='center'>
-
-    <!--css div popup start-->
-    <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_%(tid)s')" >
-        %(status)s</a>
-
-    <div id='div_%(tid)s' class="popup_window">
-        <div style='text-align: right; color:red;cursor:pointer'>
-        <a onfocus='this.blur();' onclick="document.getElementById('div_%(tid)s').style.display = 'none' " >
-           [x]</a>
-        </div>
-        <pre>
-        %(script)s
-        </pre>
-    </div>
-    <!--css div popup end-->
-
-    </td>
-</tr>
-""" # variables: (tid, Class, style, desc, status)
-
-
-    REPORT_TEST_NO_OUTPUT_TMPL = r"""
-<tr id='%(tid)s' class='%(Class)s'>
-    <td class='%(style)s'><div class='testcase'>%(desc)s</div></td>
-    <td colspan='5' align='center'>%(status)s</td>
-</tr>
-""" # variables: (tid, Class, style, desc, status)
-
-
-    REPORT_TEST_OUTPUT_TMPL = r"""
-%(id)s: %(output)s
-""" # variables: (id, output)
-
-
-
-    # ------------------------------------------------------------------------
-    # ENDING
-    #
-
-    ENDING_TMPL = """<div id='ending'>&nbsp;</div>"""
-
-# -------------------- The end of the Template class -------------------
-
-
-TestResult = unittest.TestResult
-
-class _TestResult(TestResult):
-    # note: _TestResult is a pure representation of results.
-    # It lacks the output and reporting ability compares to unittest._TextTestResult.
-
-    def __init__(self, verbosity=1):
-        TestResult.__init__(self)
-        self.stdout0 = None
-        self.stderr0 = None
-        self.success_count = 0
-        self.failure_count = 0
-        self.error_count = 0
-        self.verbosity = verbosity
-
-        # result is a list of result in 4 tuple
-        # (
-        #   result code (0: success; 1: fail; 2: error),
-        #   TestCase object,
-        #   Test output (byte string),
-        #   stack trace,
-        # )
-        self.result = []
-
-
-    def startTest(self, test):
-        TestResult.startTest(self, test)
-        # just one buffer for both stdout and stderr
-        self.outputBuffer = StringIO.StringIO()
-        stdout_redirector.fp = self.outputBuffer
-        stderr_redirector.fp = self.outputBuffer
-        self.stdout0 = sys.stdout
-        self.stderr0 = sys.stderr
-        sys.stdout = stdout_redirector
-        sys.stderr = stderr_redirector
-
-
-    def complete_output(self):
-        """
-        Disconnect output redirection and return buffer.
-        Safe to call multiple times.
-        """
-        if self.stdout0:
-            sys.stdout = self.stdout0
-            sys.stderr = self.stderr0
-            self.stdout0 = None
-            self.stderr0 = None
-        return self.outputBuffer.getvalue()
-
-
-    def stopTest(self, test):
-        # Usually one of addSuccess, addError or addFailure would have been called.
-        # But there are some path in unittest that would bypass this.
-        # We must disconnect stdout in stopTest(), which is guaranteed to be called.
-        self.complete_output()
-
-
-    def addSuccess(self, test):
-        self.success_count += 1
-        TestResult.addSuccess(self, test)
-        output = self.complete_output()
-        self.result.append((0, test, output, ''))
-        if self.verbosity > 1:
-            sys.stderr.write('ok ')
-            sys.stderr.write(str(test))
-            sys.stderr.write('\n')
-        else:
-            sys.stderr.write('.')
-
-    def addError(self, test, err):
-        self.error_count += 1
-        TestResult.addError(self, test, err)
-        _, _exc_str = self.errors[-1]
-        output = self.complete_output()
-        self.result.append((2, test, output, _exc_str))
-        if self.verbosity > 1:
-            sys.stderr.write('E  ')
-            sys.stderr.write(str(test))
-            sys.stderr.write('\n')
-        else:
-            sys.stderr.write('E')
-
-    def addFailure(self, test, err):
-        self.failure_count += 1
-        TestResult.addFailure(self, test, err)
-        _, _exc_str = self.failures[-1]
-        output = self.complete_output()
-        self.result.append((1, test, output, _exc_str))
-        if self.verbosity > 1:
-            sys.stderr.write('F  ')
-            sys.stderr.write(str(test))
-            sys.stderr.write('\n')
-        else:
-            sys.stderr.write('F')
-
-
-class HTMLTestRunner(Template_mixin):
-    """
-    """
-    def __init__(self, stream=sys.stdout, verbosity=1, title=None, description=None):
-        self.stream = stream
-        self.verbosity = verbosity
-        if title is None:
-            self.title = self.DEFAULT_TITLE
-        else:
-            self.title = title
-        if description is None:
-            self.description = self.DEFAULT_DESCRIPTION
-        else:
-            self.description = description
-
-        self.startTime = datetime.datetime.now()
-
-
-    def run(self, test):
-        "Run the given test case or test suite."
-        result = _TestResult(self.verbosity)
-        test(result)
-        self.stopTime = datetime.datetime.now()
-        self.generateReport(test, result)
-        print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)
-        return result
-
-
-    def sortResult(self, result_list):
-        # unittest does not seems to run in any particular order.
-        # Here at least we want to group them together by class.
-        rmap = {}
-        classes = []
-        for n,t,o,e in result_list:
-            cls = t.__class__
-            if not rmap.has_key(cls):
-                rmap[cls] = []
-                classes.append(cls)
-            rmap[cls].append((n,t,o,e))
-        r = [(cls, rmap[cls]) for cls in classes]
-        return r
-
-
-    def getReportAttributes(self, result):
-        """
-        Return report attributes as a list of (name, value).
-        Override this to add custom attributes.
-        """
-        startTime = str(self.startTime)[:19]
-        duration = str(self.stopTime - self.startTime)
-        status = []
-        if result.success_count: status.append('Pass %s'    % result.success_count)
-        if result.failure_count: status.append('Failure %s' % result.failure_count)
-        if result.error_count:   status.append('Error %s'   % result.error_count  )
-        if status:
-            status = ' '.join(status)
-        else:
-            status = 'none'
-        return [
-            ('Start Time', startTime),
-            ('Duration', duration),
-            ('Status', status),
-        ]
-
-
-    def generateReport(self, test, result):
-        report_attrs = self.getReportAttributes(result)
-        generator = 'HTMLTestRunner %s' % __version__
-        stylesheet = self._generate_stylesheet()
-        heading = self._generate_heading(report_attrs)
-        report = self._generate_report(result)
-        ending = self._generate_ending()
-        output = self.HTML_TMPL % dict(
-            title = saxutils.escape(self.title),
-            generator = generator,
-            stylesheet = stylesheet,
-            heading = heading,
-            report = report,
-            ending = ending,
-        )
-        self.stream.write(output.encode('utf8'))
-
-
-    def _generate_stylesheet(self):
-        return self.STYLESHEET_TMPL
-
-
-    def _generate_heading(self, report_attrs):
-        a_lines = []
-        for name, value in report_attrs:
-            line = self.HEADING_ATTRIBUTE_TMPL % dict(
-                    name = saxutils.escape(name),
-                    value = saxutils.escape(value),
-                )
-            a_lines.append(line)
-        heading = self.HEADING_TMPL % dict(
-            title = saxutils.escape(self.title),
-            parameters = ''.join(a_lines),
-            description = saxutils.escape(self.description),
-        )
-        return heading
-
-
-    def _generate_report(self, result):
-        rows = []
-        sortedResult = self.sortResult(result.result)
-        for cid, (cls, cls_results) in enumerate(sortedResult):
-            # subtotal for a class
-            np = nf = ne = 0
-            for n,t,o,e in cls_results:
-                if n == 0: np += 1
-                elif n == 1: nf += 1
-                else: ne += 1
-
-            # format class description
-            if cls.__module__ == "__main__":
-                name = cls.__name__
-            else:
-                name = "%s.%s" % (cls.__module__, cls.__name__)
-            doc = cls.__doc__ and cls.__doc__.split("\n")[0] or ""
-            desc = doc and '%s: %s' % (name, doc) or name
-
-            row = self.REPORT_CLASS_TMPL % dict(
-                style = ne > 0 and 'errorClass' or nf > 0 and 'failClass' or 'passClass',
-                desc = desc,
-                count = np+nf+ne,
-                Pass = np,
-                fail = nf,
-                error = ne,
-                cid = 'c%s' % (cid+1),
-            )
-            rows.append(row)
-
-            for tid, (n,t,o,e) in enumerate(cls_results):
-                self._generate_report_test(rows, cid, tid, n, t, o, e)
-
-        report = self.REPORT_TMPL % dict(
-            test_list = ''.join(rows),
-            count = str(result.success_count+result.failure_count+result.error_count),
-            Pass = str(result.success_count),
-            fail = str(result.failure_count),
-            error = str(result.error_count),
-        )
-        return report
-
-
-    def _generate_report_test(self, rows, cid, tid, n, t, o, e):
-        # e.g. 'pt1.1', 'ft1.1', etc
-        has_output = bool(o or e)
-        tid = (n == 0 and 'p' or 'f') + 't%s.%s' % (cid+1,tid+1)
-        name = t.id().split('.')[-1]
-        doc = t.shortDescription() or ""
-        desc = doc and ('%s: %s' % (name, doc)) or name
-        tmpl = has_output and self.REPORT_TEST_WITH_OUTPUT_TMPL or self.REPORT_TEST_NO_OUTPUT_TMPL
-
-        # o and e should be byte string because they are collected from stdout and stderr?
-        if isinstance(o,str):
-            # TODO: some problem with 'string_escape': it escape \n and mess up formating
-            # uo = unicode(o.encode('string_escape'))
-            uo = o.decode('latin-1')
-        else:
-            uo = o
-        if isinstance(e,str):
-            # TODO: some problem with 'string_escape': it escape \n and mess up formating
-            # ue = unicode(e.encode('string_escape'))
-            ue = e.decode('latin-1')
-        else:
-            ue = e
-
-        script = self.REPORT_TEST_OUTPUT_TMPL % dict(
-            id = tid,
-            output = saxutils.escape(uo+ue),
-        )
-
-        row = tmpl % dict(
-            tid = tid,
-            Class = (n == 0 and 'hiddenRow' or 'none'),
-            style = n == 2 and 'errorCase' or (n == 1 and 'failCase' or 'none'),
-            desc = desc,
-            script = script,
-            status = self.STATUS[n],
-        )
-        rows.append(row)
-        if not has_output:
-            return
-
-    def _generate_ending(self):
-        return self.ENDING_TMPL
-
-
-##############################################################################
-# Facilities for running tests from the command line
-##############################################################################
-
-# Note: Reuse unittest.TestProgram to launch test. In the future we may
-# build our own launcher to support more specific command line
-# parameters like test title, CSS, etc.
-class TestProgram(unittest.TestProgram):
-    """
-    A variation of the unittest.TestProgram. Please refer to the base
-    class for command line parameters.
-    """
-    def runTests(self):
-        # Pick HTMLTestRunner as the default test runner.
-        # base class's testRunner parameter is not useful because it means
-        # we have to instantiate HTMLTestRunner before we know self.verbosity.
-        if self.testRunner is None:
-            self.testRunner = HTMLTestRunner(verbosity=self.verbosity)
-        unittest.TestProgram.runTests(self)
-
-main = TestProgram
-
-##############################################################################
-# Executing this module from the command line
-##############################################################################
-
-if __name__ == "__main__":
-    main(module=None)
diff --git a/test/_testTools/tools.py b/test/_testTools/tools.py
deleted file mode 100644 (file)
index 2930b99..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import tempfile
-import sys
-import subprocess
-import time
-
-class outRedirection():
-    '''redirection of standart output
-    useful for testing the terminal display
-    '''
-    def __init__(self):
-        '''initialization
-        '''
-        self._fstream = tempfile.NamedTemporaryFile(mode='w')
-        self.saveout = sys.stdout
-        sys.stdout = self._fstream
-
-    def flush(self):
-        self._fstream.flush()                
-
-    def end_redirection(self):
-        self._fstream.seek(0)
-        ff = open(self._fstream.name, 'r')
-        self.res = ff.read()
-        self._fstream.close()
-        sys.stdout = self.saveout
-        
-    def read_results(self):
-        try:
-            return self.res
-        except Exception as exc:
-            print('Problem with redirection : %s' % exc)
-            sys.exit(1)
-
-def kill9(pid):
-    subprocess.call("kill -9 " + pid, shell=True)
-
-def check_proc_existence_and_kill(regex):
-    cmd = 'ps aux | grep "' + regex + '"'
-    psRes = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
-    psRes = psRes.split('\n')
-    for line in psRes:
-        if 'grep' in line or len(line) == 0:
-            continue
-        line2 = [i for i in line.split(' ') if i != '']
-        pid = line2[1]
-        kill9(pid)
-        return pid
-    return 0
-
-def check_proc_existence_and_kill_multi(regex, nb_kills, time_between_two_checks = 1):
-    found = False
-    i = 0
-    while not found and i < nb_kills :
-        found = check_proc_existence_and_kill(regex)
-        if found:
-            return found
-        time.sleep(time_between_two_checks)
-        i+=1
-    return 0
\ No newline at end of file
diff --git a/test/compilation/test_compilation.py b/test/compilation/test_compilation.py
deleted file mode 100644 (file)
index 59cdad5..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-import src.product
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestCompile(unittest.TestCase):
-    '''Test of the compile command
-    '''
-
-    def test_compile(self):
-        '''Test the compile command with --products option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
-
-        sat.clean(appli + ' --build --install --product ' + product_name, batch=True)
-        sat.compile(appli + ' --product ' + product_name)
-        
-        if os.path.exists(expected_file_path):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_compile_fathers(self):
-        '''Test the configure command with --fathers option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-        product_name2 = 'PRODUCT_ARCHIVE'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name +"," +product_name2)
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
-        expected_install_dir2 = src.product.get_product_config(sat.cfg, product_name2).install_dir
-        expected_file_path2 = os.path.join(expected_install_dir2, 'bin/hello-archive')
-        
-        sat.clean(appli + ' --build --install --product ' + product_name +"," +product_name2, batch=True)
-        sat.compile(appli + ' --with_fathers --product ' + product_name)
-        
-        if os.path.exists(expected_file_path) and os.path.exists(expected_file_path2):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-        
-    def test_compile_children(self):
-        '''Test the configure command with --children option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-        product_name2 = 'PRODUCT_ARCHIVE'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name +"," +product_name2)
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
-        expected_install_dir2 = src.product.get_product_config(sat.cfg, product_name2).install_dir
-        expected_file_path2 = os.path.join(expected_install_dir2, 'bin/hello-archive')
-
-        sat.clean(appli + ' --build --install --product ' + product_name +"," +product_name2, batch=True)
-        sat.compile(appli + ' --with_children --product ' + product_name2)
-        
-        if os.path.exists(expected_file_path) and os.path.exists(expected_file_path2):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_compile_clean_all(self):
-        '''Test the configure command with --clean_all option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-        product_name2 = 'PRODUCT_ARCHIVE'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name +"," +product_name2)
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
-        expected_install_dir2 = src.product.get_product_config(sat.cfg, product_name2).install_dir
-        expected_file_path2 = os.path.join(expected_install_dir2, 'bin/hello-archive')
-
-        sat.compile(appli + ' --with_children --product ' + product_name2)
-        
-        sat.compile(appli + ' --clean_all --with_children --product ' + product_name2, batch=True)
-        
-        if os.path.exists(expected_file_path) and os.path.exists(expected_file_path2):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_compile_clean_install(self):
-        '''Test the configure command with --clean_install option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-        product_name2 = 'PRODUCT_ARCHIVE'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name +"," +product_name2)
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
-        expected_install_dir2 = src.product.get_product_config(sat.cfg, product_name2).install_dir
-        expected_file_path2 = os.path.join(expected_install_dir2, 'bin/hello-archive')
-
-        sat.compile(appli + ' --with_children --product ' + product_name2)
-        
-        sat.compile(appli + ' --clean_install --with_children --product ' + product_name2, batch=True)
-        
-        if os.path.exists(expected_file_path) and os.path.exists(expected_file_path2):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_compile_makeflags(self):
-        '''Test the configure command with --make_flags option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
-
-        sat.clean(appli + ' --build --install --product ' + product_name, batch=True)
-        sat.compile(appli + ' --make_flags 3 --product ' + product_name)
-               
-        if os.path.exists(expected_file_path):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_compile_show(self):
-        '''Test the configure command with --show option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
-
-        sat.clean(appli + ' --build --install --product ' + product_name, batch=True)
-        sat.compile(appli + ' --show --product ' + product_name)
-               
-        if not(os.path.exists(expected_file_path)):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_compile_stop_first_fail(self):
-        '''Test the configure command with --stop_first_fail option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product PRODUCT_CVS,Python')
-        expected_install_dir = src.product.get_product_config(sat.cfg, "PRODUCT_CVS").install_dir
-
-        sat.clean(appli + ' --build --install --product PRODUCT_CVS', batch=True)
-        sat.compile(appli + ' --stop_first_fail --product PRODUCT_CVS,Python')
-               
-        if not(os.path.exists(expected_install_dir)):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_description(self):
-        '''Test the sat -h compile
-        '''        
-
-        OK = "KO"
-
-        import compile
-        
-        if "The compile command constructs the products" in compile.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/compilation/test_configure.py b/test/compilation/test_configure.py
deleted file mode 100644 (file)
index db62e7e..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-import src.product
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestConfigure(unittest.TestCase):
-    '''Test of the configure command
-    '''
-
-    def test_configure_cmake(self):
-        '''Test the configure command with a product in cmake
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
-        expected_file_path = os.path.join(expected_build_dir, 'CMakeCache.txt')
-       
-        sat.configure(appli + ' --product ' + product_name)
-        
-        if os.path.exists(os.path.join(expected_build_dir, expected_file_path)):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_configure_autotools(self):
-        '''Test the configure command with a product in autotools
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_CVS'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
-        expected_file_path = os.path.join(expected_build_dir, 'config.log')
-       
-        sat.configure(appli + ' --product ' + product_name)
-        
-        if os.path.exists(os.path.join(expected_build_dir, expected_file_path)):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_configure_script(self):
-        '''Test the configure command with a product in script mode
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'Python'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
-      
-        sat.configure(appli + ' --product ' + product_name)
-        
-        if os.path.exists(expected_build_dir):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_description(self):
-        '''Test the sat -h configure
-        '''        
-
-        OK = "KO"
-
-        import configure
-        
-        if "The configure command executes in the build directory" in configure.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/compilation/test_make.py b/test/compilation/test_make.py
deleted file mode 100644 (file)
index b6049d3..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-import src.product
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestMake(unittest.TestCase):
-    '''Test of the make command
-    '''
-
-    def test_make(self):
-        '''Test the configure command without any option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
-        expected_file_path = os.path.join(expected_build_dir, 'hello')
-       
-        sat.configure(appli + ' --product ' + product_name)
-        
-        sat.make(appli + ' --product ' + product_name)
-        
-        if os.path.exists(os.path.join(expected_build_dir, expected_file_path)):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_make_option(self):
-        '''Test the make command with an option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
-        expected_file_path = os.path.join(expected_build_dir, 'hello')
-       
-        sat.configure(appli + ' --product ' + product_name)
-        
-        sat.make(appli + ' --product ' + product_name + ' --option -j3')
-        
-        if os.path.exists(os.path.join(expected_build_dir, expected_file_path)):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_make_script(self):
-        '''Test the make command with a product in script mode
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'Python'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_file = "bin/python2.7"
-        
-        sat.make(appli + ' --product ' + product_name)
-        
-        if os.path.exists(os.path.join(expected_install_dir, expected_file)):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_description(self):
-        '''Test the sat -h make
-        '''        
-
-        OK = "KO"
-
-        import make
-        
-        if "The make command executes the \"make\" command" in make.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/compilation/test_makeinstall.py b/test/compilation/test_makeinstall.py
deleted file mode 100644 (file)
index 33ed5b4..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-import src.product
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestMakeinstall(unittest.TestCase):
-    '''Test of the makeinstall command
-    '''
-
-    def test_makeinstall(self):
-        '''Test the configure command without any option
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-
-        sat = Sat()
-                            
-        sat.prepare(appli + ' --product ' + product_name)
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
-       
-        sat.configure(appli + ' --product ' + product_name)
-        
-        sat.make(appli + ' --product ' + product_name)
-        
-        sat.makeinstall(appli + ' --product ' + product_name)
-        
-        if os.path.exists(expected_file_path):
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_description(self):
-        '''Test the sat -h make
-        '''        
-
-        OK = "KO"
-
-        import makeinstall
-        
-        if "The makeinstall command executes the \"make install\" command" in makeinstall.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/config/create_user_pyconf.py b/test/config/create_user_pyconf.py
deleted file mode 100644 (file)
index 6036d30..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-import shutil
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestConfig(unittest.TestCase):
-    '''pyunit class : each method execute one test.
-    '''
-    
-    def test_user_dir_creation(self):
-        '''Creation of ~/.salomeTools/salomeTools.pyconf
-        '''
-        res = "KO"
-        user_dir = os.path.expanduser(os.path.join('~','.salomeTools'))
-        user_dir_save = os.path.expanduser(os.path.join('~','.salomeTools_save'))
-        if os.path.exists(user_dir_save):
-            shutil.rmtree(user_dir_save)
-        if os.path.exists(user_dir):
-            shutil.move(user_dir, user_dir_save)
-               
-        # The command to test
-        sat = Sat('')
-        sat.config('-v .')
-
-        expected_file = os.path.expanduser(os.path.join('~','.salomeTools', 'salomeTools.pyconf'))
-
-        if os.path.exists(expected_file):
-            res = "OK"
-
-        shutil.rmtree(user_dir)
-        shutil.move(user_dir_save, user_dir)
-
-        # pyunit method to compare 2 str
-        self.assertEqual(res, "OK")
-
-    def test_override_VARS(self):
-        '''override VARS
-        '''
-        OK = "KO"
-        
-        # The command to test
-        sat = Sat("-oVARS.user='user_test'")
-        sat.config()
-
-        if sat.cfg.VARS.user == 'user_test':
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_override_INTERNAL(self):
-        '''override INTERNAL
-        '''
-        OK = "KO"
-        
-        # The command to test
-        sat = Sat("-oINTERNAL.sat_version='V0'")
-        sat.config()
-
-        if sat.cfg.INTERNAL.sat_version == 'V0':
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    """
-    def test_override_SITE(self):
-        '''override SITE
-        '''
-        OK = "KO"
-        
-        # The command to test
-        sat = Sat("-oSITE.jobs.config_path='/tmp'")
-        sat.config()
-
-        if sat.cfg.SITE.jobs.config_path == '/tmp':
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-    """
-
-    def test_override_APPLICATION(self):
-        '''override APPLICATION
-        '''
-        OK = "KO"
-        
-        # The command to test
-        sat = Sat("-oAPPLICATION.out_dir='/tmp'")
-        sat.config('appli-test')
-
-        if sat.cfg.APPLICATION.out_dir == '/tmp':
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_override_PRODUCTS(self):
-        '''override PRODUCTS
-        '''
-        OK = "KO"
-        
-        # The command to test
-        sat = Sat("-oPRODUCTS.PRODUCT_GIT.default.name='test'")
-        sat.config('')
-
-        if sat.cfg.PRODUCTS.PRODUCT_GIT.default.name == 'test':
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/config/option_copy.py b/test/config/option_copy.py
deleted file mode 100644 (file)
index d671383..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestConfig(unittest.TestCase):
-    '''sat config -c
-    '''
-    
-    def test_option_copy(self):
-        '''Test the copy of a pyconf
-        '''
-        res = "KO"
-        appli_to_copy = "appli-test"
-
-        expected_file = os.path.expanduser(os.path.join('~','.salomeTools', 'Applications', 'LOCAL_' + appli_to_copy + '.pyconf'))
-        if os.path.exists(expected_file):
-            os.remove(expected_file)
-               
-        # The command to test
-        sat = Sat('')
-        sat.config('appli-test -c')
-
-
-        if os.path.exists(expected_file):
-            res = "OK"
-            os.remove(expected_file)
-
-        # pyunit method to compare 2 str
-        self.assertEqual(res, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/config/option_edit.py b/test/config/option_edit.py
deleted file mode 100644 (file)
index f732dcf..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-import threading
-import time
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-
-from salomeTools import Sat
-from tools import check_proc_existence_and_kill_multi
-import HTMLTestRunner
-
-sleep_time = 3
-
-class TestConfig(unittest.TestCase):
-    '''OPTION EDIT.
-    '''
-    
-    def test_edit_userconfig(self):
-        '''Test the launch of the editor when invoking the config -e
-        '''
-
-        OK = "KO"
-
-        sat = Sat("-oUSER.editor='cooledit'")
-        sat.config()
-        cmd_config = threading.Thread(target=sat.config, args=('-e',))
-        cmd_config.start()
-
-        time.sleep(sleep_time)
-
-        editor = sat.cfg.USER.editor
-        pid = check_proc_existence_and_kill_multi(editor + ".*" + "salomeTools\.pyconf", 10)
-
-        if pid:
-            OK = "OK"
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_edit_appli(self):
-        '''Test the launch of the editor when invoking the config -e appli-test
-        '''
-
-        OK = "KO"
-
-        sat = Sat("-oUSER.editor='cooledit'")
-        sat.config()
-        cmd_config = threading.Thread(target=sat.config, args=('appli-test -e',))
-        cmd_config.start()
-
-        time.sleep(sleep_time)
-
-        editor = sat.cfg.USER.editor
-        pid = check_proc_existence_and_kill_multi(editor + ".*" + "appli-test\.pyconf", 10)
-
-        if pid:
-            OK = "OK"
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/config/option_value.py b/test/config/option_value.py
deleted file mode 100644 (file)
index 678d3f0..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-import platform
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-
-from salomeTools import Sat
-from tools import outRedirection
-import HTMLTestRunner
-
-class TestConfig(unittest.TestCase):
-    '''OPTION VALUE.
-    '''
-    
-    def test_option_value(self):
-        '''Test the display of the right value of "sat config -v VARS.hostname"
-        '''
-
-        OK = "KO"
-
-        # output redirection
-        my_out = outRedirection()
-
-        # The command to test
-        sat = Sat()
-        sat.config('-v VARS.hostname')
-
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-
-        if platform.node() in res:
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_option_list(self):
-        '''Test the display of the right value of "sat config -l"
-        '''
-        
-        OK = "KO"
-
-        # output redirection
-        my_out = outRedirection()
-
-        # The command to test
-        sat = Sat()
-        sat.config('-l')
-
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-
-        # get results
-        if "ERROR" not in res:
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-    
-    """    
-    def test_error_salomeToolspyconf(self):
-        '''Test the exception when salomeTools.pyconf has errors
-        '''      
-        
-        OK = "KO"
-        
-        # The command to test
-        sat = Sat()
-        sat.config()
-        
-        salomeToolspyconfPath = os.path.join(sat.cfg.VARS.srcDir, "internal_config", "salomeTools.pyconf")
-        salomeToolspyconfPath_save = os.path.join(sat.cfg.VARS.srcDir, "internal_config", "salomeTools.pyconf_save")
-        if os.path.exists(salomeToolspyconfPath_save):
-            os.remove(salomeToolspyconfPath_save)
-        shutil.copyfile(salomeToolspyconfPath, salomeToolspyconfPath_save)
-        f_read = open(salomeToolspyconfPath, 'r')
-        text = f_read.read()
-        f_read.close()
-        os.remove(salomeToolspyconfPath)
-        f_write = open(salomeToolspyconfPath, 'w')
-        f_write.write(text.replace(':', ''))
-        f_write.close()
-        
-        try:
-            sat.config()
-        except TypeError:
-            OK = "OK"
-        finally:
-            shutil.copyfile(salomeToolspyconfPath_save, salomeToolspyconfPath)
-            os.remove(salomeToolspyconfPath_save)
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-    """       
-        
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/config/option_value_2.py b/test/config/option_value_2.py
deleted file mode 100644 (file)
index ba5a9c6..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-import platform
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-
-from salomeTools import Sat
-from tools import outRedirection
-import HTMLTestRunner
-
-class TestConfig(unittest.TestCase):
-    '''test of sat config -v VARS.python
-    '''
-    
-    def test_option_value(self):
-        '''Test the display of the right value of "sat config -v VARS.python"
-        '''
-        
-        OK = 'KO'
-
-        # output redirection
-        my_out = outRedirection()
-
-        # The command to test
-        sat = Sat('')
-        sat.config('-v VARS.python')
-
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-        
-        
-        if platform.python_version() in res:
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_option_schema(self):
-        '''Test the display of the right value of "sat config -s"
-        '''
-        
-        OK = 'KO'
-
-        # output redirection
-        my_out = outRedirection()
-
-        # The command to test
-        sat = Sat('')
-        sat.config('-s')
-
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-        
-        
-        if 'INTERNAL' in res:
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-        
-    def test_option_info(self):
-        '''Test the display of the right value of "sat config -i"
-        '''
-        
-        application = 'appli-test'
-        product = 'PRODUCT_DEV'
-        
-        OK = 'KO'
-
-        # output redirection
-        my_out = outRedirection()
-
-        # The command to test
-        sat = Sat('')
-        sat.config(application + ' --info ' + product)
-
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-        
-        
-        if 'compilation method = cmake' in res:
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/environ/test_environ.py b/test/environ/test_environ.py
deleted file mode 100644 (file)
index f7820e1..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestSource(unittest.TestCase):
-    '''Test of the source command
-    '''
-    
-    def test_environ_no_option(self):
-        '''Test the environ command without any option
-        '''
-        OK = 'KO'
-        
-        appli = 'appli-test'
-
-        file_env_name = 'env_launch.sh'
-        
-        sat = Sat()
-        sat.config(appli)
-
-        expected_file_path = os.path.join(sat.cfg.APPLICATION.workdir, file_env_name)
-
-        if os.path.exists(expected_file_path):
-            os.remove(expected_file_path)
-
-        sat.environ(appli)
-
-        if os.path.exists(expected_file_path):
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_environ_option_products(self):
-        '''Test the environ command with option --products
-        '''
-        OK = 'KO'
-        
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-        
-        file_env_name = 'env_launch.sh'
-        
-        sat = Sat()
-        sat.config(appli)
-
-        expected_file_path = os.path.join(sat.cfg.APPLICATION.workdir, file_env_name)
-
-        if os.path.exists(expected_file_path):
-            os.remove(expected_file_path)
-
-        sat.environ(appli + ' --products ' + product_name)
-
-        if os.path.exists(expected_file_path):
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')        
-
-    def test_environ_option_target(self):
-        '''Test the environ command with option --target
-        '''
-        OK = 'KO'
-        
-        appli = 'appli-test'
-        
-        file_env_name = 'env_launch.sh'
-        
-        sat = Sat()
-        sat.config(appli)
-
-        expected_file_path = os.path.join('.', file_env_name)
-        expected_file_path2 = os.path.join('.', 'env_build.sh')
-
-        if os.path.exists(expected_file_path):
-            os.remove(expected_file_path)
-
-        sat.environ(appli + ' --target .')
-
-        if os.path.exists(expected_file_path):
-            OK = 'OK'
-
-        if os.path.exists(expected_file_path):
-            os.remove(expected_file_path)
-            os.remove(expected_file_path2)
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK') 
-
-    def test_environ_option_prefix(self):
-        '''Test the environ command with option --prefix
-        '''
-        OK = 'KO'
-        
-        appli = 'appli-test'
-        prefix = 'TEST'
-        file_env_name = prefix + '_launch.sh'
-        
-        sat = Sat()
-        sat.config(appli)
-
-        expected_file_path = os.path.join(sat.cfg.APPLICATION.workdir, file_env_name)
-
-        if os.path.exists(expected_file_path):
-            os.remove(expected_file_path)
-
-        sat.environ(appli + ' --prefix ' + prefix)
-
-        if os.path.exists(expected_file_path):
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK') 
-
-    def test_environ_option_shell(self):
-        '''Test the environ command with option --shell
-        '''
-        OK = 'KO'
-        
-        appli = 'appli-test'
-        shell = 'bat'
-        file_env_name = 'env_launch.bat'
-        
-        sat = Sat()
-        sat.config(appli)
-
-        expected_file_path = os.path.join(sat.cfg.APPLICATION.workdir, file_env_name)
-
-        if os.path.exists(expected_file_path):
-            os.remove(expected_file_path)
-
-        sat.environ(appli + ' --shell ' + shell)
-
-        if os.path.exists(expected_file_path):
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK') 
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/initializeTest.py b/test/initializeTest.py
new file mode 100755 (executable)
index 0000000..14a3ff7
--- /dev/null
@@ -0,0 +1,61 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+
+"""\
+initialize PATH etc... for salomeTools unittest test files
+"""
+
+"""
+https://docs.python.org/2/library/os.html
+os.environ mapping is captured the first time the os module is imported, 
+typically during Python startup as part of processing site.py. 
+Changes to the environment made after this time are not reflected 
+in os.environ, except for changes made by modifying os.environ directly.
+
+On some platforms, including FreeBSD and Mac OS X, 
+setting environ may cause memory leaks.
+"""
+
+import os
+import sys
+import pprint as PP
+
+# get path to salomeTools sources directory parent
+satdir = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+
+# sys.stderr.write("INFO    : initializeTest needs '%s' in sys.path:\n%s\n" % (satdir, PP.pformat(sys.path)))
+
+if satdir not in sys.path:
+  # get path to salomeTools sources FIRST as prepend
+  # Make the src & commands package accessible from all test code
+  sys.path.insert(0, satdir)
+  sys.stderr.write("""\
+WARNING : sys.path not set for salomeTools, fixed for you:
+          sys.path prepend '%s'
+          sys.path:\n%s\n""" % (satdir, PP.pformat(sys.path)))
+  # os.environ PATH is not set...
+  # supposedly useful only for subprocess launch from sat
+  # see https://docs.python.org/2/library/os.html
+  # On some platforms, including FreeBSD and Mac OS X, 
+  # setting environ may cause memory leaks.
+  # sys.stderr.write("os.environ PATH:\n%s\n" % PP.pformat(os.environ["PATH"].split(":")))
+  sys.stderr.write("INFO    : to fix this message type:\n  'export PYTHONPATH=%s:${PYTHONPATH}'\n" % satdir)
+  
+
diff --git a/test/job/test_job.py b/test/job/test_job.py
deleted file mode 100644 (file)
index e00d833..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestJob(unittest.TestCase):
-    '''Test of the job command
-    '''
-
-    def test_job(self):
-        '''Test the job command
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the job command
-        sat.job("--jobs_config .test --name Job 1" )
-
-        ff = open(tmp_file, "r")
-        log_files = ff.readlines()
-        ff.close()
-        os.remove(tmp_file)
-        log_config = [line.replace("\n", "") for line in log_files if 'config.xml' in line]
-        
-        text = open(log_config[0], "r").read()
-
-        if "nb_proc" in text:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-
-    def test_failing_job(self):
-        '''Test the job command with a failing command
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the job command
-        res = sat.job("--jobs_config .test --name Job 4" )
-
-        if res == 1:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_file_conf_not_found(self):
-        '''Test the job command with a wrong file configuration
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the job command
-        res = sat.job("--jobs_config NOTEXIST --name Job 4" )
-
-        if res == 1:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_no_option_jobs_config(self):
-        '''Test the job command without --jobs_config option
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the job command
-        res = sat.job("--name Job 4" )
-
-        if res == 1:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_job_not_found(self):
-        '''Test the job command without --jobs_config option
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the job command
-        res = sat.job("--jobs_config .test --name NOTEXIST" )
-
-        if res == 1:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_description(self):
-        '''Test the sat -h job
-        '''        
-
-        OK = "KO"
-
-        import job
-        
-        if "Executes the commands of the job defined in the jobs configuration file" in job.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/jobs/test_jobs.py b/test/jobs/test_jobs.py
deleted file mode 100644 (file)
index 2bd73a2..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from salomeTools import Sat
-from tools import outRedirection
-import HTMLTestRunner
-
-class TestJobs(unittest.TestCase):
-    '''Test of the jobs command
-    '''
-
-    def test_jobs(self):
-        '''Test the jobs command
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the jobs command
-        sat.jobs("--name .test --publish" )
-
-        ff = open(tmp_file, "r")
-        log_files = ff.readlines()
-        ff.close()
-        os.remove(tmp_file)
-        log_jobs = [line.replace("\n", "") for line in log_files if 'jobs.xml' in line]
-        
-        text = open(log_jobs[0], "r").read()
-        
-        expected_res = [
-        "Establishing connection with all the machines",
-        "Executing the jobs",
-        "Results for job"
-        ]
-        
-        res = 0
-        for exp_res in expected_res:
-            if exp_res not in text:
-                res += 1
-        
-        if res == 0:
-            OK = 'OK'
-                         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_jobs_only_jobs(self):
-        '''Test the jobs command with option --only_jobs
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the jobs command
-        sat.jobs("--name .test --publish --only_jobs Job 1" )
-
-        ff = open(tmp_file, "r")
-        log_files = ff.readlines()
-        ff.close()
-        os.remove(tmp_file)
-        log_jobs = [line.replace("\n", "") for line in log_files if 'jobs.xml' in line]
-        
-        text = open(log_jobs[0], "r").read()
-        
-        expected_res = [
-        "Establishing connection with all the machines",
-        "Executing the jobs",
-        "Results for job"
-        ]
-        
-        res = 0
-        for exp_res in expected_res:
-            if exp_res not in text:
-                res += 1
-        
-        if res == 0:
-            OK = 'OK'
-                         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_no_option_name(self):
-        '''Test the jobs command without --name option
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the job command
-        res = sat.jobs()
-
-        if res == 1:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-        
-    def test_file_conf_not_found(self):
-        '''Test the jobs command with a wrong file configuration
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the job command
-        res = sat.jobs("--name NOTEXIST" )
-
-        if res == 1:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_option_list(self):
-        '''Test the display of the right value of "sat jobs --list"
-        '''
-        
-        OK = "KO"
-
-        # output redirection
-        my_out = outRedirection()
-
-        # The command to test
-        sat = Sat()
-        sat.jobs('--list')
-
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-
-        # get results
-        if "ERROR" not in res:
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_description(self):
-        '''Test the sat -h jobs
-        '''        
-
-        OK = "KO"
-
-        import jobs
-        
-        if "The jobs command launches maintenances that are described in the dedicated jobs configuration file." in jobs.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/log/launch_browser.py b/test/log/launch_browser.py
deleted file mode 100644 (file)
index 3b1677b..0000000
+++ /dev/null
@@ -1,346 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-import threading
-import time
-import shutil
-import io
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from salomeTools import Sat
-from tools import check_proc_existence_and_kill_multi
-import HTMLTestRunner
-
-sleep_time = 2
-
-class TestLog(unittest.TestCase):
-    '''Test of log command: launch of browser
-    '''
-           
-    def test_write_xmllog(self):
-        '''Test the write of xml log when invoking a command
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-        sat.config('appli-test -v USER.browser')
-        
-        # get log file path
-        logDir = sat.cfg.USER.log_dir
-        logPath = os.path.join(logDir, sat.cfg.VARS.datehour + "_" + sat.cfg.VARS.command + ".xml")
-        
-        if os.path.exists(logPath):
-            OK = "OK"
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_option_terminal(self):
-        '''Test the terminal option without application
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-        
-        one = u"1"
-        sys.stdin = io.StringIO(one)
-        
-        
-        try:
-            sat.log('-t')
-            OK = "OK"
-            sys.stdin = sys.__stdin__
-        except:
-            sys.stdin = sys.__stdin__
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_option_terminal2(self):
-        '''Test the terminal option with application
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-              
-        sat.config('appli-test -v VARS.python')
-        
-        one = u"1"
-        sys.stdin = io.StringIO(one)
-        
-        try:
-            sat.log('appli-test -t --last')
-            OK = "OK"
-            sys.stdin = sys.__stdin__
-        except:
-            pass
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_option_terminal3(self):
-        '''Test the terminal option with 0 as input
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-              
-        sat.config('appli-test -v VARS.python')
-        
-        zero = u"0\n1"
-        sys.stdin = io.StringIO(zero)
-        
-        try:
-            sat.log('--terminal')
-            OK = "OK"
-        finally:
-            sys.stdin = sys.__stdin__
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_option_terminal4(self):
-        '''Test the terminal option with input bigger than the number of logs
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-              
-        sat.config('appli-test -v VARS.python')
-        
-        nb_logs = len(os.listdir(sat.cfg.USER.log_dir))
-        
-        nb_logs_u = unicode(str(nb_logs) + "\n1")
-        sys.stdin = io.StringIO(nb_logs_u)
-        
-        try:
-            sat.log('--terminal')
-            OK = "OK"
-        finally:
-            sys.stdin = sys.__stdin__
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_option_terminal5(self):
-        '''Test the terminal option with input return
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-              
-        sat.config('appli-test -v VARS.python')
-        
-        ret = unicode("\n0")
-        sys.stdin = io.StringIO(ret)
-        
-        try:
-            sat.log('--terminal')
-            OK = "OK"
-        finally:
-            sys.stdin = sys.__stdin__
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_option_terminal6(self):
-        '''Test the terminal option with input not int
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-              
-        sat.config('appli-test -v VARS.python')
-        
-        ret = unicode("blabla\n0")
-        sys.stdin = io.StringIO(ret)
-        
-        try:
-            sat.log('--terminal')
-            OK = "OK"
-        finally:
-            sys.stdin = sys.__stdin__
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_option_terminal7(self):
-        '''Test the terminal option and option last
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-        
-        try:
-            sat.log('--terminal --last')
-            OK = "OK"
-        finally:
-            sys.stdin = sys.__stdin__
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-    
-    def test_option_last(self):
-        '''Test the option --last
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat("-oUSER.browser='konqueror'")
-              
-        sat.config('appli-test -v VARS.python')
-        
-        
-        time.sleep(sleep_time)
-        cmd_log = threading.Thread(target=sat.log, args=('appli-test --last',))
-        cmd_log.start()
-        
-        time.sleep(sleep_time)
-
-        browser = sat.cfg.USER.browser
-        pid = check_proc_existence_and_kill_multi(browser + ".*" + "xml", 10)
-        
-        if pid:
-            OK = "OK"
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-    
-    def test_option_clean(self):
-        '''Test the option --clean
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-               
-        sat.config('-v VARS.user')
-        
-        nb_logs_t0 = len(os.listdir(sat.cfg.USER.log_dir))
-
-        sat.log('--clean 1')
-        
-        nb_logs_t1 = len(os.listdir(sat.cfg.USER.log_dir))
-        
-        if nb_logs_t1-nb_logs_t0 == 0:
-            OK = "OK"
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_option_clean2(self):
-        '''Test the option --clean with big number of files to clean
-        '''
-
-        OK = "KO"
-        
-        # launch the command that will write a log
-        sat = Sat()
-               
-        sat.config('-v VARS.user')
-        
-        nb_logs_t0 = len(os.listdir(sat.cfg.USER.log_dir))
-        
-        if os.path.exists(sat.cfg.USER.log_dir + "_save"):
-            shutil.rmtree(sat.cfg.USER.log_dir + "_save")
-        shutil.copytree(sat.cfg.USER.log_dir,sat.cfg.USER.log_dir + "_save")
-        
-        sat.log('--clean ' + str(nb_logs_t0))
-        
-        nb_logs_t1 = len(os.listdir(sat.cfg.USER.log_dir))
-        
-        shutil.rmtree(sat.cfg.USER.log_dir)
-        shutil.move(sat.cfg.USER.log_dir + "_save", sat.cfg.USER.log_dir)
-                
-        if nb_logs_t0-nb_logs_t1 > 10:
-            OK = "OK"
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-    
-    """
-    def test_option_full(self):
-        '''Test the option --full
-        '''
-
-        OK = "KO"
-
-        sat = Sat("-oUSER.browser='konqueror'")
-        time.sleep(sleep_time)
-        cmd_log = threading.Thread(target=sat.log, args=('--full',))
-        cmd_log.start()
-
-        time.sleep(sleep_time)
-
-        browser = sat.cfg.USER.browser
-        check_proc_existence_and_kill_multi(browser + ".*" + "hat\.xml", 10)
-        
-        # Read and check the hat.xml file contains at least one log file corresponding to log
-        hatFilePath = os.path.join(sat.cfg.USER.log_dir, "hat.xml")
-        xmlHatFile = src.xmlManager.ReadXmlFile(hatFilePath)
-        for field in xmlHatFile.xmlroot:
-            if field.attrib[b'cmd'] == b'log':
-                OK = "OK"
-                break
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-    """
-    def test_description(self):
-        '''Test the sat -h log
-        '''        
-
-        OK = "KO"
-
-        import log
-        
-        if "Gives access to the logs produced" in log.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/log/launch_browser2.py b/test/log/launch_browser2.py
deleted file mode 100644 (file)
index dc5a7ec..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-import threading
-import time
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from salomeTools import Sat
-from tools import check_proc_existence_and_kill_multi
-import HTMLTestRunner
-
-sleep_time = 2
-
-class TestLog(unittest.TestCase):
-    '''Test of log command: launch of browser
-    '''
-    def test_launch_browser(self):
-        '''Test the launch of browser when invoking the log command
-        '''
-
-        OK = "KO"
-
-        sat = Sat("-oUSER.browser='konqueror'")
-        time.sleep(sleep_time)
-        cmd_log = threading.Thread(target=sat.log, args=('',))
-        cmd_log.start()
-
-        time.sleep(sleep_time)
-        
-        sat.config("")
-        browser = sat.cfg.USER.browser
-        pid = check_proc_existence_and_kill_multi(browser + ".*" + "hat\.xml", 10)
-
-        if pid:
-            OK = "OK"
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/prepare/test_clean.py b/test/prepare/test_clean.py
deleted file mode 100644 (file)
index 910899d..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from tools import outRedirection
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-import src.product
-
-class TestClean(unittest.TestCase):
-    '''Test of the clean command
-    '''
-
-    def test_clean_no_args(self):
-        '''Test the clean command with no arguments (nothing to clean)
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-
-        sat = Sat()
-
-        # output redirection
-        my_out = outRedirection()
-        
-        sat.clean(appli)
-        
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-        
-        if "Nothing to suppress" in res:
-            OK = 'OK'
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_clean_sources(self):
-        '''Test the clean of sources
-        '''
-        OK = "KO"
-
-        appli = 'appli-test'
-        product_name = "PRODUCT_GIT"
-
-        sat = Sat()      
-        
-        # Make sure the sources exist
-        sat.prepare(appli + " -p " + product_name)
-        
-        # Call the command
-        sat.clean(appli + " -p " + product_name + " --sources", batch=True)
-           
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        
-        if not os.path.exists(expected_src_dir):
-            OK = "OK"
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_clean_build(self):
-        '''Test the clean of build
-        '''
-        OK = "KO"
-
-        appli = 'appli-test'
-        product_name = "PRODUCT_GIT"
-
-        sat = Sat()      
-        
-        # Make sure the build exists
-        sat.prepare(appli + " -p " + product_name)
-        sat.configure(appli + " -p " + product_name)
-        
-        # Call the command
-        sat.clean(appli + " -p " + product_name + " --build", batch=True)
-           
-        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
-        
-        if not os.path.exists(expected_build_dir):
-            OK = "OK"
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_clean_install(self):
-        '''Test the clean of install
-        '''
-        OK = "KO"
-
-        appli = 'appli-test'
-        product_name = "PRODUCT_GIT"
-
-        sat = Sat()      
-        
-        # Make sure the build exists
-        sat.prepare(appli + " -p " + product_name)
-        sat.configure(appli + " -p " + product_name)
-        
-        # Call the command
-        sat.clean(appli + " -p " + product_name + " --install", batch=True)
-           
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        
-        if not os.path.exists(expected_install_dir):
-            OK = "OK"
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_clean_all(self):
-        '''Test the clean of all (build, src, install)
-        '''
-        OK = "KO"
-
-        appli = 'appli-test'
-        product_name = "PRODUCT_GIT"
-
-        sat = Sat()      
-        
-        # Make sure the build exists
-        sat.prepare(appli + " -p " + product_name)
-        sat.compile(appli + " -p " + product_name)
-        
-        # Call the command
-        sat.clean(appli + " -p " + product_name + " --all", batch=True)
-           
-        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        
-        if not os.path.exists(expected_install_dir) and not os.path.exists(expected_build_dir) and not os.path.exists(expected_src_dir):
-            OK = "OK"
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-    def test_clean_sources_without_dev(self):
-        '''Test the clean with sources_without_dev option
-        '''
-        OK = "KO"
-
-        appli = 'appli-test'
-        product_name = "PRODUCT_GIT"
-        product_name2 = "PRODUCT_DEV"
-
-        sat = Sat()      
-        
-        # Make sure the build exists
-        sat.prepare(appli + " -p " + product_name + "," + product_name2)
-        
-        # Call the command
-        sat.clean(appli + " -p " + product_name + " --sources_without_dev", batch=True)
-           
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        expected_src_dir2 = src.product.get_product_config(sat.cfg, product_name2).source_dir
-        
-        if not os.path.exists(expected_src_dir) and os.path.exists(expected_src_dir2):
-            OK = "OK"
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-
-    def test_description(self):
-        '''Test the sat -h clean
-        '''        
-
-        OK = "KO"
-
-        import clean
-        
-        if "The clean command suppress the source, build, or install" in clean.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/prepare/test_patch.py b/test/prepare/test_patch.py
deleted file mode 100644 (file)
index 09d8466..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-import shutil
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from tools import outRedirection
-
-import src.product
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestPatch(unittest.TestCase):
-    '''Test of the patch command
-    '''
-
-    def test_patch_dev(self):
-        '''Test the patch command with a product in dev mode
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_DEV'
-
-        sat = Sat("-oUSER.output_level=2")
-               
-        sat.config(appli)
-        
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
-        expected_text = 'HELLO WORLD\n'
-        
-        if os.path.exists(expected_src_dir):
-            shutil.rmtree(expected_src_dir)
-        
-        sat.source(appli + ' --product ' + product_name)
-        
-        f = open(expected_file_path, 'r')
-        text = f.readlines()[0]
-        OK1 = 'KO'
-        if text == expected_text:
-            OK1 = 'OK'
-       
-        sat.patch(appli + ' --product ' + product_name)
-        
-        new_expected_text = 'HELLO WORLD MODIFIED\n'
-        f = open(expected_file_path, 'r')
-        text = f.readlines()[0]
-        
-        OK2 = 'KO'
-        if text == new_expected_text:
-            OK2 = 'OK'         
-
-        if (OK1, OK2)==('OK', 'OK'):
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_no_sources_found(self):
-        '''Test the patch command with a product with no sources found
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_DEV'
-
-        sat = Sat('')
-        sat.config(appli)
-        
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        
-        if os.path.exists(expected_src_dir):
-            shutil.rmtree(expected_src_dir)
-               
-        # output redirection
-        my_out = outRedirection()
-        
-        sat.patch(appli + ' --product ' + product_name)
-        
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-        
-        if "No sources found for the " + product_name +" product" in res:
-            OK = 'OK'
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_no_patch(self):
-        '''Test the patch command with a product without patch
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_ARCHIVE'
-
-        sat = Sat('-v4')
-                      
-        sat.source(appli + ' --product ' + product_name)
-               
-        # output redirection
-        my_out = outRedirection()
-        
-        sat.patch(appli + ' --product ' + product_name)
-        
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-        
-        if "No patch for the " + product_name +" product" in res:
-            OK = 'OK'
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_invalid_patch(self):
-        '''Test the patch command with a product with a not valid patch
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_DEV'
-
-        sat = Sat("-oPRODUCTS.PRODUCT_DEV.default.patches=['/']")
-                      
-        sat.source(appli + ' --product ' + product_name)
-               
-        # output redirection
-        my_out = outRedirection()
-        
-        sat.patch(appli + ' --product ' + product_name)
-        
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-        
-        if "Not a valid patch" in res:
-            OK = 'OK'
-        
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_description(self):
-        '''Test the sat -h patch
-        '''        
-
-        OK = "KO"
-
-        import patch
-        
-        if "The patch command apply the patches on the sources of" in patch.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/prepare/test_prepare.py b/test/prepare/test_prepare.py
deleted file mode 100644 (file)
index bebeeca..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-import shutil
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-import src
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestPrepare(unittest.TestCase):
-    '''Test of the prepare command
-    '''
-
-    def test_prepare_dev(self):
-        '''Test the prepare command with a product in dev mode
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_DEV'
-
-        sat = Sat()
-               
-        sat.config(appli)
-        
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
-        expected_text = 'HELLO WORLD\n'
-        
-        if os.path.exists(expected_src_dir):
-            shutil.rmtree(expected_src_dir)
-        
-        sat.prepare(appli + ' --product ' + product_name)
-        
-        f = open(expected_file_path, 'r')
-        text = f.readlines()[0]
-        if text == expected_text:
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_prepare_all(self):
-        '''Test the prepare command with all products
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_DEV'
-
-        sat = Sat()
-        sat.config(appli)
-        
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
-        expected_text = 'HELLO WORLD\n'
-        
-        if os.path.exists(expected_src_dir):
-            shutil.rmtree(expected_src_dir)
-        
-        sat.prepare(appli)
-        
-        f = open(expected_file_path, 'r')
-        text = f.readlines()[0]
-        if text == expected_text:
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_prepare_option_sample_and_force(self):
-        '''Test the prepare command with all products
-        '''
-        OK = 'KO'
-
-        appli = 'appli-test'
-
-        sat = Sat()
-        sat.config(appli)
-       
-        try:
-            sat.prepare(appli + " --force --force_patch")
-            OK = 'OK'
-        except:
-            pass
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_description(self):
-        '''Test the sat -h prepare
-        '''        
-
-        OK = "KO"
-
-        import prepare
-        
-        if "The prepare command gets the sources" in prepare.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/prepare/test_source.py b/test/prepare/test_source.py
deleted file mode 100644 (file)
index 7eca3d4..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from tools import outRedirection
-
-import src.product
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestSource(unittest.TestCase):
-    '''Test of the source command
-    '''
-    
-    def test_source_archive(self):
-        '''Test the source command with archive product
-        '''
-        appli = 'appli-test'
-        product_name = 'PRODUCT_ARCHIVE'
-
-        sat = Sat()
-        sat.source(appli + ' --product ' + product_name)
-
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
-        expected_text = 'HELLO WORLD\n'
-
-        f = open(expected_file_path, 'r')
-        text = f.read()
-
-        # pyunit method to compare 2 str
-        self.assertEqual(text, expected_text)
-        
-    def test_source_git(self):
-        '''Test the source command with git product
-        '''
-        appli = 'appli-test'
-        product_name = 'PRODUCT_GIT'
-
-        sat = Sat()
-        sat.source(appli + ' --product ' + product_name)
-
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
-        expected_text = 'HELLO WORLD\n'
-
-        f = open(expected_file_path, 'r')
-        text = f.read()
-
-        # pyunit method to compare 2 str
-        self.assertEqual(text, expected_text)
-
-    def test_source_cvs(self):
-        '''Test the source command with cvs product
-        '''
-        appli = 'appli-test'
-        product_name = 'PRODUCT_CVS'
-
-        sat = Sat()
-        sat.source(appli + ' --product ' + product_name)
-
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        expected_file_path = os.path.join(expected_src_dir, 'README.FIRST.txt')
-        expected_text = 'Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE\n'
-
-        f = open(expected_file_path, 'r')
-        text = f.readlines()[0]
-
-        # pyunit method to compare 2 str
-        self.assertEqual(text, expected_text)
-    
-    """
-    def test_source_svn(self):
-        '''Test the source command with svn product
-        '''
-        OK = 'KO'
-        
-        appli = 'appli-test'
-        product_name = 'PRODUCT_SVN'
-
-        sat = Sat()
-        sat.source(appli + ' --product ' + product_name)
-
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
-        expected_file_path = os.path.join(expected_src_dir, 'scripts', 'README')
-        expected_text = 'this directory contains scripts used by salomeTool'
-
-        f = open(expected_file_path, 'r')
-        text = f.readlines()[0]
-        
-        if expected_text in text:
-            OK = 'OK'
-         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-    """
-
-    def test_source_native(self):
-        '''Test the source command with native product
-        '''
-        OK = 'KO'
-        
-        appli = 'appli-test'
-        product_name = 'PRODUCT_NATIVE'
-
-        sat = Sat()
-        sat.source(appli + ' --product ' + product_name)
-
-        expected_src_dir = os.path.join(sat.cfg.APPLICATION.workdir, 'SOURCES', product_name)
-        if not os.path.exists(expected_src_dir):
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_source_fixed(self):
-        '''Test the source command with fixed product
-        '''
-        OK = 'KO'
-        
-        appli = 'appli-test'
-        product_name = 'PRODUCT_FIXED'
-
-        sat = Sat()
-        sat.source(appli + ' --product ' + product_name)
-
-        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
-
-        if os.path.exists(expected_src_dir):
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-    """    
-    def test_source_unknown(self):
-        '''Test the source command with unknown product
-        '''
-        OK = 'KO'
-
-        # output redirection
-        my_out = outRedirection()
-
-        appli = 'appli-test'
-        product_name = 'PRODUCT_UNKNOWN'
-
-        sat = Sat()
-        sat.source(appli + ' --product ' + product_name)
-
-        # stop output redirection
-        my_out.end_redirection()
-
-        # get results
-        res = my_out.read_results()
-
-        if "Unknown get source method" in res:
-            OK = 'OK'
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-    """
-
-    def test_description(self):
-        '''Test the sat -h source
-        '''        
-
-        OK = "KO"
-
-        import source
-        
-        if "gets the sources of the application" in source.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/run_all.sh b/test/run_all.sh
deleted file mode 100755 (executable)
index d17df07..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env bash
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2013  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-echo "Begin date:"
-date
-echo
-echo "Remove old results ... "
-rm -rf .coverage htmlcov
-echo "Done"
-echo
-echo "****************************"
-coverage run --source=../commands/config.py    config/option_value.py > test_res.html
-coverage run --source=../commands/config.py -a config/option_value_2.py >> test_res.html
-coverage run --source=../commands/config.py -a config/create_user_pyconf.py >> test_res.html
-coverage run --source=../commands/config.py -a config/option_copy.py >> test_res.html
-coverage run --source=../commands/config.py -a config/option_edit.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/log.py,../src/xmlManager.py,../src/logger.py -a log/launch_browser.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/log.py,../src/xmlManager.py,../src/logger.py -a log/launch_browser2.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/source.py,../commands/patch.py,../commands/prepare.py -a prepare/test_source.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/source.py,../commands/patch.py,../commands/prepare.py -a prepare/test_patch.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/source.py,../commands/patch.py,../commands/prepare.py -a prepare/test_prepare.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/source.py,../commands/patch.py,../commands/prepare.py,../commands/clean.py -a prepare/test_clean.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/environ.py -a environ/test_environ.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/configure.py,../commands/environ.py -a compilation/test_configure.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/make.py,../commands/environ.py -a compilation/test_make.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/makeinstall.py,../commands/environ.py -a compilation/test_makeinstall.py >> test_res.html
-coverage run --source=../commands/config.py,../commands/compile.py,../commands/configure.py,../commands/make.py,../commands/makeinstall.py,../commands/environ.py -a compilation/test_compilation.py >> test_res.html
-coverage run --source=../commands/shell.py -a shell/test_shell.py >> test_res.html
-coverage run --source=../commands/job.py -a job/test_job.py >> test_res.html
-coverage run --source=../commands/jobs.py -a jobs/test_jobs.py >> test_res.html
-coverage run --source=../commands/test.py,../src/test_module.py,../src/fork.py -a test/test_command.py >> test_res.html
-echo "****************************"
-echo
-echo "building html coverage"
-coverage html
-echo "Done"
-echo
-echo "End date:"
-date
-echo
-
-#firefox test_res.html htmlcov/index.html
diff --git a/test/shell/test_shell.py b/test/shell/test_shell.py
deleted file mode 100644 (file)
index 56b0ce6..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestShell(unittest.TestCase):
-    '''Test of the shell command
-    '''
-
-    def test_shell(self):
-        '''Test the shell command with the --command option
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        sat.config()
-        sat_way = sat.cfg.VARS.salometoolsway
-        
-        # Execute the shell command
-        sat.shell("--command ls " + sat_way)
-
-        ff = open(tmp_file, "r")
-        log_files = ff.readlines()
-        ff.close()
-        os.remove(tmp_file)
-        log_files = [line.replace("\n", "") for line in log_files]
-        
-        text = open(log_files[2], "r").read()
-
-        if "salomeTools.py" in text:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_failing_shell(self):
-        '''Test the shell command with the --command option with a failing command
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-
-        sat = Sat("-l " + tmp_file)
-        
-        sat.config()
-        
-        # Execute the shell command
-        res = sat.shell("--command i_fail")
-
-        ff = open(tmp_file, "r")
-        log_files = ff.readlines()
-        ff.close()
-        os.remove(tmp_file)
-        log_files = [line.replace("\n", "") for line in log_files]
-        
-        text = open(log_files[2], "r").read()
-
-        if "i_fail" in text and res == 1:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_description(self):
-        '''Test the sat -h shell
-        '''        
-
-        OK = "KO"
-
-        import shell
-        
-        if "Executes the shell command passed as argument" in shell.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/test/test_command.py b/test/test/test_command.py
deleted file mode 100644 (file)
index ed67701..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/usr/bin/env python
-#-*- coding:utf-8 -*-
-#  Copyright (C) 2010-2012  CEA/DEN
-#
-#  This library is free software; you can redistribute it and/or
-#  modify it under the terms of the GNU Lesser General Public
-#  License as published by the Free Software Foundation; either
-#  version 2.1 of the License.
-#
-#  This library is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-#  Lesser General Public License for more details.
-#
-#  You should have received a copy of the GNU Lesser General Public
-#  License along with this library; if not, write to the Free Software
-#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-
-import unittest
-import os
-import sys
-
-# get execution path
-testdir = os.path.dirname(os.path.realpath(__file__))
-sys.path.append(os.path.join(testdir, '..', '..'))
-sys.path.append(os.path.join(testdir, '..', '_testTools'))
-sys.path.append(os.path.join(testdir, '..', '..','commands'))
-
-from salomeTools import Sat
-import HTMLTestRunner
-
-class TestTest(unittest.TestCase):
-    '''Test of the test command
-    '''
-
-    def test_test(self):
-        '''Test the test command
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-        application = "SALOME-7.8.0"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the job command
-        sat.test(application + " --grid GEOM --session light" )
-
-        ff = open(tmp_file, "r")
-        log_files = ff.readlines()
-        ff.close()
-        os.remove(tmp_file)
-        log_testboard = [line.replace("\n", "") for line in log_files if 'testboard.xml' in line]
-        
-        text = open(log_testboard[0], "r").read()
-
-        if '<session name="light">' in text:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_PY_test(self):
-        '''Test the test command with PY type
-        '''
-        OK = 'KO'
-        tmp_file = "/tmp/test.txt"
-        application = "SALOME-7.8.0"
-
-        sat = Sat("-l " + tmp_file)
-        
-        # Execute the job command
-        sat.test(application + " --grid MED --session PY_test_withKernel" )
-
-        ff = open(tmp_file, "r")
-        log_files = ff.readlines()
-        ff.close()
-        os.remove(tmp_file)
-        log_testboard = [line.replace("\n", "") for line in log_files if 'testboard.xml' in line]
-        
-        text = open(log_testboard[0], "r").read()
-
-        if '<session name="PY_test_withKernel">' in text:
-            OK = 'OK'         
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, 'OK')
-
-    def test_description(self):
-        '''Test the sat -h test
-        '''        
-
-        OK = "KO"
-
-        import test
-        
-        if "The test command runs a test base on a SALOME installation" in test.description():
-            OK = "OK"
-
-        # pyunit method to compare 2 str
-        self.assertEqual(OK, "OK")
-
-# test launch
-if __name__ == '__main__':
-    HTMLTestRunner.main()
diff --git a/test/test_020_debug.py b/test/test_020_debug.py
new file mode 100755 (executable)
index 0000000..ead64c5
--- /dev/null
@@ -0,0 +1,130 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import initializeTest # set PATH etc for test
+
+import src.debug as DBG # Easy print stderr (for DEBUG only)
+import src.pyconf as PYF # 0.3.7
+
+_EXAMPLES = {
+1 : """\
+  messages:
+  [
+    {
+      stream : "sys.stderr" # modified
+      message: 111 # modified
+      name: 'Harry'
+    }
+    {
+      stream : $messages[0].stream
+      message: 1.23e4 # modified do not work 0.3.7
+      name: 'Ruud'
+    }
+    {
+      stream : "HELLO " + $messages[0].stream
+      message: 'Bienvenue'
+      name: "Yves"
+    }
+  ]
+""",
+
+2 : """\
+  aa: 111
+  bb: $aa + 222
+""",
+
+3 : """\
+  aa: Yves
+  bb: "Herve" # avoid Hervé -> 'utf8' codec can't decode byte
+""",
+
+4 : """\
+  aa: Yves
+  bb: "Hervé" # avoid Hervé -> 'utf8' codec can't decode byte
+""",
+
+
+}
+
+
+class TestCase(unittest.TestCase):
+  "Test the debug.py"""
+  
+  def test_000(self):
+    # one shot setUp() for this TestCase
+    # DBG.push_debug(True)
+    # SAT.setNotLocale() # test english
+    return
+    
+  def test_005(self):
+    res = DBG.getLocalEnv()
+    self.assertTrue(len(res.split()) > 0)
+    self.assertTrue("USER :" in res)
+    self.assertTrue("LANG :" in res)
+       
+  def test_010(self):
+    inStream = DBG.InStream(_EXAMPLES[1])
+    self.assertEqual(inStream.getvalue(), _EXAMPLES[1])
+    cfg = PYF.Config(inStream)
+    self.assertEqual(len(cfg.messages), 3)
+    outStream = DBG.OutStream()
+    DBG.saveConfigStd(cfg, outStream)
+    res = outStream.value
+    DBG.write("test_010 cfg std", res)
+    self.assertTrue("messages :" in res)
+    self.assertTrue("'sys.stderr'" in res)
+    
+  def test_020(self):
+    inStream = DBG.InStream(_EXAMPLES[2])
+    cfg = PYF.Config(inStream)
+    res = DBG.getStrConfigDbg(cfg)
+    DBG.write("test_020 cfg dbg", res)
+    ress = res.split("\n")
+    self.assertTrue(".aa" in ress[0])
+    self.assertTrue(": '111'" in ress[0])
+    self.assertTrue(".bb" in ress[1])
+    self.assertTrue(": $aa + 222 " in ress[1])
+    self.assertTrue("--> '333'" in ress[1])
+    
+  def test_025(self):
+    inStream = DBG.InStream(_EXAMPLES[1])
+    cfg = PYF.Config(inStream)
+    outStream = DBG.OutStream()
+    DBG.saveConfigDbg(cfg, outStream)
+    res = outStream.value
+    DBG.write("test_025 cfg dbg", res)
+    for i in range(len(cfg.messages)):
+      self.assertTrue("messages[%i].name" % i in res)
+    self.assertTrue("--> 'HELLO sys.stderr'" in res)
+
+      
+  def test_999(self):
+    # one shot tearDown() for this TestCase
+    # SAT.setLocale() # end test english
+    # DBG.pop_debug()
+    return
+    
+if __name__ == '__main__':
+    unittest.main(exit=False)
+    pass
+
diff --git a/test/test_024_logging.py b/test/test_024_logging.py
new file mode 100755 (executable)
index 0000000..37e132a
--- /dev/null
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+"""
+see: http://sametmax.com/ecrire-des-logs-en-python
+
+|  # creation d'un formateur qui va ajouter le temps, le niveau
+|  # de chaque message quand on ecrira un message dans le log
+|  formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
+|
+|  # creation d'un handler qui va rediriger une ecriture du log vers
+|  # un fichier en mode 'append', avec 1 backup et une taille max de 1Mo
+|  file_handler = RotatingFileHandler('activity.log', 'a', 1000000, 1)
+|
+|  # on lui met le niveau sur DEBUG, on lui dit qu'il doit utiliser le formateur
+|  # cree precedement et on ajoute ce handler au logger
+|  file_handler.setLevel(logging.DEBUG)
+|  file_handler.setFormatter(formatter)
+|  logger.addHandler(file_handler)
+|   
+|  # creation d'un second handler qui va rediriger chaque ecriture de log
+|  # sur la console
+|  stream_handler = logging.StreamHandler()
+|  stream_handler.setLevel(logging.DEBUG)
+|  logger.addHandler(stream_handler)
+|
+|  # Après 3 heures, on peut enfin logguer
+|  # Il est temps de spammer votre code avec des logs partout :
+|  logger.info('Hello')
+|  logger.warning('Testing %s', 'foo')
+"""
+
+import os
+import sys
+import unittest
+import pprint as PP
+import logging as LOGI
+from logging.handlers import BufferingHandler
+
+import src.debug as DBG
+
+verbose = False #True
+
+_TRACE = LOGI.INFO - 2 # just below info
+
+class LoggerSat(LOGI.Logger):
+  """
+  Elementary prototype for logger sat
+  add a level TRACE as log.trace(msg) 
+  below log.info(msg)
+  above log.debug(msg)
+  to assume store long log asci in files txt under/outside files xml
+  
+  see: /usr/lib64/python2.7/logging/xxx__init__.py etc.
+  """
+  
+  def __init__(self, name, level=LOGI.INFO):
+    """
+    Initialize the logger with a name and an optional level.
+    """
+    super(LoggerSat, self).__init__(name, level)
+    LOGI.addLevelName(_TRACE, "TRACE")
+    # LOGI.TRACE = _TRACE # only for coherency,
+    
+  def trace(self, msg, *args, **kwargs):
+    """
+    Log 'msg % args' with severity '_TRACE'.
+
+    To pass exception information, use the keyword argument exc_info with
+    a true value, e.g.
+
+    logger.trace("Houston, we have a %s", "long trace to follow")
+    """
+    if self.isEnabledFor(_TRACE):
+        self._log(_TRACE, msg, args, **kwargs)
+
+class TestCase(unittest.TestCase):
+  "Test the debug.py"""
+  
+  initialLoggerClass = [] # to keep clean module logging
+  
+  def test_000(self):
+    # one shot setUp() for this TestCase
+    self.initialLoggerClass.append(LOGI._loggerClass)
+    LOGI.setLoggerClass(LoggerSat)
+    if verbose:
+      DBG.push_debug(True)
+      # DBG.write("assert unittest", [a for a in dir(self) if "assert" in a])
+    pass
+  
+  def test_999(self):
+    # one shot tearDown() for this TestCase
+    if verbose:
+      DBG.pop_debug()
+    LOGI.setLoggerClass(self.initialLoggerClass[0])
+    return
+  
+  def test_010(self):
+    # LOGI.setLoggerClass(LoggerSat) # done once in test_000
+    name = "testLogging"
+    lgr = LOGI.getLogger(name) # create it
+    lgr.setLevel("DEBUG")
+    self.assertEqual(lgr.__class__, LoggerSat)
+    self.assertEqual(lgr.name, name)
+    self.assertIn("trace", dir(lgr))
+    self.assertIn("TRACE", LOGI._levelNames.keys())
+    self.assertIn(_TRACE, LOGI._levelNames.keys())
+    self.assertEqual(LOGI.getLevelName(LOGI.INFO), "INFO")
+    self.assertEqual(LOGI.getLevelName(_TRACE), "TRACE")
+    
+    # creation d'un handler pour chaque log sur la console
+    formatter = LOGI.Formatter('%(levelname)-8s :: %(message)s')
+    # stream_handler = LOGI.handlers.StreamHandler() # log outputs in console
+    stream_handler = LOGI.handlers.BufferingHandler(1000) # log outputs in memory
+    stream_handler.setLevel(LOGI.DEBUG)
+    stream_handler.setFormatter(formatter)
+    lgr.addHandler(stream_handler)
+    # print # skip one line if outputs in console
+    lgr.warning("!!! test warning")
+    lgr.info("!!! test info")
+    lgr.trace("!!! test trace")
+    lgr.debug("!!! test debug")
+    self.assertEqual(len(stream_handler.buffer), 4)
+    rec = stream_handler.buffer[-1]
+    self.assertEqual(rec.levelname, "DEBUG")
+    self.assertEqual(rec.msg, "!!! test debug")
+    self.assertEqual(stream_handler.get_name(), None) # what to serve ?
+    
+  def test_020(self):
+    # LOGI.setLoggerClass(LoggerSat)
+    name = "testLogging"
+    lgr = LOGI.getLogger(name) #  find it as created yet in test_010
+    stream_handler = lgr.handlers[0]
+    rec = stream_handler.buffer[-1]
+    self.assertEqual(rec.levelname, "DEBUG")
+    self.assertEqual(rec.msg, "!!! test debug")
+
+      
+          
+    
+if __name__ == '__main__':
+    unittest.main(exit=False)
+    pass
+
diff --git a/test/test_035_pyconf.py b/test/test_035_pyconf.py
new file mode 100755 (executable)
index 0000000..a87dc7f
--- /dev/null
@@ -0,0 +1,266 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import initializeTest # set PATH etc for test
+
+import src.debug as DBG # Easy print stderr (for DEBUG only)
+import src.pyconf as PYF # 0.3.7
+
+_EXAMPLES = {
+1 : """\
+  messages:
+  [
+    {
+      stream : "sys.stderr" # modified
+      message: 'Welcome'
+      name: 'Harry'
+    }
+    {
+      stream : "sys.stdout" # modified
+      message: 'Welkom'
+      name: 'Ruud'
+    }
+    {
+      stream : $messages[0].stream
+      message: 'Bienvenue'
+      name: "Yves"
+    }
+  ]
+""",
+
+2 : """\
+  aa: 111
+  bb: $aa + 222
+""",
+
+3 : """\
+  aa: Yves
+  bb: "Herve" # avoid Hervé -> 'utf8' codec can't decode byte
+""",
+
+4 : """\
+  aa: Yves
+  bb: "Hervé" # avoid Hervé -> 'utf8' codec can't decode byte
+""",
+
+5 : """\
+  aa: Yves
+  bb: "Herve"
+  cc: [ 
+    cc1
+    cc2
+    cc3
+    $bb + " hello"
+    ]
+  dd: { 
+   d1 : dd11 
+   d2 : dd22
+   d3 : dd33 
+   d4 : $bb + " bye"
+   }   
+""",
+
+# error circular
+6 : """\
+  aa: Yves
+  bb: $cc
+  cc: $bb
+""",
+
+7 : """\
+  aa: Yves
+  bb: $cc
+  cc: [ 
+    cc1
+    $bb
+    ]
+""",
+
+8 : """\
+  aa: Yves
+  bb: $cc
+  cc: { 
+    cc1: cc11
+    cc2: $bb
+    }
+""",
+
+}
+
+
+class TestCase(unittest.TestCase):
+  "Test the pyconf.py"""
+  
+  def test_000(self):
+    # one shot setUp() for this TestCase
+    # DBG.push_debug(True)
+    # SAT.setNotLocale() # test english
+    return
+
+  def test_010(self):
+    # pyconf.py doc example 0.3.7
+    # https://www.red-dove.com/config-doc/ is 0.3.9 !
+    # which, when run, would yield the console output:
+
+    expected = """\
+Welcome, Harry
+Welkom, Ruud
+Bienvenue, Yves
+"""
+    inStream = DBG.InStream(_EXAMPLES[1])
+    cfg = PYF.Config(inStream)
+    res = ''
+    for m in cfg.messages:
+        res += '%s, %s\n' % (m.message, m.name)
+    self.assertEqual(res, expected)
+    outStream = DBG.OutStream()
+    cfg.__save__(outStream) # sat renamed save() in __save__()
+    res = outStream.value
+    DBG.write("test_010 cfg", res)
+    self.assertTrue("name : 'Harry'" in res)
+    self.assertTrue("name : 'Ruud'" in res)
+    self.assertTrue("name : 'Yves'" in res)
+        
+  def test_020(self):
+    cfg = PYF.Config()
+    self.assertEqual(str(cfg), '{}')
+    self.assertEqual(cfg.__repr__(), '{}')
+    cfg.aa = "1111"
+    self.assertEqual(str(cfg), "{'aa': '1111'}")
+    cfg.bb = 2222
+    self.assertTrue("'bb': 2222" in str(cfg))
+    self.assertTrue("'aa': '1111'" in str(cfg))
+    cfg.cc = 3333.
+    self.assertTrue("'cc': 3333." in str(cfg))
+    
+  def test_030(self):
+    inStream = DBG.InStream(_EXAMPLES[2])
+    cfg = PYF.Config(inStream)
+    self.assertEqual(str(cfg),  "{'aa': 111, 'bb': $aa + 222}")
+    self.assertEqual(cfg.aa, 111)
+    self.assertEqual(cfg.bb, 333)
+      
+  def test_040(self):
+    inStream = DBG.InStream(_EXAMPLES[3])
+    cfg = PYF.Config(inStream)
+    self.assertEqual(cfg.aa, "Yves")
+    self.assertEqual(cfg.bb, "Herve")
+    self.assertEqual(type(cfg.bb), str)
+    cfg.bb = "Hervé" # try this
+    self.assertEqual(type(cfg.bb), str)
+    self.assertEqual(cfg.bb, "Hervé")
+    
+  def test_045(self):
+    # make Hervé valid only with pyconf.py as 0.3.9
+    inStream = DBG.InStream(_EXAMPLES[4])
+    outStream = DBG.OutStream()
+    with self.assertRaises(Exception):
+      cfg = PYF.Config(inStream)
+
+    return # TODO only with pyconf.py as 0.3.9
+    cfg.save(outStream) # OK
+    # TODO: cfg = PYF.Config(inStream)
+    # cfg.__save__(outStream)  # KO and sat renamed save() in __save__()
+    res = outStream.value
+    DBG.write("test_045 cfg", res)
+    self.assertTrue("aa : 'Yves'" in res)
+    self.assertTrue(r"bb : 'Herv\xc3\xa9'" in res)
+    self.assertEqual(cfg.bb, "Hervé")
+    
+  def test_100(self):
+    inStream = DBG.InStream(_EXAMPLES[5])
+    outStream = DBG.OutStream()
+    cfg = PYF.Config(inStream) # KO
+    cfg.__save__(outStream) # sat renamed save() in __save__()
+    res = outStream.value
+    DBG.write("test_100 cfg save", res)
+    DBG.write("test_100 cfg debug", cfg)
+    DBG.write("test_100 cfg.cc debug", cfg.cc)
+    
+    cc = cfg.cc
+    # DBG.write("test_100 type cc[3]", dir(cc), True)
+    DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
+      
+  def test_100(self):
+    inStream = DBG.InStream(_EXAMPLES[5])
+    outStream = DBG.OutStream()
+    cfg = PYF.Config(inStream) # KO
+    cfg.__save__(outStream) # sat renamed save() in __save__()
+    res = outStream.value
+    DBG.write("test_100 cfg save", res)
+    DBG.write("test_100 cfg debug", cfg)
+    DBG.write("test_100 cfg.cc debug", cfg.cc)
+    
+    cc = cfg.cc
+    # DBG.write("test_100 type cc[3]", dir(cc), True)
+    DBG.write("test_100 cc", [cc.data[i] for i in range(len(cc))])
+      
+  def test_110(self):
+    inStream = DBG.InStream(_EXAMPLES[6])
+    outStream = DBG.OutStream()
+    cfg = PYF.Config(inStream)
+    cfg.__save__(outStream)
+    
+    res = outStream.value
+    DBG.write("test_110 cfg save", res)
+    self.assertNotIn("ERROR", res)
+    
+    res = DBG.getStrConfigDbg(cfg)
+    DBG.write("test_110 cfg debug", res)
+    self.assertIn("ERROR", res)
+    self.assertIn("unable to evaluate $cc", res)
+    self.assertIn("unable to evaluate $bb", res)
+    
+  def test_120(self):
+   for ii in [7, 8]:
+    inStream = DBG.InStream(_EXAMPLES[ii])
+    outStream = DBG.OutStream()
+    cfg = PYF.Config(inStream)
+    cfg.__save__(outStream)
+    
+    res = outStream.value
+    DBG.write("test_120 cfg save", res)
+    self.assertNotIn("ERROR", res)
+    
+    res = DBG.getStrConfigDbg(cfg)
+
+    DBG.write("test_120 cfg debug", res)
+    # no error circular !!!
+    # self.assertIn("ERROR", res) # no error circular !!!
+    # self.assertIn("unable to evaluate $cc", res)
+    # self.assertIn("unable to evaluate $bb", res)
+    res = cfg.bb
+    DBG.write("test_120 cfg.bb debug", res)
+
+    res = cfg.cc
+    DBG.write("test_120 cfg.cc debug", res)
+    
+  def test_999(self):
+    # one shot tearDown() for this TestCase
+    # SAT.setLocale() # end test english
+    # DBG.pop_debug()
+    return
+    
+if __name__ == '__main__':
+    unittest.main(exit=False)
+    pass
diff --git a/test/test_100_satHelp.py b/test/test_100_satHelp.py
new file mode 100755 (executable)
index 0000000..f11b9f3
--- /dev/null
@@ -0,0 +1,144 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import initializeTest # set PATH etc for test
+
+import src.salomeTools as SAT
+import src.debug as DBG # Easy print stderr (for DEBUG only)
+import src.loggingSimple as LOG
+
+class TestCase(unittest.TestCase):
+  "Test the sat --help commands"""
+  
+  debug = False
+  
+  def tearDown(self):
+    # print "tearDown", __file__
+    # assure self.logger clear for next test
+    logger = LOG.getUnittestLogger()
+    logs = logger.getLogsAndClear()
+    # using assertNotIn() is too much verbose
+    self.assertFalse("ERROR" in logs)
+    self.assertFalse("CRITICAL" in logs)
+  
+  def test_000(self):
+    logger = LOG.getUnittestLogger()
+    # one shot setUp() for this TestCase
+    if self.debug: DBG.push_debug(True)
+    SAT.setNotLocale() # test english
+
+  def test_999(self):
+    # one shot tearDown() for this TestCase
+    SAT.setLocale() # end test english
+    if self.debug: DBG.pop_debug()
+
+  def test_010(self): # TODO fix logger unittest
+    cmd = "sat --help"
+    res = SAT.launchSat(cmd)
+    self.assertTrue(res.isOk())
+    out = res.getValue()
+    self.assertTrue(" - config" in out)
+    self.assertTrue(" - prepare" in out)
+    self.assertTrue(" - compile" in out)
+
+  def test_011(self):
+    logger = LOG.getUnittestLogger()
+    cmd = "--help"
+    s = SAT.Sat(logger)
+    returnCode = s.execute_cli(cmd)
+    self.assertTrue(returnCode.isOk())
+    logs = logger.getLogs()
+    DBG.write("test_011 logger", logs)
+    self.assertTrue(" - config" in logs)
+    self.assertTrue(" - prepare" in logs)
+    self.assertTrue(" - compile" in logs)
+    
+  def test_030(self):
+    cmd = "sat config --help"
+    returnCode = SAT.launchSat(cmd)
+    self.assertTrue(returnCode.isOk())
+    out = returnCode.getValue()
+    DBG.write("test_030 stdout", out)
+    self.assertTrue("--value" in out)
+
+  def test_031(self):
+    logger = LOG.getUnittestLogger()
+    cmd = "config --help"
+    s = SAT.Sat(logger)
+    returnCode = s.execute_cli(cmd)
+    self.assertTrue(returnCode.isOk())
+    logs = logger.getLogs()
+    DBG.write("test_031 logger", logs)
+    self.assertTrue("--help" in logs)
+
+  def test_032(self):
+    logger = LOG.getUnittestLogger()
+    cmd = "prepare --help"
+    s = SAT.Sat(logger)
+    returnCode = s.execute_cli(cmd)
+    self.assertTrue(returnCode.isOk())
+    logs = logger.getLogs()
+    DBG.write("test_031 logger", logs)
+    self.assertTrue("--help" in logs)
+
+  def test_040(self):
+    logger = LOG.getUnittestLogger()
+    cmd = "config --list"
+    s = SAT.Sat(logger)
+    returnCode = s.execute_cli(cmd)
+    self.assertTrue(returnCode.isOk())
+    logs = logger.getLogs()
+    self.assertTrue("Applications" in logs)
+
+  def test_050(self):
+    cmds = SAT.getCommandsList()
+    DBG.write("test_050 getCommandsList", cmds)
+    for c in cmds:
+      cmd = "sat %s --help" % c
+      DBG.write("test_050", cmd)
+      returnCode = SAT.launchSat(cmd)
+      if not returnCode.isOk():
+        DBG.write("test_050 %s" % cmd, returnCode.getValue(), True)
+      self.assertTrue(returnCode.isOk())
+      out = returnCode.getValue()
+      DBG.write("test_050 %s stdout" % c, out)
+      self.assertTrue("The %s command" % c in out)
+      self.assertTrue("Available options" in out)
+      
+  def test_051(self):
+    logger = LOG.getUnittestLogger()
+    cmds = SAT.getCommandsList()
+    for c in cmds:
+      cmd = "%s --help" % c
+      DBG.write("test_051", cmd)
+      s = SAT.Sat(logger)
+      returnCode = s.execute_cli(cmd)
+      self.assertTrue(returnCode.isOk())
+      logs = logger.getLogsAndClear()
+      DBG.write(cmd, logs)
+      self.assertTrue("The %s command" % c in logs)
+      self.assertTrue("Available options" in logs)
+                
+if __name__ == '__main__':
+    unittest.main(exit=False)
+    pass
diff --git a/test/test_500_APPLI_TEST.py b/test/test_500_APPLI_TEST.py
new file mode 100755 (executable)
index 0000000..a2a8dd1
--- /dev/null
@@ -0,0 +1,130 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import initializeTest # set PATH etc for test
+
+import src.salomeTools as SAT
+import src.debug as DBG # Easy print stderr (for DEBUG only)
+import src.loggingSimple as LOG
+
+class TestCase(unittest.TestCase):
+  "Test the sat commands on APPLI_TEST configuration pyconf etc. files"""
+
+  debug = False
+  
+  # see test_100, # commands are expected OK
+  TRG = "APPLI_TEST" # "SALOME-8.4.0"
+  satCommandsToTestOk = [
+    "config -l",
+    "config -v .",
+    "config -g .",
+    "config %s --value ." %  TRG,
+    "config %s --debug ." %  TRG,
+    "config %s --info KERNEL" %  TRG,
+    "config %s --show_patchs" %  TRG,
+  ]
+  # see test_110, # commands are expected KO
+  satCommandsToTestKo = [
+    "config %s --info oops" %  TRG,
+    "config --oops",
+  ]
+  # see test_120, # commands are expected Raise,
+  # but if fixed go to satCommandsToTestKo
+  satCommandsToTestRaise = [
+    "oopsconfig --oops .",
+  ]
+  
+  def tearDown(self):
+    # print "tearDown", __file__
+    # assure self.logger clear for next test
+    logger = LOG.getUnittestLogger()
+    logs = logger.getLogsAndClear()
+    # using assertNotIn() is too much verbose
+    self.assertFalse("ERROR    ::" in logs)
+    self.assertFalse("CRITICAL ::" in logs)
+
+  def test_000(self):
+    logger = LOG.getUnittestLogger()
+    # one shot setUp() for this TestCase
+    if self.debug: DBG.push_debug(True)
+    SAT.setNotLocale()  # test english
+
+  def test_999(self):
+    # one shot tearDown() for this TestCase
+    SAT.setLocale() # end test english
+    if self.debug: DBG.pop_debug()
+
+  def test_010(self):
+    logger = LOG.getUnittestLogger()
+    DBG.write("test_010 logger", logger.name)
+    cmd = "config -l"
+    s = SAT.Sat(logger)
+    DBG.write("s.getConfig()", s.getConfig()) #none
+    DBG.write("s.__dict__", s.__dict__) # have 
+    returnCode = s.execute_cli(cmd)
+    DBG.write("test_010", returnCode)
+    logs = logger.getLogs()
+    DBG.write("test_010 logger", logs)
+    self.assertTrue(returnCode.isOk())
+    
+  def xtest_100(self): # TODO
+    # test all satCommands expected OK
+    logger = LOG.getUnittestLogger()
+    dbg = self.debug
+    for cmd in self.satCommandsToTestOk:
+      s = SAT.Sat(logger)
+      returnCode = s.execute_cli(cmd)
+      DBG.write("test_100 'sat %s'" % cmd, str(returnCode), dbg)
+      logs = logger.getLogsAndClear()
+      DBG.write("logs", logs, dbg)
+      # using assertNotIn() is too much verbose
+      self.assertFalse("ERROR    ::" in logs)
+      self.assertFalse("CRITICAL ::" in logs)
+      
+  def test_110(self):
+    # test all satCommands expected KO
+    logger = LOG.getUnittestLogger()
+    dbg = self.debug
+    for cmd in self.satCommandsToTestKo:
+      s = SAT.Sat(logger)
+      returnCode = s.execute_cli(cmd)
+      DBG.write("test_110 'sat %s'" % cmd, returnCode, dbg)
+      logs = logger.getLogsAndClear()
+      DBG.write("logs", logs, dbg)    
+      
+  def test_120(self):
+    # test all satCommands expected raise
+    logger = LOG.getUnittestLogger()
+    dbg = self.debug
+    for cmd in self.satCommandsToTestRaise:
+      s = SAT.Sat(logger)
+      DBG.write("test_120 'sat %s'" % cmd, "expected raise", dbg)
+      with self.assertRaises(Exception):
+        returnCode = s.execute_cli(cmd)
+      logs = logger.getLogsAndClear()
+      DBG.write("logs", logs, dbg)    
+      
+      
+if __name__ == '__main__':
+    unittest.main(exit=False)
+    pass
diff --git a/test/test_501_paramiko.py b/test/test_501_paramiko.py
new file mode 100755 (executable)
index 0000000..ab5f92b
--- /dev/null
@@ -0,0 +1,205 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+
+"""
+to set id_rsa from/to reflexive on local machine:
+
+    @is231761/home/wambeke/.ssh>ssh wambeke@is231761
+    Password: 
+    Last login: Thu Jun  7 13:34:07 2018 from is231761.intra.cea.fr
+    @is231761/home/wambeke>exit
+    déconnexion
+
+    @is231761/home/wambeke/.ssh> ssh-keygen
+    Generating public/private rsa key pair.
+    Enter file in which to save the key (/home/wambeke/.ssh/id_rsa): 
+    Enter passphrase (empty for no passphrase): 
+    Enter same passphrase again: 
+    Your identification has been saved in /home/wambeke/.ssh/id_rsa.
+    Your public key has been saved in /home/wambeke/.ssh/id_rsa.pub.
+    The key fingerprint is:
+    SHA256:V0IU/wkuCRw42rA5bHFgdJlzDx9EIJyWIBrkzkL3GNA wambeke@is231761
+    The key's randomart image is:
+    +---[RSA 2048]----+
+    |ooo.=+o*o=*.     |
+
+    |                 |
+    +----[SHA256]-----+
+
+    @is231761/home/wambeke/.ssh> ls
+    id_rsa  id_rsa.pub  known_hosts
+    @is231761/home/wambeke/.ssh> rm known_hosts
+    @is231761/home/wambeke/.ssh> ls
+    id_rsa  id_rsa.pub
+
+    @is231761/home/wambeke/.ssh> ssh wambeke@is231761
+    The authenticity of host 'is231761 (127.0.0.1)' can't be established.
+    ECDSA key fingerprint is SHA256:QvrU7Abrbily0bzMjYbRPeKCxDkXT9rQ6pSpcm+yFN4.
+    ECDSA key fingerprint is MD5:6c:95:b7:c7:cd:de:c5:07:8b:3a:9b:14:d1:69:6b:c6.
+    Are you sure you want to continue connecting (yes/no)? yes
+    Warning: Permanently added 'is231761' (ECDSA) to the list of known hosts.
+    Password: 
+    Last login: Thu Jun  7 13:35:07 2018 from is231761.intra.cea.fr
+    @is231761/home/wambeke>exit
+    déconnexion
+    Connection to is231761 closed.
+
+
+    @is231761/home/wambeke/.ssh> lst
+    total 124K
+    -rw-r--r--   1 wambeke lgls  170  7 juin  13:36 known_hosts
+    drwx------   2 wambeke lgls 4,0K  7 juin  13:36 .
+    -rw-r--r--   1 wambeke lgls  398  7 juin  13:35 id_rsa.pub
+    -rw-------   1 wambeke lgls 1,7K  7 juin  13:35 id_rsa
+    drwxr-xr-x 182 wambeke lmpe 104K  6 juin  13:39 ..
+
+
+
+    @is231761/home/wambeke/.ssh> ssh-copy-id -i ~/.ssh/id_rsa.pub is231761
+    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/wambeke/.ssh/id_rsa.pub"
+    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
+    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
+    Password: 
+
+    Number of key(s) added: 1
+
+    Now try logging into the machine, with:   "ssh 'is231761'"
+    and check to make sure that only the key(s) you wanted were added.
+
+    @is231761/home/wambeke/.ssh> ssh wambeke@is231761
+    Last login: Thu Jun  7 13:36:42 2018 from is231761.intra.cea.fr
+    @is231761/home/wambeke>exit
+    déconnexion
+    Connection to is231761 closed.
+
+"""
+
+import os
+import sys
+import unittest
+import getpass
+
+verbose = False
+
+class TestCase(unittest.TestCase):
+  "Test a paramiko connection"""
+
+  def setLoggerParamiko(self):
+    """to get logs of paramiko, useful if problems"""
+    import logging as LOGI
+    loggerPrmk = LOGI.getLogger("paramiko")
+    if len(loggerPrmk.handlers) != 0:
+       print("logging.__file__ %s" % LOGI.__file__)
+       print("logger paramiko have handler set yet, is a surprise")
+       return
+    if not verbose:
+       # stay as it, null
+       return
+
+    #set a paramiko logger verbose
+    handler = LOGI.StreamHandler()
+    msg = "create paramiko logger, with handler on stdout"
+    
+    # handler = LOGI.MemoryHandler()
+    # etc... https://docs.python.org/2/library/logging.handlers.html
+    # msg = "create paramiko logger, with handler in memory"
+
+    # original frm from paramiko
+    # frm = '%(levelname)-.3s [%(asctime)s.%(msecs)03d] thr=%(thread)-3d %(name)s: %(message)s' # noqa
+    frm = '%(levelname)-5s :: %(asctime)s :: %(name)s :: %(message)s'
+    handler.setFormatter(LOGI.Formatter(frm, '%y%m%d_%H%M%S'))
+    loggerPrmk.addHandler(handler)
+      
+    # logger is not notset but low, handlers needs setlevel greater
+    loggerPrmk.setLevel(LOGI.DEBUG)
+    handler.setLevel(LOGI.INFO) # LOGI.DEBUG) # may be other one
+
+    loggerPrmk.info(msg)
+
+
+  '''example from internet
+  def fetch_netmask(self, hostname, port=22):
+    private_key = os.path.expanduser('~/.ssh/id_rsa')
+    connection = open_ssh_connection('wambeke', hostname, port=port, key=private_key)
+
+    get_netmask = ("ip -oneline -family inet address show | grep {}").format(hostname)
+    stdin, stdout, stderr = connection.exec_command(get_netmask)
+    address = parse_address(hostname, stdout)
+    connection.close()
+    return address
+
+  def open_ssh_connection(self, username, hostname, port=22, key=None):
+    client = PK.SSHClient()
+    client.set_missing_host_key_policy(PK.AutoAddPolicy())
+    client.connect(hostname, port=port, timeout=5, username=username, key_filename=key)
+    return client
+  '''
+
+  def test_000(self):
+    self.setLoggerParamiko()
+    
+
+  def test_010(self):
+    # http://docs.paramiko.org/en/2.4/api/agent.html
+
+    try:
+      import paramiko as PK
+    except:
+      print("\nproblem 'import paramiko', no tests")
+      return
+
+    # port=22 # useless
+    username = getpass.getuser()
+    hostname = os.uname()[1]
+    aFile = "/tmp/%s_test_paramiko.tmp" % username
+    cmd = ("pwd; ls -alt {0}; cat {0}").format(aFile)
+    
+    # connect
+    client = PK.SSHClient()
+    client.set_missing_host_key_policy(PK.AutoAddPolicy())  
+    # client.connect(hostname, username=username, password="xxxxx")
+    # client.connect(hostname, username=username, passphrase="yyyy", key_filename="/home/wambeke/.ssh/id_rsa_satjobs_passphrase")
+    # client.connect(hostname, username=username)
+
+    # timeout in seconds
+    client.connect(hostname, username=username, timeout=1.)
+    
+    # obtain session
+    session = client.get_transport().open_session()
+    # Forward local agent
+    PK.agent.AgentRequestHandler(session)
+    # commands executed after this point will see the forwarded agent on the remote end.
+    
+    # one api
+    session.exec_command("date > %s" % aFile)
+    cmd = ("pwd; ls -alt {0}; cat {0} && echo OK").format(aFile)
+    # another api
+    stdin, stdout, stderr = client.exec_command(cmd)
+    output = stdout.read()
+    if verbose:
+      print('stdout:\n%s' % output)
+    self.assertTrue(aFile in output)
+    self.assertTrue("OK" in output)
+    client.close()
+                
+if __name__ == '__main__':
+    # verbose = True # human eyes
+    unittest.main(exit=False)
+    pass
diff --git a/test/test_sat5_0/README b/test/test_sat5_0/README
new file mode 100644 (file)
index 0000000..48ae79e
--- /dev/null
@@ -0,0 +1 @@
+theses tests from sat5.0 are obsolete
diff --git a/test/test_sat5_0/__init__.py b/test/test_sat5_0/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/test/test_sat5_0/compilation/test_compilation.py b/test/test_sat5_0/compilation/test_compilation.py
new file mode 100755 (executable)
index 0000000..79192ad
--- /dev/null
@@ -0,0 +1,227 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import src.product
+from src.salomeTools import Sat
+
+class TestCase(unittest.TestCase):
+    """Test of the compile command"""
+
+    def test_010(self):
+        # Test the compile command with '--products' option
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
+
+        sat.clean(appli + ' --build --install --product ' + product_name, batch=True)
+        sat.compile(appli + ' --product ' + product_name)
+        
+        if os.path.exists(expected_file_path):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the configure command with '--fathers' option
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+        product_name2 = 'PRODUCT_ARCHIVE'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name +"," +product_name2)
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
+        expected_install_dir2 = src.product.get_product_config(sat.cfg, product_name2).install_dir
+        expected_file_path2 = os.path.join(expected_install_dir2, 'bin/hello-archive')
+        
+        sat.clean(appli + ' --build --install --product ' + product_name +"," +product_name2, batch=True)
+        sat.compile(appli + ' --with_fathers --product ' + product_name)
+        
+        if os.path.exists(expected_file_path) and os.path.exists(expected_file_path2):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+        
+    def test_030(self):
+        # Test the configure command with '--children' option
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+        product_name2 = 'PRODUCT_ARCHIVE'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name +"," +product_name2)
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
+        expected_install_dir2 = src.product.get_product_config(sat.cfg, product_name2).install_dir
+        expected_file_path2 = os.path.join(expected_install_dir2, 'bin/hello-archive')
+
+        sat.clean(appli + ' --build --install --product ' + product_name +"," +product_name2, batch=True)
+        sat.compile(appli + ' --with_children --product ' + product_name2)
+        
+        if os.path.exists(expected_file_path) and os.path.exists(expected_file_path2):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_040(self):
+        # Test the configure command with '--clean_all' option
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+        product_name2 = 'PRODUCT_ARCHIVE'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name +"," +product_name2)
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
+        expected_install_dir2 = src.product.get_product_config(sat.cfg, product_name2).install_dir
+        expected_file_path2 = os.path.join(expected_install_dir2, 'bin/hello-archive')
+
+        sat.compile(appli + ' --with_children --product ' + product_name2)
+        
+        sat.compile(appli + ' --clean_all --with_children --product ' + product_name2, batch=True)
+        
+        if os.path.exists(expected_file_path) and os.path.exists(expected_file_path2):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_050(self):
+        # Test the configure command with '--clean_install' option
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+        product_name2 = 'PRODUCT_ARCHIVE'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name +"," +product_name2)
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
+        expected_install_dir2 = src.product.get_product_config(sat.cfg, product_name2).install_dir
+        expected_file_path2 = os.path.join(expected_install_dir2, 'bin/hello-archive')
+
+        sat.compile(appli + ' --with_children --product ' + product_name2)
+        
+        sat.compile(appli + ' --clean_install --with_children --product ' + product_name2, batch=True)
+        
+        if os.path.exists(expected_file_path) and os.path.exists(expected_file_path2):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_060(self):
+        # Test the configure command with '--make_flags' option
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
+
+        sat.clean(appli + ' --build --install --product ' + product_name, batch=True)
+        sat.compile(appli + ' --make_flags 3 --product ' + product_name)
+               
+        if os.path.exists(expected_file_path):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_070(self):
+        # Test the configure command with '--show' option
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
+
+        sat.clean(appli + ' --build --install --product ' + product_name, batch=True)
+        sat.compile(appli + ' --show --product ' + product_name)
+               
+        if not(os.path.exists(expected_file_path)):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_080(self):
+        # Test the configure command with '--stop_first_fail' option
+        OK = 'KO'
+
+        appli = 'appli-test'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product PRODUCT_CVS,Python')
+        expected_install_dir = src.product.get_product_config(sat.cfg, "PRODUCT_CVS").install_dir
+
+        sat.clean(appli + ' --build --install --product PRODUCT_CVS', batch=True)
+        sat.compile(appli + ' --stop_first_fail --product PRODUCT_CVS,Python')
+               
+        if not(os.path.exists(expected_install_dir)):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_090(self):
+        # Test the 'sat -h compile' command to get description       
+
+        OK = "KO"
+
+        import compile
+        
+        if "The compile command constructs the products" in compile.description():
+            OK = "OK"
+
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
+
diff --git a/test/test_sat5_0/compilation/test_configure.py b/test/test_sat5_0/compilation/test_configure.py
new file mode 100755 (executable)
index 0000000..9d995a2
--- /dev/null
@@ -0,0 +1,110 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import src.product
+from src.salomeTools import Sat
+
+class TestCase(unittest.TestCase):
+    """Test of the configure command"""
+
+    def setUp(self):
+        print("setUp")
+
+    def tearDown(self):
+        print("tearDown")
+
+    def test_010(self):
+        # Test the configure command with a product in cmake
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
+        expected_file_path = os.path.join(expected_build_dir, 'CMakeCache.txt')
+       
+        sat.configure(appli + ' --product ' + product_name)
+        
+        if os.path.exists(os.path.join(expected_build_dir, expected_file_path)):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the configure command with a product in autotools
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_CVS'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
+        expected_file_path = os.path.join(expected_build_dir, 'config.log')
+       
+        sat.configure(appli + ' --product ' + product_name)
+        
+        if os.path.exists(os.path.join(expected_build_dir, expected_file_path)):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_030(self):
+        # Test the configure command with a product in script mode
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'Python'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
+      
+        sat.configure(appli + ' --product ' + product_name)
+        
+        if os.path.exists(expected_build_dir):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_040(self):
+        # Test the 'sat -h configure'
+        OK = "KO"
+
+        import configure
+        
+        if "The configure command executes in the build directory" in configure.description():
+            OK = "OK"
+
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/compilation/test_make.py b/test/test_sat5_0/compilation/test_make.py
new file mode 100755 (executable)
index 0000000..c956965
--- /dev/null
@@ -0,0 +1,106 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import src.product
+from src.salomeTools import Sat
+
+class TestCase(unittest.TestCase):
+    """Test of the make command"""
+
+    def test_010(self):
+        # Test the configure command without any option
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
+        expected_file_path = os.path.join(expected_build_dir, 'hello')
+       
+        sat.configure(appli + ' --product ' + product_name)        
+        sat.make(appli + ' --product ' + product_name)
+        
+        if os.path.exists(os.path.join(expected_build_dir, expected_file_path)):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the make command with an option
+        OK = 'KO'
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
+        expected_file_path = os.path.join(expected_build_dir, 'hello')
+       
+        sat.configure(appli + ' --product ' + product_name)   
+        sat.make(appli + ' --product ' + product_name + ' --option -j3')
+        
+        if os.path.exists(os.path.join(expected_build_dir, expected_file_path)):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_030(self):
+        # Test the make command with a product in script mode
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'Python'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_file = "bin/python2.7"
+        
+        sat.make(appli + ' --product ' + product_name)
+        
+        if os.path.exists(os.path.join(expected_install_dir, expected_file)):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_040(self):
+        # Test the sat -h make 
+        OK = "KO"
+
+        import make
+        
+        if "The make command executes the \"make\" command" in make.description():
+            OK = "OK"
+
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/compilation/test_makeinstall.py b/test/test_sat5_0/compilation/test_makeinstall.py
new file mode 100755 (executable)
index 0000000..62aba79
--- /dev/null
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+import src.product
+from src.salomeTools import Sat
+
+class TestMakeinstall(unittest.TestCase):
+    """Test of the makeinstall command"""
+
+    def test_010(self):
+        # Test the configure-make-makeinstall command without any option
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+
+        sat = Sat()
+                            
+        sat.prepare(appli + ' --product ' + product_name)
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_file_path = os.path.join(expected_install_dir, 'bin/hello')
+       
+        sat.configure(appli + ' --product ' + product_name)
+        
+        sat.make(appli + ' --product ' + product_name)
+        
+        sat.makeinstall(appli + ' --product ' + product_name)
+        
+        if os.path.exists(expected_file_path):
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the sat -h make
+        OK = "KO"
+
+        import makeinstall
+        
+        if "The makeinstall command executes the 'make install' command" in makeinstall.description():
+            OK = "OK"
+
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/config/test_create_user_pyconf.py b/test/test_sat5_0/config/test_create_user_pyconf.py
new file mode 100755 (executable)
index 0000000..882124a
--- /dev/null
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import shutil
+import unittest
+
+from src.salomeTools import Sat
+
+class TestCase(unittest.TestCase):
+    """Test create file .pyconf"""
+    
+    def test_010(self):
+        # Test creation of ~/.salomeTools/salomeTools.pyconf
+        print "stupidity HAVE TO NOT touch user ~/.salomeTools"
+        return
+        
+        res = "KO"
+        user_dir = os.path.expanduser(os.path.join('~','.salomeTools'))
+        user_dir_save = os.path.expanduser(os.path.join('~','.salomeTools_save'))
+        if os.path.exists(user_dir_save):
+            shutil.rmtree(user_dir_save)
+        if os.path.exists(user_dir):
+            shutil.move(user_dir, user_dir_save)
+               
+        # The command to test
+        sat = Sat('')
+        sat.config('-v .')
+
+        expected_file = os.path.expanduser(os.path.join('~','.salomeTools', 'salomeTools.pyconf'))
+
+        if os.path.exists(expected_file):
+            res = "OK"
+
+        shutil.rmtree(user_dir)
+        shutil.move(user_dir_save, user_dir)
+        self.assertEqual(res, "OK")
+
+    def test_020(self):
+        # Test override VARS
+        OK = "KO"
+        
+        # The command to test
+        sat = Sat("-oVARS.user='user_test'")
+        sat.config()
+
+        if sat.cfg.VARS.user == 'user_test':
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_030(self):
+        # Test override INTERNAL
+        OK = "KO"
+        
+        # The command to test
+        sat = Sat("-oINTERNAL.sat_version='V0'")
+        sat.config()
+
+        if sat.cfg.INTERNAL.sat_version == 'V0':
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    """
+    def test_040(self):
+        # Test override SITE
+        OK = "KO"
+        
+        # The command to test
+        sat = Sat("-oSITE.jobs.config_path='/tmp'")
+        sat.config()
+
+        if sat.cfg.SITE.jobs.config_path == '/tmp':
+            OK = "OK"
+
+        self.assertEqual(OK, "OK")
+    """
+
+    def test_050(self):
+        # Test override APPLICATION
+        OK = "KO"
+        
+        # The command to test
+        sat = Sat("-oAPPLICATION.out_dir='/tmp'")
+        sat.config('appli-test')
+
+        if sat.cfg.APPLICATION.out_dir == '/tmp':
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_060(self):
+        # Test override PRODUCTS
+        OK = "KO"
+        
+        # The command to test
+        sat = Sat("-oPRODUCTS.PRODUCT_GIT.default.name='test'")
+        sat.config('')
+
+        if sat.cfg.PRODUCTS.PRODUCT_GIT.default.name == 'test':
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/config/test_option_copy.py b/test/test_sat5_0/config/test_option_copy.py
new file mode 100755 (executable)
index 0000000..bb7fe0b
--- /dev/null
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+from src.salomeTools import Sat
+
+class TestCase(unittest.TestCase):
+    """sat config --copy"""
+    
+    def test_010(self):
+        # Test the copy of a pyconf
+        res = "KO"
+        appli_to_copy = "appli-test"
+
+        expected_file = os.path.expanduser(os.path.join('~','.salomeTools', 'Applications', 'LOCAL_' + appli_to_copy + '.pyconf'))
+        if os.path.exists(expected_file):
+            os.remove(expected_file)
+               
+        # The command to test
+        sat = Sat('')
+        sat.config('appli-test -c')
+
+        if os.path.exists(expected_file):
+            res = "OK"
+            os.remove(expected_file)
+        self.assertEqual(res, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/config/test_option_edit.py b/test/test_sat5_0/config/test_option_edit.py
new file mode 100755 (executable)
index 0000000..c6674e9
--- /dev/null
@@ -0,0 +1,73 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import threading
+import time
+import unittest
+
+from src.salomeTools import Sat
+from unittestpy.tools import check_proc_existence_and_kill_multi
+
+sleep_time = 2
+
+class TestCase(unittest.TestCase):
+    """sat config --edit"""
+    
+    def test_010(self):
+        # Test the launch of the editor when invoking the config -e
+        OK = "KO"
+
+        sat = Sat("-oUSER.editor='cooledit'")
+        sat.config()
+        cmd_config = threading.Thread(target=sat.config, args=('-e',))
+        cmd_config.start()
+
+        time.sleep(sleep_time)
+
+        editor = sat.cfg.USER.editor
+        pid = check_proc_existence_and_kill_multi(editor + ".*" + "salomeTools\.pyconf", 10)
+
+        if pid:
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_020(self):
+        # Test the launch of the editor when invoking the config -e appli-test
+        OK = "KO"
+
+        sat = Sat("-oUSER.editor='cooledit'")
+        sat.config()
+        cmd_config = threading.Thread(target=sat.config, args=('appli-test -e',))
+        cmd_config.start()
+
+        time.sleep(sleep_time)
+
+        editor = sat.cfg.USER.editor
+        pid = check_proc_existence_and_kill_multi(editor + ".*" + "appli-test\.pyconf", 10)
+
+        if pid:
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/config/test_option_value.py b/test/test_sat5_0/config/test_option_value.py
new file mode 100755 (executable)
index 0000000..50a7d84
--- /dev/null
@@ -0,0 +1,109 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import platform
+import unittest
+
+from src.salomeTools import Sat
+from unittestpy.tools import outRedirection
+
+class TestCase(unittest.TestCase):
+    """sat config --value"""
+    
+    def test_010(self):
+        # Test the display of the right value of "sat config -v VARS.hostname"
+        OK = "KO"
+
+        # output redirection
+        my_out = outRedirection()
+
+        # The command to test
+        sat = Sat()
+        sat.config('-v VARS.hostname')
+
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+
+        if platform.node() in res:
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_020(self):
+        # Test the display of the right value of "sat config -l"
+        OK = "KO"
+
+        # output redirection
+        my_out = outRedirection()
+
+        # The command to test
+        sat = Sat()
+        sat.config('-l')
+
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+
+        # get results
+        if "ERROR" not in res:
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+    
+    """    
+    def test_030(self):
+        # Test the exception when salomeTools.pyconf has errors           
+        OK = "KO"
+        
+        # The command to test
+        sat = Sat()
+        sat.config()
+        
+        salomeToolspyconfPath = os.path.join(sat.cfg.VARS.srcDir, "internal_config", "salomeTools.pyconf")
+        salomeToolspyconfPath_save = os.path.join(sat.cfg.VARS.srcDir, "internal_config", "salomeTools.pyconf_save")
+        if os.path.exists(salomeToolspyconfPath_save):
+            os.remove(salomeToolspyconfPath_save)
+        shutil.copyfile(salomeToolspyconfPath, salomeToolspyconfPath_save)
+        f_read = open(salomeToolspyconfPath, 'r')
+        text = f_read.read()
+        f_read.close()
+        os.remove(salomeToolspyconfPath)
+        f_write = open(salomeToolspyconfPath, 'w')
+        f_write.write(text.replace(':', ''))
+        f_write.close()
+        
+        try:
+            sat.config()
+        except TypeError:
+            OK = "OK"
+        finally:
+            shutil.copyfile(salomeToolspyconfPath_save, salomeToolspyconfPath)
+            os.remove(salomeToolspyconfPath_save)
+        self.assertEqual(OK, "OK")
+    """       
+        
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/config/test_option_value_2.py b/test/test_sat5_0/config/test_option_value_2.py
new file mode 100755 (executable)
index 0000000..c11fee1
--- /dev/null
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import platform
+import unittest
+
+from src.salomeTools import Sat
+from unittestpy.tools import outRedirection
+
+class TestCase(unittest.TestCase):
+    """sat config -v VARS.python"""
+    
+    def test_010(self):
+        # Test the display of the right value of 'sat config -v VARS.python'
+        OK = 'KO'
+
+        # output redirection
+        my_out = outRedirection()
+
+        # The command to test
+        sat = Sat('')
+        sat.config('-v VARS.python')
+
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+        
+        
+        if platform.python_version() in res:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the display of the right value of 'sat config -s'
+        OK = 'KO'
+
+        # output redirection
+        my_out = outRedirection()
+
+        # The command to test
+        sat = Sat('')
+        sat.config('-s')
+
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+        
+        
+        if 'INTERNAL' in res:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+        
+    def test_030(self):
+        # Test the display of the right value of 'sat config --info'
+        application = 'appli-test'
+        product = 'PRODUCT_DEV'
+        
+        OK = 'KO'
+
+        # output redirection
+        my_out = outRedirection()
+
+        # The command to test
+        sat = Sat('')
+        sat.config(application + ' --info ' + product)
+
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+        
+        
+        if 'compilation method = cmake' in res:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/environ/test_environ.py b/test/test_sat5_0/environ/test_environ.py
new file mode 100755 (executable)
index 0000000..3a63fd5
--- /dev/null
@@ -0,0 +1,150 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+from src.salomeTools import Sat
+
+class TestSource(unittest.TestCase):
+    """Test of the environ command"""
+    
+    def test_010(self):
+        # Test the environ command without any option
+        OK = 'KO'
+        
+        appli = 'appli-test'
+
+        file_env_name = 'env_launch.sh'
+        
+        sat = Sat()
+        sat.config(appli)
+
+        expected_file_path = os.path.join(sat.cfg.APPLICATION.workdir, file_env_name)
+
+        if os.path.exists(expected_file_path):
+            os.remove(expected_file_path)
+
+        sat.environ(appli)
+
+        if os.path.exists(expected_file_path):
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the environ command with option '--products'
+        OK = 'KO'
+        
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+        
+        file_env_name = 'env_launch.sh'
+        
+        sat = Sat()
+        sat.config(appli)
+
+        expected_file_path = os.path.join(sat.cfg.APPLICATION.workdir, file_env_name)
+
+        if os.path.exists(expected_file_path):
+            os.remove(expected_file_path)
+
+        sat.environ(appli + ' --products ' + product_name)
+
+        if os.path.exists(expected_file_path):
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')        
+
+    def test_030(self):
+        # Test the environ command with option --target
+        OK = 'KO'
+        
+        appli = 'appli-test'
+        
+        file_env_name = 'env_launch.sh'
+        
+        sat = Sat()
+        sat.config(appli)
+
+        expected_file_path = os.path.join('.', file_env_name)
+        expected_file_path2 = os.path.join('.', 'env_build.sh')
+
+        if os.path.exists(expected_file_path):
+            os.remove(expected_file_path)
+
+        sat.environ(appli + ' --target .')
+
+        if os.path.exists(expected_file_path):
+            OK = 'OK'
+
+        if os.path.exists(expected_file_path):
+            os.remove(expected_file_path)
+            os.remove(expected_file_path2)
+
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK') 
+
+    def test_040(self):
+        # Test the environ command with option --prefix
+        OK = 'KO'
+        
+        appli = 'appli-test'
+        prefix = 'TEST'
+        file_env_name = prefix + '_launch.sh'
+        
+        sat = Sat()
+        sat.config(appli)
+
+        expected_file_path = os.path.join(sat.cfg.APPLICATION.workdir, file_env_name)
+
+        if os.path.exists(expected_file_path):
+            os.remove(expected_file_path)
+
+        sat.environ(appli + ' --prefix ' + prefix)
+
+        if os.path.exists(expected_file_path):
+            OK = 'OK'
+        self.assertEqual(OK, 'OK') 
+
+    def test_050(self):
+        # Test the environ command with option --shell
+        OK = 'KO'
+        
+        appli = 'appli-test'
+        shell = 'bat'
+        file_env_name = 'env_launch.bat'
+        
+        sat = Sat()
+        sat.config(appli)
+
+        expected_file_path = os.path.join(sat.cfg.APPLICATION.workdir, file_env_name)
+
+        if os.path.exists(expected_file_path):
+            os.remove(expected_file_path)
+
+        sat.environ(appli + ' --shell ' + shell)
+
+        if os.path.exists(expected_file_path):
+            OK = 'OK'
+        self.assertEqual(OK, 'OK') 
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/job/test_job.py b/test/test_sat5_0/job/test_job.py
new file mode 100755 (executable)
index 0000000..fc23191
--- /dev/null
@@ -0,0 +1,122 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+from src.salomeTools import Sat
+
+class TestCase(unittest.TestCase):
+    """Test the job command"""
+
+    def test_010(self):
+        # Test the job command
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the job command
+        sat.job("--jobs_config .test --name Job 1" )
+
+        ff = open(tmp_file, "r")
+        log_files = ff.readlines()
+        ff.close()
+        os.remove(tmp_file)
+        log_config = [line.replace("\n", "") for line in log_files if 'config.xml' in line]
+        
+        text = open(log_config[0], "r").read()
+
+        if "nb_proc" in text:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+
+
+    def test_020(self):
+        # Test the job command with a failing command
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the job command
+        res = sat.job("--jobs_config .test --name Job 4" )
+
+        if res == 1:
+            OK = 'OK'         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+
+    def test_030(self):
+        # Test the job command with a wrong file configuration
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the job command
+        res = sat.job("--jobs_config NOTEXIST --name Job 4" )
+
+        if res == 1:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+
+    def test_040(self):
+        # Test the job command without --jobs_config option
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the job command
+        res = sat.job("--name Job 4" )
+
+        if res == 1:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+
+    def test_050(self):
+        # Test the job command without --jobs_config option
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the job command
+        res = sat.job("--jobs_config .test --name NOTEXIST" )
+
+        if res == 1:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+
+    def test_060(self):
+        # Test the sat -h job     
+        OK = "KO"
+
+        import job
+        
+        if "Executes the commands of the job defined in the jobs configuration file" in job.description():
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/jobs/test_jobs.py b/test/test_sat5_0/jobs/test_jobs.py
new file mode 100755 (executable)
index 0000000..1b22378
--- /dev/null
@@ -0,0 +1,159 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+from src.salomeTools import Sat
+from unittestpy.tools import outRedirection
+
+class TestCase(unittest.TestCase):
+    "Test the jobs command"""
+
+    def test_010(self):
+        # Test the jobs command
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the jobs command
+        sat.jobs("--name .test --publish" )
+
+        ff = open(tmp_file, "r")
+        log_files = ff.readlines()
+        ff.close()
+        os.remove(tmp_file)
+        log_jobs = [line.replace("\n", "") for line in log_files if 'jobs.xml' in line]
+        
+        text = open(log_jobs[0], "r").read()
+        
+        expected_res = [
+        "Establishing connection with all the machines",
+        "Executing the jobs",
+        "Results for job"
+        ]
+        
+        res = 0
+        for exp_res in expected_res:
+            if exp_res not in text:
+                res += 1
+        
+        if res == 0:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the jobs command with option --only_jobs
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the jobs command
+        sat.jobs("--name .test --publish --only_jobs Job 1" )
+
+        ff = open(tmp_file, "r")
+        log_files = ff.readlines()
+        ff.close()
+        os.remove(tmp_file)
+        log_jobs = [line.replace("\n", "") for line in log_files if 'jobs.xml' in line]
+        
+        text = open(log_jobs[0], "r").read()
+        
+        expected_res = [
+        "Establishing connection with all the machines",
+        "Executing the jobs",
+        "Results for job"
+        ]
+        
+        res = 0
+        for exp_res in expected_res:
+            if exp_res not in text:
+                res += 1
+        
+        if res == 0:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_030(self):
+        # Test the jobs command without --name option
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the job command
+        res = sat.jobs()
+
+        if res == 1:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+        
+    def test_040(self):
+        # Test the jobs command with a wrong file configuration
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the job command
+        res = sat.jobs("--name NOTEXIST" )
+
+        if res == 1:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+
+    def test_050(self):
+        # Test the display of the right value of 'sat jobs --list'
+        OK = "KO"
+
+        # output redirection
+        my_out = outRedirection()
+
+        # The command to test
+        sat = Sat()
+        sat.jobs('--list')
+
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+
+        # get results
+        if "ERROR" not in res:
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_060(self):
+        # Test the sat -h jobs       
+        OK = "KO"
+
+        import jobs
+        
+        if "The jobs command launches maintenances that are described in the dedicated jobs configuration file." in jobs.description():
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/log/test_launch_browser.py b/test/test_sat5_0/log/test_launch_browser.py
new file mode 100755 (executable)
index 0000000..a9c8be4
--- /dev/null
@@ -0,0 +1,294 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import threading
+import time
+import shutil
+import io
+import unittest
+
+from src.salomeTools import Sat
+from unittestpy.tools import check_proc_existence_and_kill_multi
+
+sleep_time = 2
+
+class TestCase(unittest.TestCase):
+    """Test of log command: launch of browser"""
+           
+    def test_010(self):
+        # Test the write of xml log when invoking a command
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+        sat.config('appli-test -v USER.browser')
+        
+        # get log file path
+        logDir = sat.cfg.USER.log_dir
+        logPath = os.path.join(logDir, sat.cfg.VARS.datehour + "_" + sat.cfg.VARS.command + ".xml")
+        
+        if os.path.exists(logPath):
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_020(self):
+        # Test the terminal option without application
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+        
+        one = u"1"
+        sys.stdin = io.StringIO(one)
+        
+        
+        try:
+            sat.log('-t')
+            OK = "OK"
+            sys.stdin = sys.__stdin__
+        except:
+            sys.stdin = sys.__stdin__
+        self.assertEqual(OK, "OK")
+
+    def test_030(self):
+        # Test the terminal option with application
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+              
+        sat.config('appli-test -v VARS.python')
+        
+        one = u"1"
+        sys.stdin = io.StringIO(one)
+        
+        try:
+            sat.log('appli-test -t --last')
+            OK = "OK"
+            sys.stdin = sys.__stdin__
+        except:
+            pass
+        self.assertEqual(OK, "OK")
+
+    def test_040(self):
+        # Test the terminal option with 0 as input
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+              
+        sat.config('appli-test -v VARS.python')
+        
+        zero = u"0\n1"
+        sys.stdin = io.StringIO(zero)
+        
+        try:
+            sat.log('--terminal')
+            OK = "OK"
+        finally:
+            sys.stdin = sys.__stdin__
+        self.assertEqual(OK, "OK")
+
+    def test_050(self):
+        # Test the terminal option with input bigger than the number of logs
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+              
+        sat.config('appli-test -v VARS.python')
+        
+        nb_logs = len(os.listdir(sat.cfg.USER.log_dir))
+        
+        nb_logs_u = unicode(str(nb_logs) + "\n1")
+        sys.stdin = io.StringIO(nb_logs_u)
+        
+        try:
+            sat.log('--terminal')
+            OK = "OK"
+        finally:
+            sys.stdin = sys.__stdin__
+        self.assertEqual(OK, "OK")
+
+    def test_060(self):
+        # Test the terminal option with input return
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+              
+        sat.config('appli-test -v VARS.python')
+        
+        ret = unicode("\n0")
+        sys.stdin = io.StringIO(ret)
+        
+        try:
+            sat.log('--terminal')
+            OK = "OK"
+        finally:
+            sys.stdin = sys.__stdin__
+        self.assertEqual(OK, "OK")
+
+    def test_070(self):
+        # Test the terminal option with input not int
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+              
+        sat.config('appli-test -v VARS.python')
+        
+        ret = unicode("blabla\n0")
+        sys.stdin = io.StringIO(ret)
+        
+        try:
+            sat.log('--terminal')
+            OK = "OK"
+        finally:
+            sys.stdin = sys.__stdin__
+        self.assertEqual(OK, "OK")
+
+    def test_080(self):
+        # Test the terminal option and option last
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+        
+        try:
+            sat.log('--terminal --last')
+            OK = "OK"
+        finally:
+            sys.stdin = sys.__stdin__
+        
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, "OK")
+    
+    def test_090(self):
+        # Test the option --last
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat("-oUSER.browser='konqueror'")
+              
+        sat.config('appli-test -v VARS.python')
+        
+        
+        time.sleep(sleep_time)
+        cmd_log = threading.Thread(target=sat.log, args=('appli-test --last',))
+        cmd_log.start()
+        
+        time.sleep(sleep_time)
+
+        browser = sat.cfg.USER.browser
+        pid = check_proc_existence_and_kill_multi(browser + ".*" + "xml", 10)
+        
+        if pid:
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+    
+    def test_100(self):
+        # Test the option --clean
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+               
+        sat.config('-v VARS.user')
+        
+        nb_logs_t0 = len(os.listdir(sat.cfg.USER.log_dir))
+
+        sat.log('--clean 1')
+        
+        nb_logs_t1 = len(os.listdir(sat.cfg.USER.log_dir))
+        
+        if nb_logs_t1-nb_logs_t0 == 0:
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_120(self):
+        # Test the option --clean with big number of files to clean
+        OK = "KO"
+        
+        # launch the command that will write a log
+        sat = Sat()
+               
+        sat.config('-v VARS.user')
+        
+        nb_logs_t0 = len(os.listdir(sat.cfg.USER.log_dir))
+        
+        if os.path.exists(sat.cfg.USER.log_dir + "_save"):
+            shutil.rmtree(sat.cfg.USER.log_dir + "_save")
+        print("TODO: risky !!!copytree!!!", sat.cfg.USER.log_dir, sat.cfg.USER.log_dir + "_save")
+        """
+        shutil.copytree(sat.cfg.USER.log_dir,sat.cfg.USER.log_dir + "_save")
+        
+        sat.log('--clean ' + str(nb_logs_t0))
+        
+        nb_logs_t1 = len(os.listdir(sat.cfg.USER.log_dir))
+        
+        shutil.rmtree(sat.cfg.USER.log_dir)
+        shutil.move(sat.cfg.USER.log_dir + "_save", sat.cfg.USER.log_dir)
+                
+        if nb_logs_t0-nb_logs_t1 > 10:
+            OK = "OK"
+        """
+        self.assertEqual(OK, "OK")
+    
+    """
+    def test_130(self):
+        # Test the option --full
+        OK = "KO"
+
+        sat = Sat("-oUSER.browser='konqueror'")
+        time.sleep(sleep_time)
+        cmd_log = threading.Thread(target=sat.log, args=('--full',))
+        cmd_log.start()
+
+        time.sleep(sleep_time)
+
+        browser = sat.cfg.USER.browser
+        check_proc_existence_and_kill_multi(browser + ".*" + "hat\.xml", 10)
+        
+        # Read and check the hat.xml file contains at least one log file corresponding to log
+        hatFilePath = os.path.join(sat.cfg.USER.log_dir, "hat.xml")
+        xmlHatFile = src.xmlManager.ReadXmlFile(hatFilePath)
+        for field in xmlHatFile.xmlroot:
+            if field.attrib[b'cmd'] == b'log':
+                OK = "OK"
+                break
+        self.assertEqual(OK, "OK")
+    """
+
+    def test_140(self):
+        # Test the sat -h log
+        OK = "KO"
+
+        import log
+        
+        if "Gives access to the logs produced" in log.description():
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/log/test_launch_browser2.py b/test/test_sat5_0/log/test_launch_browser2.py
new file mode 100755 (executable)
index 0000000..38a6184
--- /dev/null
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import threading
+import time
+import unittest
+
+from src.salomeTools import Sat
+from unittestpy.tools import check_proc_existence_and_kill_multi
+
+sleep_time = 2
+
+class TestCase(unittest.TestCase):
+    """Test of log command: launch of browser"""
+
+    def test_010(self):
+        # Test the launch of browser when invoking the log command
+        OK = "KO"
+
+        sat = Sat("-oUSER.browser='konqueror'")
+        time.sleep(sleep_time)
+        cmd_log = threading.Thread(target=sat.log, args=('',))
+        cmd_log.start()
+
+        time.sleep(sleep_time)
+        
+        sat.config("")
+        browser = sat.cfg.USER.browser
+        pid = check_proc_existence_and_kill_multi(browser + ".*" + "hat\.xml", 10)
+
+        if pid:
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/prepare/test_clean.py b/test/test_sat5_0/prepare/test_clean.py
new file mode 100755 (executable)
index 0000000..08bb54f
--- /dev/null
@@ -0,0 +1,180 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+from src.salomeTools import Sat
+import src.product
+from unittestpy.tools import outRedirection
+
+class TestCase(unittest.TestCase):
+    """Test of the clean command"""
+
+    def test_010(self):
+        # Test the clean command with no arguments (nothing to clean)
+        OK = 'KO'
+
+        appli = 'appli-test'
+
+        sat = Sat()
+
+        # output redirection
+        my_out = outRedirection()
+        
+        sat.clean(appli)
+        
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+        
+        if "Nothing to suppress" in res:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the clean of sources
+        OK = "KO"
+
+        appli = 'appli-test'
+        product_name = "PRODUCT_GIT"
+
+        sat = Sat()      
+        
+        # Make sure the sources exist
+        sat.prepare(appli + " -p " + product_name)
+        
+        # Call the command
+        sat.clean(appli + " -p " + product_name + " --sources", batch=True)
+           
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        
+        if not os.path.exists(expected_src_dir):
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_030(self):
+        # Test the clean of build
+        OK = "KO"
+
+        appli = 'appli-test'
+        product_name = "PRODUCT_GIT"
+
+        sat = Sat()      
+        
+        # Make sure the build exists
+        sat.prepare(appli + " -p " + product_name)
+        sat.configure(appli + " -p " + product_name)
+        
+        # Call the command
+        sat.clean(appli + " -p " + product_name + " --build", batch=True)
+           
+        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
+        
+        if not os.path.exists(expected_build_dir):
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_040(self):
+        # Test the clean of install
+        OK = "KO"
+
+        appli = 'appli-test'
+        product_name = "PRODUCT_GIT"
+
+        sat = Sat()      
+        
+        # Make sure the build exists
+        sat.prepare(appli + " -p " + product_name)
+        sat.configure(appli + " -p " + product_name)
+        
+        # Call the command
+        sat.clean(appli + " -p " + product_name + " --install", batch=True)
+           
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        
+        if not os.path.exists(expected_install_dir):
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_050(self):
+        # Test the clean of all (build, src, install)
+        OK = "KO"
+
+        appli = 'appli-test'
+        product_name = "PRODUCT_GIT"
+
+        sat = Sat()      
+        
+        # Make sure the build exists
+        sat.prepare(appli + " -p " + product_name)
+        sat.compile(appli + " -p " + product_name)
+        
+        # Call the command
+        sat.clean(appli + " -p " + product_name + " --all", batch=True)
+           
+        expected_install_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+        expected_build_dir = src.product.get_product_config(sat.cfg, product_name).build_dir
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        
+        if not os.path.exists(expected_install_dir) and not os.path.exists(expected_build_dir) and not os.path.exists(expected_src_dir):
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+    def test_060(self):
+        # Test the clean with sources_without_dev option
+        OK = "KO"
+
+        appli = 'appli-test'
+        product_name = "PRODUCT_GIT"
+        product_name2 = "PRODUCT_DEV"
+
+        sat = Sat()      
+        
+        # Make sure the build exists
+        sat.prepare(appli + " -p " + product_name + "," + product_name2)
+        
+        # Call the command
+        sat.clean(appli + " -p " + product_name + " --sources_without_dev", batch=True)
+           
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        expected_src_dir2 = src.product.get_product_config(sat.cfg, product_name2).source_dir
+        
+        if not os.path.exists(expected_src_dir) and os.path.exists(expected_src_dir2):
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+
+    def test_070(self):
+        # Test the sat -h clean
+        OK = "KO"
+
+        import clean
+        
+        if "The clean command suppress the source, build, or install" in clean.description():
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/prepare/test_patch.py b/test/test_sat5_0/prepare/test_patch.py
new file mode 100755 (executable)
index 0000000..1dc24d4
--- /dev/null
@@ -0,0 +1,167 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import shutil
+import unittest
+
+from src.salomeTools import Sat
+import src.product
+from unittestpy.tools import outRedirection
+
+class TestCase(unittest.TestCase):
+    """Test of the patch command"""
+
+    def test_010(self):
+        # Test the patch command with a product in dev mode
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_DEV'
+
+        sat = Sat("-oUSER.output_level=2")
+               
+        sat.config(appli)
+        
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
+        expected_text = 'HELLO WORLD\n'
+        
+        if os.path.exists(expected_src_dir):
+            shutil.rmtree(expected_src_dir)
+        
+        sat.source(appli + ' --product ' + product_name)
+        
+        f = open(expected_file_path, 'r')
+        text = f.readlines()[0]
+        OK1 = 'KO'
+        if text == expected_text:
+            OK1 = 'OK'
+       
+        sat.patch(appli + ' --product ' + product_name)
+        
+        new_expected_text = 'HELLO WORLD MODIFIED\n'
+        f = open(expected_file_path, 'r')
+        text = f.readlines()[0]
+        
+        OK2 = 'KO'
+        if text == new_expected_text:
+            OK2 = 'OK'         
+
+        if (OK1, OK2)==('OK', 'OK'):
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the patch command with a product with no sources found
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_DEV'
+
+        sat = Sat('')
+        sat.config(appli)
+        
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        
+        if os.path.exists(expected_src_dir):
+            shutil.rmtree(expected_src_dir)
+               
+        # output redirection
+        my_out = outRedirection()
+        
+        sat.patch(appli + ' --product ' + product_name)
+        
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+        
+        if "No sources found for the " + product_name +" product" in res:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_030(self):
+        # Test the patch command with a product without patch
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_ARCHIVE'
+
+        sat = Sat('-v4')
+                      
+        sat.source(appli + ' --product ' + product_name)
+               
+        # output redirection
+        my_out = outRedirection()
+        
+        sat.patch(appli + ' --product ' + product_name)
+        
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+        
+        if "No patch for the " + product_name +" product" in res:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_040(self):
+        # Test the patch command with a product with a not valid patch
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_DEV'
+
+        sat = Sat("-oPRODUCTS.PRODUCT_DEV.default.patches=['/']")
+                      
+        sat.source(appli + ' --product ' + product_name)
+               
+        # output redirection
+        my_out = outRedirection()
+        
+        sat.patch(appli + ' --product ' + product_name)
+        
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+        
+        if "Not a valid patch" in res:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_050(self):
+        # Test the sat -h patch
+        OK = "KO"
+
+        import patch
+        
+        if "The patch command apply the patches on the sources of" in patch.description():
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/prepare/test_prepare.py b/test/test_sat5_0/prepare/test_prepare.py
new file mode 100755 (executable)
index 0000000..3340547
--- /dev/null
@@ -0,0 +1,111 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import shutil
+import unittest
+
+import src
+from src.salomeTools import Sat
+
+class TestCase(unittest.TestCase):
+    """Test of the prepare command"""
+
+    def test_010(self):
+        # Test the prepare command with a product in dev mode
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_DEV'
+
+        sat = Sat()
+               
+        sat.config(appli)
+        
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
+        expected_text = 'HELLO WORLD\n'
+        
+        if os.path.exists(expected_src_dir):
+            shutil.rmtree(expected_src_dir)
+        
+        sat.prepare(appli + ' --product ' + product_name)
+        
+        f = open(expected_file_path, 'r')
+        text = f.readlines()[0]
+        if text == expected_text:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the prepare command with all products
+        OK = 'KO'
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_DEV'
+
+        sat = Sat()
+        sat.config(appli)
+        
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
+        expected_text = 'HELLO WORLD\n'
+        
+        if os.path.exists(expected_src_dir):
+            shutil.rmtree(expected_src_dir)
+        
+        sat.prepare(appli)
+        
+        f = open(expected_file_path, 'r')
+        text = f.readlines()[0]
+        if text == expected_text:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_030(self):
+        # Test the prepare command with all products
+        OK = 'KO'
+
+        appli = 'appli-test'
+
+        sat = Sat()
+        sat.config(appli)
+       
+        try:
+            sat.prepare(appli + " --force --force_patch")
+            OK = 'OK'
+        except:
+            pass
+        self.assertEqual(OK, 'OK')
+
+    def test_040(self):
+        # Test the sat -h prepare
+        OK = "KO"
+
+        import prepare
+        
+        if "The prepare command gets the sources" in prepare.description():
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/prepare/test_source.py b/test/test_sat5_0/prepare/test_source.py
new file mode 100755 (executable)
index 0000000..f7a053d
--- /dev/null
@@ -0,0 +1,175 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+from src.salomeTools import Sat
+import src.product
+from unittestpy.tools import outRedirection
+
+class TestCase(unittest.TestCase):
+    """Test of the source command"""
+    
+    def test_010(self):
+        # Test the source command with archive product
+        appli = 'appli-test'
+        product_name = 'PRODUCT_ARCHIVE'
+
+        sat = Sat()
+        sat.source(appli + ' --product ' + product_name)
+
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
+        expected_text = 'HELLO WORLD\n'
+
+        f = open(expected_file_path, 'r')
+        text = f.read()
+        self.assertEqual(text, expected_text)
+        
+    def test_020(self):
+        # Test the source command with git product
+        appli = 'appli-test'
+        product_name = 'PRODUCT_GIT'
+
+        sat = Sat()
+        sat.source(appli + ' --product ' + product_name)
+
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        expected_file_path = os.path.join(expected_src_dir, 'my_test_file.txt')
+        expected_text = 'HELLO WORLD\n'
+
+        f = open(expected_file_path, 'r')
+        text = f.read()
+        self.assertEqual(text, expected_text)
+
+    def test_030(self):
+        # Test the source command with cvs product
+        appli = 'appli-test'
+        product_name = 'PRODUCT_CVS'
+
+        sat = Sat()
+        sat.source(appli + ' --product ' + product_name)
+
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        expected_file_path = os.path.join(expected_src_dir, 'README.FIRST.txt')
+        expected_text = 'Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE\n'
+
+        f = open(expected_file_path, 'r')
+        text = f.readlines()[0]
+
+        # pyunit method to compare 2 str
+        self.assertEqual(text, expected_text)
+    
+    """
+    def test_040(self):
+        # Test the source command with svn product
+        OK = 'KO'
+        
+        appli = 'appli-test'
+        product_name = 'PRODUCT_SVN'
+
+        sat = Sat()
+        sat.source(appli + ' --product ' + product_name)
+
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).source_dir
+        expected_file_path = os.path.join(expected_src_dir, 'scripts', 'README')
+        expected_text = 'this directory contains scripts used by salomeTool'
+
+        f = open(expected_file_path, 'r')
+        text = f.readlines()[0]
+        
+        if expected_text in text:
+            OK = 'OK'
+         
+        # pyunit method to compare 2 str
+        self.assertEqual(OK, 'OK')
+    """
+
+    def test_050(self):
+        # Test the source command with native product
+        OK = 'KO'
+        
+        appli = 'appli-test'
+        product_name = 'PRODUCT_NATIVE'
+
+        sat = Sat()
+        sat.source(appli + ' --product ' + product_name)
+
+        expected_src_dir = os.path.join(sat.cfg.APPLICATION.workdir, 'SOURCES', product_name)
+        if not os.path.exists(expected_src_dir):
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    def test_060(self):
+        # Test the source command with fixed product
+        OK = 'KO'
+        
+        appli = 'appli-test'
+        product_name = 'PRODUCT_FIXED'
+
+        sat = Sat()
+        sat.source(appli + ' --product ' + product_name)
+
+        expected_src_dir = src.product.get_product_config(sat.cfg, product_name).install_dir
+
+        if os.path.exists(expected_src_dir):
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+
+    """
+    def test_070(self):
+        # Test the source command with unknown product
+        OK = 'KO'
+
+        # output redirection
+        my_out = outRedirection()
+
+        appli = 'appli-test'
+        product_name = 'PRODUCT_UNKNOWN'
+
+        sat = Sat()
+        sat.source(appli + ' --product ' + product_name)
+
+        # stop output redirection
+        my_out.end_redirection()
+
+        # get results
+        res = my_out.read_results()
+
+        if "Unknown get source method" in res:
+            OK = 'OK'
+        self.assertEqual(OK, 'OK')
+    """
+
+    def test_080(self):
+        # Test the sat -h source
+        OK = "KO"
+
+        import source
+        
+        if "gets the sources of the application" in source.description():
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/run_all.sh b/test/test_sat5_0/run_all.sh
new file mode 100755 (executable)
index 0000000..a26bd5b
--- /dev/null
@@ -0,0 +1,59 @@
+#!/usr/bin/env bash
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+echo "TODO: SAT5.1 OBSOLETE: to set as python script, may be"
+echo "Begin date:"
+date
+echo
+echo "Remove old results ... "
+rm -rf .coverage htmlcov
+echo "Done"
+echo
+echo "****************************"
+coverage run --source=../commands/config.py    config/option_value.py > test_res.html
+coverage run --source=../commands/config.py -a config/option_value_2.py >> test_res.html
+coverage run --source=../commands/config.py -a config/create_user_pyconf.py >> test_res.html
+coverage run --source=../commands/config.py -a config/option_copy.py >> test_res.html
+coverage run --source=../commands/config.py -a config/option_edit.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/log.py,../src/xmlManager.py,../src/logger.py -a log/launch_browser.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/log.py,../src/xmlManager.py,../src/logger.py -a log/launch_browser2.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/source.py,../commands/patch.py,../commands/prepare.py -a prepare/test_source.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/source.py,../commands/patch.py,../commands/prepare.py -a prepare/test_patch.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/source.py,../commands/patch.py,../commands/prepare.py -a prepare/test_prepare.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/source.py,../commands/patch.py,../commands/prepare.py,../commands/clean.py -a prepare/test_clean.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/environ.py -a environ/test_environ.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/configure.py,../commands/environ.py -a compilation/test_configure.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/make.py,../commands/environ.py -a compilation/test_make.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/makeinstall.py,../commands/environ.py -a compilation/test_makeinstall.py >> test_res.html
+coverage run --source=../commands/config.py,../commands/compile.py,../commands/configure.py,../commands/make.py,../commands/makeinstall.py,../commands/environ.py -a compilation/test_compilation.py >> test_res.html
+coverage run --source=../commands/shell.py -a shell/test_shell.py >> test_res.html
+coverage run --source=../commands/job.py -a job/test_job.py >> test_res.html
+coverage run --source=../commands/jobs.py -a jobs/test_jobs.py >> test_res.html
+coverage run --source=../commands/test.py,../src/test_module.py,../src/fork.py -a test/test_command.py >> test_res.html
+echo "****************************"
+echo
+echo "building html coverage"
+coverage html
+echo "Done"
+echo
+echo "End date:"
+date
+echo
+
+#firefox test_res.html htmlcov/index.html
diff --git a/test/test_sat5_0/shell/test_shell.py b/test/test_sat5_0/shell/test_shell.py
new file mode 100755 (executable)
index 0000000..80f579e
--- /dev/null
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+from src.salomeTools import Sat
+
+class TestCase(unittest.TestCase):
+    """Test of the shell command"""
+
+    def test_010(self):
+        # Test the shell command with the --command option
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        sat.config()
+        sat_way = sat.cfg.VARS.salometoolsway
+        
+        # Execute the shell command
+        sat.shell("--command ls " + sat_way)
+
+        ff = open(tmp_file, "r")
+        log_files = ff.readlines()
+        ff.close()
+        os.remove(tmp_file)
+        log_files = [line.replace("\n", "") for line in log_files]
+        
+        text = open(log_files[2], "r").read()
+
+        if "salomeTools.py" in text:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the shell command with the --command option with a failing command
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+
+        sat = Sat("-l " + tmp_file)
+        
+        sat.config()
+        
+        # Execute the shell command
+        res = sat.shell("--command i_fail")
+
+        ff = open(tmp_file, "r")
+        log_files = ff.readlines()
+        ff.close()
+        os.remove(tmp_file)
+        log_files = [line.replace("\n", "") for line in log_files]
+        
+        text = open(log_files[2], "r").read()
+
+        if "i_fail" in text and res == 1:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+
+    def test_030(self):
+        # Test the sat -h shell
+        OK = "KO"
+
+        import shell
+        
+        if "Executes the shell command passed as argument" in shell.description():
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/test/test_sat5_0/test/test_command.py b/test/test_sat5_0/test/test_command.py
new file mode 100755 (executable)
index 0000000..136df62
--- /dev/null
@@ -0,0 +1,88 @@
+#!/usr/bin/env python
+#-*- coding:utf-8 -*-
+
+#  Copyright (C) 2010-2018  CEA/DEN
+#
+#  This library is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU Lesser General Public
+#  License as published by the Free Software Foundation; either
+#  version 2.1 of the License.
+#
+#  This library is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#  Lesser General Public License for more details.
+#
+#  You should have received a copy of the GNU Lesser General Public
+#  License along with this library; if not, write to the Free Software
+#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+
+import os
+import sys
+import unittest
+
+from src.salomeTools import Sat
+
+class TestTest(unittest.TestCase):
+    """Test of the test command"""
+
+    def test_010(self):
+        # Test the test command
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+        application = "SALOME-7.8.0"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the job command
+        sat.test(application + " --grid GEOM --session light" )
+
+        ff = open(tmp_file, "r")
+        log_files = ff.readlines()
+        ff.close()
+        os.remove(tmp_file)
+        log_testboard = [line.replace("\n", "") for line in log_files if 'testboard.xml' in line]
+        
+        text = open(log_testboard[0], "r").read()
+
+        if '<session name="light">' in text:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+
+    def test_020(self):
+        # Test the test command with PY type
+        OK = 'KO'
+        tmp_file = "/tmp/test.txt"
+        application = "SALOME-7.8.0"
+
+        sat = Sat("-l " + tmp_file)
+        
+        # Execute the job command
+        sat.test(application + " --grid MED --session PY_test_withKernel" )
+
+        ff = open(tmp_file, "r")
+        log_files = ff.readlines()
+        ff.close()
+        os.remove(tmp_file)
+        log_testboard = [line.replace("\n", "") for line in log_files if 'testboard.xml' in line]
+        
+        text = open(log_testboard[0], "r").read()
+
+        if '<session name="PY_test_withKernel">' in text:
+            OK = 'OK'         
+        self.assertEqual(OK, 'OK')
+
+    def test_030(self):
+        # Test the sat -h test
+        OK = "KO"
+
+        import test
+        
+        if "The test command runs a test base on a SALOME installation" in test.description():
+            OK = "OK"
+        self.assertEqual(OK, "OK")
+
+# test launch
+if __name__ == '__main__':
+    unittest.main()
+    pass
diff --git a/unittestpy/HTMLTestRunner.py b/unittestpy/HTMLTestRunner.py
new file mode 100644 (file)
index 0000000..0439bf4
--- /dev/null
@@ -0,0 +1,824 @@
+"""
+A TestRunner for use with the Python unit testing framework. It
+generates a HTML report to show the result at a glance.
+
+The simplest way to use this is to invoke its main method. E.g.
+
+    import unittest
+    import HTMLTestRunner
+
+    ... define your tests ...
+
+    if __name__ == '__main__':
+        HTMLTestRunner.main()
+
+
+For more customization options, instantiates a HTMLTestRunner object.
+HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g.
+
+    # output to a file
+    fp = file('my_report.html', 'wb')
+    runner = HTMLTestRunner.HTMLTestRunner(
+                stream=fp,
+                title='My unit test',
+                description='This demonstrates the report output by HTMLTestRunner.'
+                )
+
+    # Use an external stylesheet.
+    # See the Template_mixin class for more customizable options
+    runner.STYLESHEET_TMPL = '<link rel="stylesheet" href="my_stylesheet.css" type="text/css">'
+
+    # run the test
+    runner.run(my_test_suite)
+
+
+------------------------------------------------------------------------
+Copyright (c) 2004-2007, Wai Yip Tung
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright notice,
+  this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer in the
+  documentation and/or other materials provided with the distribution.
+* Neither the name Wai Yip Tung nor the names of its contributors may be
+  used to endorse or promote products derived from this software without
+  specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+"""
+
+# URL: http://tungwaiyip.info/software/HTMLTestRunner.html
+
+__author__ = "Wai Yip Tung"
+__version__ = "0.8.2"
+
+
+"""
+Change History
+
+Version 0.8.2
+* Show output inline instead of popup window (Viorel Lupu).
+
+Version in 0.8.1
+* Validated XHTML (Wolfgang Borgert).
+* Added description of test classes and test cases.
+
+Version in 0.8.0
+* Define Template_mixin class for customization.
+* Workaround a IE 6 bug that it does not treat <script> block as CDATA.
+
+Version in 0.7.1
+* Back port to Python 2.3 (Frank Horowitz).
+* Fix missing scroll bars in detail log (Podi).
+"""
+
+# TODO: color stderr
+# TODO: simplify javascript using ,ore than 1 class in the class attribute?
+
+import datetime
+import StringIO
+import sys
+import time
+import unittest
+from xml.sax import saxutils
+
+
+# ------------------------------------------------------------------------
+# The redirectors below are used to capture output during testing. Output
+# sent to sys.stdout and sys.stderr are automatically captured. However
+# in some cases sys.stdout is already cached before HTMLTestRunner is
+# invoked (e.g. calling logging.basicConfig). In order to capture those
+# output, use the redirectors for the cached stream.
+#
+# e.g.
+#   >>> logging.basicConfig(stream=HTMLTestRunner.stdout_redirector)
+#   >>>
+
+class OutputRedirector(object):
+    """ Wrapper to redirect stdout or stderr """
+    def __init__(self, fp):
+        self.fp = fp
+
+    def write(self, s):
+        self.fp.write(s)
+
+    def writelines(self, lines):
+        self.fp.writelines(lines)
+
+    def flush(self):
+        self.fp.flush()
+
+stdout_redirector = OutputRedirector(sys.stdout)
+stderr_redirector = OutputRedirector(sys.stderr)
+
+
+
+# ----------------------------------------------------------------------
+# Template
+
+class Template_mixin(object):
+    """
+    Define a HTML template for report customerization and generation.
+
+    Overall structure of an HTML report
+
+    HTML
+    +------------------------+
+    |<html>                  |
+    |  <head>                |
+    |                        |
+    |   STYLESHEET           |
+    |   +----------------+   |
+    |   |                |   |
+    |   +----------------+   |
+    |                        |
+    |  </head>               |
+    |                        |
+    |  <body>                |
+    |                        |
+    |   HEADING              |
+    |   +----------------+   |
+    |   |                |   |
+    |   +----------------+   |
+    |                        |
+    |   REPORT               |
+    |   +----------------+   |
+    |   |                |   |
+    |   +----------------+   |
+    |                        |
+    |   ENDING               |
+    |   +----------------+   |
+    |   |                |   |
+    |   +----------------+   |
+    |                        |
+    |  </body>               |
+    |</html>                 |
+    +------------------------+
+    """
+
+    STATUS = {
+    0: 'pass',
+    1: 'fail',
+    2: 'error',
+    }
+
+    DEFAULT_TITLE = 'Unit Test Report'
+    DEFAULT_DESCRIPTION = ''
+
+    # ------------------------------------------------------------------------
+    # HTML Template
+
+    HTML_TMPL = r"""<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <title>%(title)s</title>
+    <meta name="generator" content="%(generator)s"/>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+    %(stylesheet)s
+</head>
+<body>
+<script language="javascript" type="text/javascript"><!--
+output_list = Array();
+
+/* level - 0:Summary; 1:Failed; 2:All */
+function showCase(level) {
+    trs = document.getElementsByTagName("tr");
+    for (var i = 0; i < trs.length; i++) {
+        tr = trs[i];
+        id = tr.id;
+        if (id.substr(0,2) == 'ft') {
+            if (level < 1) {
+                tr.className = 'hiddenRow';
+            }
+            else {
+                tr.className = '';
+            }
+        }
+        if (id.substr(0,2) == 'pt') {
+            if (level > 1) {
+                tr.className = '';
+            }
+            else {
+                tr.className = 'hiddenRow';
+            }
+        }
+    }
+}
+
+
+function showClassDetail(cid, count) {
+    var id_list = Array(count);
+    var toHide = 1;
+    for (var i = 0; i < count; i++) {
+        tid0 = 't' + cid.substr(1) + '.' + (i+1);
+        tid = 'f' + tid0;
+        tr = document.getElementById(tid);
+        if (!tr) {
+            tid = 'p' + tid0;
+            tr = document.getElementById(tid);
+        }
+        id_list[i] = tid;
+        if (tr.className) {
+            toHide = 0;
+        }
+    }
+    for (var i = 0; i < count; i++) {
+        tid = id_list[i];
+        if (toHide) {
+            document.getElementById('div_'+tid).style.display = 'none'
+            document.getElementById(tid).className = 'hiddenRow';
+        }
+        else {
+            document.getElementById(tid).className = '';
+        }
+    }
+}
+
+
+function showTestDetail(div_id){
+    var details_div = document.getElementById(div_id)
+    var displayState = details_div.style.display
+    // alert(displayState)
+    if (displayState != 'block' ) {
+        displayState = 'block'
+        details_div.style.display = 'block'
+    }
+    else {
+        details_div.style.display = 'none'
+    }
+}
+
+
+function html_escape(s) {
+    s = s.replace(/&/g,'&amp;');
+    s = s.replace(/</g,'&lt;');
+    s = s.replace(/>/g,'&gt;');
+    return s;
+}
+
+/* obsoleted by detail in <div>
+function showOutput(id, name) {
+    var w = window.open("", //url
+                    name,
+                    "resizable,scrollbars,status,width=800,height=450");
+    d = w.document;
+    d.write("<pre>");
+    d.write(html_escape(output_list[id]));
+    d.write("\n");
+    d.write("<a href='javascript:window.close()'>close</a>\n");
+    d.write("</pre>\n");
+    d.close();
+}
+*/
+--></script>
+
+%(heading)s
+%(report)s
+%(ending)s
+
+</body>
+</html>
+"""
+    # variables: (title, generator, stylesheet, heading, report, ending)
+
+
+    # ------------------------------------------------------------------------
+    # Stylesheet
+    #
+    # alternatively use a <link> for external style sheet, e.g.
+    #   <link rel="stylesheet" href="$url" type="text/css">
+
+    STYLESHEET_TMPL = """
+<style type="text/css" media="screen">
+body        { font-family: verdana, arial, helvetica, sans-serif; font-size: 80%; }
+table       { font-size: 100%; }
+pre         { }
+
+/* -- heading ---------------------------------------------------------------------- */
+h1 {
+       font-size: 16pt;
+       color: gray;
+}
+.heading {
+    margin-top: 0ex;
+    margin-bottom: 1ex;
+}
+
+.heading .attribute {
+    margin-top: 1ex;
+    margin-bottom: 0;
+}
+
+.heading .description {
+    margin-top: 4ex;
+    margin-bottom: 6ex;
+}
+
+/* -- css div popup ------------------------------------------------------------------------ */
+a.popup_link {
+}
+
+a.popup_link:hover {
+    color: red;
+}
+
+.popup_window {
+    display: none;
+    position: relative;
+    left: 0px;
+    top: 0px;
+    /*border: solid #627173 1px; */
+    padding: 10px;
+    background-color: #E6E6D6;
+    font-family: "Lucida Console", "Courier New", Courier, monospace;
+    text-align: left;
+    font-size: 8pt;
+    width: 500px;
+}
+
+}
+/* -- report ------------------------------------------------------------------------ */
+#show_detail_line {
+    margin-top: 3ex;
+    margin-bottom: 1ex;
+}
+#result_table {
+    width: 80%;
+    border-collapse: collapse;
+    border: 1px solid #777;
+}
+#header_row {
+    font-weight: bold;
+    color: white;
+    background-color: #777;
+}
+#result_table td {
+    border: 1px solid #777;
+    padding: 2px;
+}
+#total_row  { font-weight: bold; }
+.passClass  { background-color: #6c6; }
+.failClass  { background-color: #c60; }
+.errorClass { background-color: #c00; }
+.passCase   { color: #6c6; }
+.failCase   { color: #c60; font-weight: bold; }
+.errorCase  { color: #c00; font-weight: bold; }
+.hiddenRow  { display: none; }
+.testcase   { margin-left: 2em; }
+
+
+/* -- ending ---------------------------------------------------------------------- */
+#ending {
+}
+
+</style>
+"""
+
+
+
+    # ------------------------------------------------------------------------
+    # Heading
+    #
+
+    HEADING_TMPL = """<div class='heading'>
+<h1>%(title)s</h1>
+%(parameters)s
+<p class='description'>%(description)s</p>
+</div>
+
+""" # variables: (title, parameters, description)
+
+    HEADING_ATTRIBUTE_TMPL = """<p class='attribute'><strong>%(name)s:</strong> %(value)s</p>
+""" # variables: (name, value)
+
+
+
+    # ------------------------------------------------------------------------
+    # Report
+    #
+
+    REPORT_TMPL = """
+<p id='show_detail_line'>Show
+<a href='javascript:showCase(0)'>Summary</a>
+<a href='javascript:showCase(1)'>Failed</a>
+<a href='javascript:showCase(2)'>All</a>
+</p>
+<table id='result_table'>
+<colgroup>
+<col align='left' />
+<col align='right' />
+<col align='right' />
+<col align='right' />
+<col align='right' />
+<col align='right' />
+</colgroup>
+<tr id='header_row'>
+    <td>Test Group/Test case</td>
+    <td>Count</td>
+    <td>Pass</td>
+    <td>Fail</td>
+    <td>Error</td>
+    <td>View</td>
+</tr>
+%(test_list)s
+<tr id='total_row'>
+    <td>Total</td>
+    <td>%(count)s</td>
+    <td>%(Pass)s</td>
+    <td>%(fail)s</td>
+    <td>%(error)s</td>
+    <td>&nbsp;</td>
+</tr>
+</table>
+""" # variables: (test_list, count, Pass, fail, error)
+
+    REPORT_CLASS_TMPL = r"""
+<tr class='%(style)s'>
+    <td>%(desc)s</td>
+    <td>%(count)s</td>
+    <td>%(Pass)s</td>
+    <td>%(fail)s</td>
+    <td>%(error)s</td>
+    <td><a href="javascript:showClassDetail('%(cid)s',%(count)s)">Detail</a></td>
+</tr>
+""" # variables: (style, desc, count, Pass, fail, error, cid)
+
+
+    REPORT_TEST_WITH_OUTPUT_TMPL = r"""
+<tr id='%(tid)s' class='%(Class)s'>
+    <td class='%(style)s'><div class='testcase'>%(desc)s</div></td>
+    <td colspan='5' align='center'>
+
+    <!--css div popup start-->
+    <a class="popup_link" onfocus='this.blur();' href="javascript:showTestDetail('div_%(tid)s')" >
+        %(status)s</a>
+
+    <div id='div_%(tid)s' class="popup_window">
+        <div style='text-align: right; color:red;cursor:pointer'>
+        <a onfocus='this.blur();' onclick="document.getElementById('div_%(tid)s').style.display = 'none' " >
+           [x]</a>
+        </div>
+        <pre>
+        %(script)s
+        </pre>
+    </div>
+    <!--css div popup end-->
+
+    </td>
+</tr>
+""" # variables: (tid, Class, style, desc, status)
+
+
+    REPORT_TEST_NO_OUTPUT_TMPL = r"""
+<tr id='%(tid)s' class='%(Class)s'>
+    <td class='%(style)s'><div class='testcase'>%(desc)s</div></td>
+    <td colspan='5' align='center'>%(status)s</td>
+</tr>
+""" # variables: (tid, Class, style, desc, status)
+
+
+    REPORT_TEST_OUTPUT_TMPL = r"""
+%(id)s: %(output)s
+""" # variables: (id, output)
+
+
+
+    # ------------------------------------------------------------------------
+    # ENDING
+    #
+
+    ENDING_TMPL = """<div id='ending'>&nbsp;</div>"""
+
+# -------------------- The end of the Template class -------------------
+
+
+TestResult = unittest.TestResult
+
+class _TestResult(TestResult):
+    # note: _TestResult is a pure representation of results.
+    # It lacks the output and reporting ability compares to unittest._TextTestResult.
+
+    def __init__(self, verbosity=1):
+        TestResult.__init__(self)
+        self.stdout0 = None
+        self.stderr0 = None
+        self.success_count = 0
+        self.failure_count = 0
+        self.error_count = 0
+        self.verbosity = verbosity
+
+        # result is a list of result in 4 tuple
+        # (
+        #   result code (0: success; 1: fail; 2: error),
+        #   TestCase object,
+        #   Test output (byte string),
+        #   stack trace,
+        # )
+        self.result = []
+
+
+    def startTest(self, test):
+        TestResult.startTest(self, test)
+        # just one buffer for both stdout and stderr
+        self.outputBuffer = StringIO.StringIO()
+        stdout_redirector.fp = self.outputBuffer
+        stderr_redirector.fp = self.outputBuffer
+        self.stdout0 = sys.stdout
+        self.stderr0 = sys.stderr
+        sys.stdout = stdout_redirector
+        sys.stderr = stderr_redirector
+
+
+    def complete_output(self):
+        """
+        Disconnect output redirection and return buffer.
+        Safe to call multiple times.
+        """
+        if self.stdout0:
+            sys.stdout = self.stdout0
+            sys.stderr = self.stderr0
+            self.stdout0 = None
+            self.stderr0 = None
+        return self.outputBuffer.getvalue()
+
+
+    def stopTest(self, test):
+        # Usually one of addSuccess, addError or addFailure would have been called.
+        # But there are some path in unittest that would bypass this.
+        # We must disconnect stdout in stopTest(), which is guaranteed to be called.
+        self.complete_output()
+
+
+    def addSuccess(self, test):
+        self.success_count += 1
+        TestResult.addSuccess(self, test)
+        output = self.complete_output()
+        self.result.append((0, test, output, ''))
+        if self.verbosity > 1:
+            sys.stderr.write('ok ')
+            sys.stderr.write(str(test))
+            sys.stderr.write('\n')
+        else:
+            sys.stderr.write('.')
+
+    def addError(self, test, err):
+        self.error_count += 1
+        TestResult.addError(self, test, err)
+        _, _exc_str = self.errors[-1]
+        output = self.complete_output()
+        self.result.append((2, test, output, _exc_str))
+        if self.verbosity > 1:
+            sys.stderr.write('E  ')
+            sys.stderr.write(str(test))
+            sys.stderr.write('\n')
+        else:
+            sys.stderr.write('E')
+
+    def addFailure(self, test, err):
+        self.failure_count += 1
+        TestResult.addFailure(self, test, err)
+        _, _exc_str = self.failures[-1]
+        output = self.complete_output()
+        self.result.append((1, test, output, _exc_str))
+        if self.verbosity > 1:
+            sys.stderr.write('F  ')
+            sys.stderr.write(str(test))
+            sys.stderr.write('\n')
+        else:
+            sys.stderr.write('F')
+
+
+class HTMLTestRunner(Template_mixin):
+    """
+    """
+    def __init__(self, stream=sys.stdout, verbosity=1, title=None, description=None):
+        self.stream = stream
+        self.verbosity = verbosity
+        if title is None:
+            self.title = self.DEFAULT_TITLE
+        else:
+            self.title = title
+        if description is None:
+            self.description = self.DEFAULT_DESCRIPTION
+        else:
+            self.description = description
+
+        self.startTime = datetime.datetime.now()
+
+
+    def run(self, test):
+        "Run the given test case or test suite."
+        result = _TestResult(self.verbosity)
+        test(result)
+        self.stopTime = datetime.datetime.now()
+        self.generateReport(test, result)
+        print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime)
+        return result
+
+
+    def sortResult(self, result_list):
+        # unittest does not seems to run in any particular order.
+        # Here at least we want to group them together by class.
+        rmap = {}
+        classes = []
+        for n,t,o,e in result_list:
+            cls = t.__class__
+            if not rmap.has_key(cls):
+                rmap[cls] = []
+                classes.append(cls)
+            rmap[cls].append((n,t,o,e))
+        r = [(cls, rmap[cls]) for cls in classes]
+        return r
+
+
+    def getReportAttributes(self, result):
+        """
+        Return report attributes as a list of (name, value).
+        Override this to add custom attributes.
+        """
+        startTime = str(self.startTime)[:19]
+        duration = str(self.stopTime - self.startTime)
+        status = []
+        if result.success_count: status.append('Pass %s'    % result.success_count)
+        if result.failure_count: status.append('Failure %s' % result.failure_count)
+        if result.error_count:   status.append('Error %s'   % result.error_count  )
+        if status:
+            status = ' '.join(status)
+        else:
+            status = 'none'
+        return [
+            ('Start Time', startTime),
+            ('Duration', duration),
+            ('Status', status),
+        ]
+
+
+    def generateReport(self, test, result):
+        report_attrs = self.getReportAttributes(result)
+        generator = 'HTMLTestRunner %s' % __version__
+        stylesheet = self._generate_stylesheet()
+        heading = self._generate_heading(report_attrs)
+        report = self._generate_report(result)
+        ending = self._generate_ending()
+        output = self.HTML_TMPL % dict(
+            title = saxutils.escape(self.title),
+            generator = generator,
+            stylesheet = stylesheet,
+            heading = heading,
+            report = report,
+            ending = ending,
+        )
+        self.stream.write(output.encode('utf8'))
+
+
+    def _generate_stylesheet(self):
+        return self.STYLESHEET_TMPL
+
+
+    def _generate_heading(self, report_attrs):
+        a_lines = []
+        for name, value in report_attrs:
+            line = self.HEADING_ATTRIBUTE_TMPL % dict(
+                    name = saxutils.escape(name),
+                    value = saxutils.escape(value),
+                )
+            a_lines.append(line)
+        heading = self.HEADING_TMPL % dict(
+            title = saxutils.escape(self.title),
+            parameters = ''.join(a_lines),
+            description = saxutils.escape(self.description),
+        )
+        return heading
+
+
+    def _generate_report(self, result):
+        rows = []
+        sortedResult = self.sortResult(result.result)
+        for cid, (cls, cls_results) in enumerate(sortedResult):
+            # subtotal for a class
+            np = nf = ne = 0
+            for n,t,o,e in cls_results:
+                if n == 0: np += 1
+                elif n == 1: nf += 1
+                else: ne += 1
+
+            # format class description
+            if cls.__module__ == "__main__":
+                name = cls.__name__
+            else:
+                name = "%s.%s" % (cls.__module__, cls.__name__)
+            doc = cls.__doc__ and cls.__doc__.split("\n")[0] or ""
+            desc = doc and '%s: %s' % (name, doc) or name
+
+            row = self.REPORT_CLASS_TMPL % dict(
+                style = ne > 0 and 'errorClass' or nf > 0 and 'failClass' or 'passClass',
+                desc = desc,
+                count = np+nf+ne,
+                Pass = np,
+                fail = nf,
+                error = ne,
+                cid = 'c%s' % (cid+1),
+            )
+            rows.append(row)
+
+            for tid, (n,t,o,e) in enumerate(cls_results):
+                self._generate_report_test(rows, cid, tid, n, t, o, e)
+
+        report = self.REPORT_TMPL % dict(
+            test_list = ''.join(rows),
+            count = str(result.success_count+result.failure_count+result.error_count),
+            Pass = str(result.success_count),
+            fail = str(result.failure_count),
+            error = str(result.error_count),
+        )
+        return report
+
+
+    def _generate_report_test(self, rows, cid, tid, n, t, o, e):
+        # e.g. 'pt1.1', 'ft1.1', etc
+        has_output = bool(o or e)
+        tid = (n == 0 and 'p' or 'f') + 't%s.%s' % (cid+1,tid+1)
+        name = t.id().split('.')[-1]
+        doc = t.shortDescription() or ""
+        desc = doc and ('%s: %s' % (name, doc)) or name
+        tmpl = has_output and self.REPORT_TEST_WITH_OUTPUT_TMPL or self.REPORT_TEST_NO_OUTPUT_TMPL
+
+        # o and e should be byte string because they are collected from stdout and stderr?
+        if isinstance(o,str):
+            # TODO: some problem with 'string_escape': it escape \n and mess up formating
+            # uo = unicode(o.encode('string_escape'))
+            uo = o.decode('latin-1')
+        else:
+            uo = o
+        if isinstance(e,str):
+            # TODO: some problem with 'string_escape': it escape \n and mess up formating
+            # ue = unicode(e.encode('string_escape'))
+            ue = e.decode('latin-1')
+        else:
+            ue = e
+
+        script = self.REPORT_TEST_OUTPUT_TMPL % dict(
+            id = tid,
+            output = saxutils.escape(uo+ue),
+        )
+
+        row = tmpl % dict(
+            tid = tid,
+            Class = (n == 0 and 'hiddenRow' or 'none'),
+            style = n == 2 and 'errorCase' or (n == 1 and 'failCase' or 'none'),
+            desc = desc,
+            script = script,
+            status = self.STATUS[n],
+        )
+        rows.append(row)
+        if not has_output:
+            return
+
+    def _generate_ending(self):
+        return self.ENDING_TMPL
+
+
+##############################################################################
+# Facilities for running tests from the command line
+##############################################################################
+
+# Note: Reuse unittest.TestProgram to launch test. In the future we may
+# build our own launcher to support more specific command line
+# parameters like test title, CSS, etc.
+class TestProgram(unittest.TestProgram):
+    """
+    A variation of the unittest.TestProgram. Please refer to the base
+    class for command line parameters.
+    """
+    def runTests(self):
+        # Pick HTMLTestRunner as the default test runner.
+        # base class's testRunner parameter is not useful because it means
+        # we have to instantiate HTMLTestRunner before we know self.verbosity.
+        if self.testRunner is None:
+            self.testRunner = HTMLTestRunner(verbosity=self.verbosity)
+        unittest.TestProgram.runTests(self)
+
+main = TestProgram
+
+##############################################################################
+# Executing this module from the command line
+##############################################################################
+
+if __name__ == "__main__":
+    main(module=None)
diff --git a/unittestpy/__init__.py b/unittestpy/__init__.py
new file mode 100644 (file)
index 0000000..e69de29