New run_keyword programs.

  - New programs to run the caller's keyword string.  This is useful for
    programs which need to call keywords from the command line.

Change-Id: Ie856910d1ff491e5eb2c764fdf494d875ecf474b
Signed-off-by: Michael Walsh <micwalsh@us.ibm.com>
diff --git a/extended/run_keyword.py b/extended/run_keyword.py
new file mode 100755
index 0000000..3f1a10b
--- /dev/null
+++ b/extended/run_keyword.py
@@ -0,0 +1,99 @@
+#!/usr/bin/env python
+
+r"""
+This module is the python counterpart to run_keyword.robot.
+"""
+
+import gen_print as gp
+import gen_robot_print as grp
+import gen_robot_valid as grv
+
+from robot.libraries.BuiltIn import BuiltIn
+
+
+###############################################################################
+def main_py():
+
+    r"""
+    Do main program processing.
+    """
+
+    setup()
+
+    keyword_string = BuiltIn().get_variable_value("${keyword_string}")
+    lib_file_path = BuiltIn().get_variable_value("${lib_file_path}")
+
+    cmd_buf = keyword_string.split("  ")
+
+    if lib_file_path != "":
+        # We don't want global variable getting changed when an import is done
+        # so we'll save it and restore it.
+        quiet = int(BuiltIn().get_variable_value("${quiet}"))
+        if lib_file_path.endswith(".py"):
+            grp.rdprint_issuing("import_library(\"" + lib_file_path + "\")")
+            BuiltIn().import_library(lib_file_path)
+        else:
+            grp.rdprint_issuing("import_resource(\"" + lib_file_path + "\")")
+            BuiltIn().import_resource(lib_file_path)
+        BuiltIn().set_global_variable("${quiet}", quiet)
+
+    error_message = grp.sprint_error_report("Keyword \"" + cmd_buf[0] +
+                                            "\" does not exist.\n")
+    BuiltIn().keyword_should_exist(cmd_buf[0], msg=error_message)
+
+    grp.rqprint_issuing_keyword(cmd_buf)
+    status, output = BuiltIn().run_keyword_and_ignore_error(*cmd_buf)
+    if status != "PASS":
+        error_message = grp.sprint_error_report("\"" + cmd_buf[0] +
+                                                "\" failed with the" +
+                                                " following error:\n" + output)
+        if not quiet:
+            grp.rprint(error_message, 'STDERR')
+        BuiltIn().fail(error_message)
+
+    if output is not None:
+        grp.rprint(output)
+
+###############################################################################
+
+
+###############################################################################
+def setup():
+
+    r"""
+    Do general program setup tasks.
+    """
+
+    grp.rqprintn()
+
+    validate_parms()
+
+    grp.rqprint_pgm_header()
+
+###############################################################################
+
+
+###############################################################################
+def validate_parms():
+
+    r"""
+    Validate all program parameters.
+    """
+
+    grv.rvalid_value("keyword_string")
+
+    return True
+
+###############################################################################
+
+
+###############################################################################
+def program_teardown():
+
+    r"""
+    Clean up after this program.
+    """
+
+    grp.rqprint_pgm_footer()
+
+###############################################################################
diff --git a/extended/run_keyword.robot b/extended/run_keyword.robot
new file mode 100755
index 0000000..52924d1
--- /dev/null
+++ b/extended/run_keyword.robot
@@ -0,0 +1,35 @@
+*** Settings ***
+Documentation  Run the caller's keyword string.
+
+# NOTE: Robot searches PYTHONPATH for libraries.
+Library   run_keyword.py
+
+
+*** Variables ***
+# Initialize program parameters variables.
+# Create parm_list containing all of our program parameters.  parm_list is
+# used by "rqprint_pgm_header".
+@{parm_list}                keyword_string  lib_file_path  test_mode  quiet
+...  debug
+
+# Initialize each program parameter.
+${keyword_string}           ${EMPTY}
+${lib_file_path}            ${EMPTY}
+${test_mode}                0
+${quiet}                    0
+${debug}                    0
+
+
+*** Test Cases ***
+Run Keyword Pgm
+    Main
+
+*** Keywords ***
+###############################################################################
+Main
+    [Teardown]  Program Teardown
+
+    Main Py
+
+###############################################################################
+