blob: 71752bf78f4662b3792968a9c9c9eac4269db523 [file] [log] [blame]
Michael Walshde791732016-09-06 14:25:24 -05001#!/usr/bin/env python
2
3r"""
4This file contains functions useful for printing to stdout from robot programs.
5"""
6
Michael Walshde791732016-09-06 14:25:24 -05007import re
Michael Walsh18176322016-11-15 15:11:21 -06008import os
Michael Walsh7423c012016-10-04 10:27:21 -05009
Michael Walshde791732016-09-06 14:25:24 -050010import gen_print as gp
Michael Walshff790b62019-05-17 16:31:16 -050011import func_args as fa
Michael Walsh7423c012016-10-04 10:27:21 -050012
Michael Walshde791732016-09-06 14:25:24 -050013from robot.libraries.BuiltIn import BuiltIn
Michael Walshde791732016-09-06 14:25:24 -050014
Michael Walsh6e646982019-03-28 12:55:31 -050015gen_robot_print_debug = int(os.environ.get('GEN_ROBOT_PRINT_DEBUG', '0'))
Michael Walshde791732016-09-06 14:25:24 -050016
Michael Walshde791732016-09-06 14:25:24 -050017
Michael Walshff790b62019-05-17 16:31:16 -050018def sprint_vars(*args, **kwargs):
Michael Walshde791732016-09-06 14:25:24 -050019 r"""
Michael Walsh6e646982019-03-28 12:55:31 -050020 Sprint the values of one or more variables to the console.
21
Michael Walshff790b62019-05-17 16:31:16 -050022 This is a robot re-definition of the sprint_vars function in gen_print.py.
Michael Walsh6e646982019-03-28 12:55:31 -050023 Given a list of variable names, this keyword will string print each
24 variable name and value such that each value lines up in the same column
25 as messages printed with sprint_time().
Michael Walsh18176322016-11-15 15:11:21 -060026
Michael Walshff790b62019-05-17 16:31:16 -050027 Description of argument(s):
28 args The names of the variables to be printed
29 (e.g. var1 rather than ${var1}).
30 kwargs See sprint_varx in gen_print.py for
31 descriptions of all other arguments.
Michael Walsh18176322016-11-15 15:11:21 -060032 """
33
Michael Walshff790b62019-05-17 16:31:16 -050034 if 'fmt' in kwargs:
35 # Find format option names in kwargs['fmt'] and wrap them with "gp."
36 # and "()" to make them into function calls. For example, terse would
37 # be converted to "gp.terse()". This allows the user to simply
38 # specify "fmt=terse" (vs. fmt=gp.terse()).
39 regex = "(" + "|".join(gp.valid_fmts()) + ")"
40 kwargs['fmt'] = \
41 re.sub(regex, "gp.\\1()", kwargs['fmt'])
42 kwargs = fa.args_to_objects(kwargs)
Michael Walsh18176322016-11-15 15:11:21 -060043 buffer = ""
Michael Walshff790b62019-05-17 16:31:16 -050044 for var_name in args:
Michael Walsh0fa47622017-02-20 16:11:34 -060045 var_value = BuiltIn().get_variable_value("${" + str(var_name) + "}")
Michael Walshff790b62019-05-17 16:31:16 -050046 buffer += gp.sprint_varx(var_name, var_value, **kwargs)
Michael Walsh18176322016-11-15 15:11:21 -060047
48 return buffer
49
Michael Walsh18176322016-11-15 15:11:21 -060050
Michael Walsh18176322016-11-15 15:11:21 -060051def sprint_auto_vars(headers=0):
Michael Walsh18176322016-11-15 15:11:21 -060052 r"""
Michael Walsh6e646982019-03-28 12:55:31 -050053 String print all of the Automatic Variables described in the Robot User's
54 Guide using sprint_vars.
Michael Walshde791732016-09-06 14:25:24 -050055
56 NOTE: Not all automatic variables are guaranteed to exist.
57
Michael Walshff790b62019-05-17 16:31:16 -050058 Description of argument(s):
Michael Walshde791732016-09-06 14:25:24 -050059 headers This indicates that a header and footer
Michael Walsh18176322016-11-15 15:11:21 -060060 should be printed.
Michael Walshde791732016-09-06 14:25:24 -050061 """
62
Michael Walsh18176322016-11-15 15:11:21 -060063 buffer = ""
Michael Walshde791732016-09-06 14:25:24 -050064 if int(headers) == 1:
Michael Walsh18176322016-11-15 15:11:21 -060065 buffer += gp.sprint_dashes()
66 buffer += "Automatic Variables:"
Michael Walshde791732016-09-06 14:25:24 -050067
Michael Walsh18176322016-11-15 15:11:21 -060068 buffer += \
69 sprint_vars(
70 "TEST_NAME", "TEST_TAGS", "TEST_DOCUMENTATION", "TEST_STATUS",
71 "TEST_DOCUMENTATION", "TEST_STATUS", "TEST_MESSAGE",
72 "PREV_TEST_NAME", "PREV_TEST_STATUS", "PREV_TEST_MESSAGE",
73 "SUITE_NAME", "SUITE_SOURCE", "SUITE_DOCUMENTATION",
74 "SUITE_METADATA", "SUITE_STATUS", "SUITE_MESSAGE",
75 "KEYWORD_STATUS", "KEYWORD_MESSAGE", "LOG_LEVEL", "OUTPUT_FILE",
76 "LOG_FILE", "REPORT_FILE", "DEBUG_FILE", "OUTPUT_DIR")
Michael Walshde791732016-09-06 14:25:24 -050077
78 if int(headers) == 1:
Michael Walsh18176322016-11-15 15:11:21 -060079 buffer += gp.sprint_dashes()
80
81 return buffer
Michael Walshde791732016-09-06 14:25:24 -050082
Michael Walshde791732016-09-06 14:25:24 -050083
Michael Walsh6e646982019-03-28 12:55:31 -050084def gp_debug_print(buffer):
85 r"""
Michael Walshff790b62019-05-17 16:31:16 -050086 Print the buffer value only if gen_robot_print_debug is set.
Michael Walshde791732016-09-06 14:25:24 -050087
Michael Walsh6e646982019-03-28 12:55:31 -050088 This function is intended for use only by other functions in this module.
Michael Walshde791732016-09-06 14:25:24 -050089
Michael Walshff790b62019-05-17 16:31:16 -050090 Description of argument(s):
Michael Walsh6e646982019-03-28 12:55:31 -050091 buffer The string to be printed.
92 """
Michael Walshde791732016-09-06 14:25:24 -050093
Michael Walsh6e646982019-03-28 12:55:31 -050094 if not gen_robot_print_debug:
95 return
Michael Walsh6e646982019-03-28 12:55:31 -050096 gp.gp_print(buffer)
Michael Walsha6723f22016-11-22 11:12:01 -060097
Michael Walshafa7a1b2016-12-09 14:02:48 -060098
Michael Walsh6e646982019-03-28 12:55:31 -050099# In the following section of code, we will dynamically create print versions
Michael Walshff790b62019-05-17 16:31:16 -0500100# for several of the sprint functions defined above. For example, where we
101# have an sprint_vars() function defined above that returns formatted variable
102# print outs in a string, we will create a corresponding rprint_vars()
Michael Walsh6e646982019-03-28 12:55:31 -0500103# function that will print that string directly to stdout.
Michael Walsha6723f22016-11-22 11:12:01 -0600104
Michael Walsh6e646982019-03-28 12:55:31 -0500105# It can be complicated to follow what's being created below. Here is an
106# example of the rprint_vars() function that will be created:
Michael Walsha6723f22016-11-22 11:12:01 -0600107
Michael Walshff790b62019-05-17 16:31:16 -0500108# def rprint_vars(*args, **kwargs):
109# gp.gp_print(gp.replace_passwords(sprint_vars(*args, **kwargs)),
110# stream='stdout')
111
112# For sprint_vars (defined above), the following functions will be created:
113
114# rprint_vars Robot Print Vars
115# rqprint_vars Robot Print Vars if ${quiet} is set to
116# ${0}.
117# rdprint_vars Robot Print Vars if ${debug} is set to
118# ${1}.
119# rlprint_vars Robot Print Vars to the log instead of to
120# the console.
121
122# Abbreviated names are created for all of the preceding function names:
123# rpvars
124# rqpvars
125# rdpvars
126# rlpvars
127
128# Users are encouraged to only use the abbreviated forms for development but
129# to then ultimately switch to full names.
130# Rprint Vars (instead of Rpvars)
Michael Walshde791732016-09-06 14:25:24 -0500131
Michael Walsh6e646982019-03-28 12:55:31 -0500132replace_dict = {'output_stream': 'stdout', 'mod_qualifier': 'gp.'}
Michael Walshafa7a1b2016-12-09 14:02:48 -0600133
Michael Walsh6e646982019-03-28 12:55:31 -0500134gp_debug_print("gp.robot_env: " + str(gp.robot_env) + "\n")
Michael Walsh18176322016-11-15 15:11:21 -0600135
Michael Walshff790b62019-05-17 16:31:16 -0500136# func_names contains a list of all rprint functions which should be created
Michael Walsh6e646982019-03-28 12:55:31 -0500137# from their sprint counterparts.
138func_names = [
139 'print_vars', 'print_auto_vars'
140]
Michael Walsh18176322016-11-15 15:11:21 -0600141
Michael Walsh6e646982019-03-28 12:55:31 -0500142# stderr_func_names is a list of functions whose output should go to stderr
143# rather than stdout.
144stderr_func_names = []
Michael Walsh18176322016-11-15 15:11:21 -0600145
Michael Walsh6e646982019-03-28 12:55:31 -0500146func_defs = gp.create_print_wrapper_funcs(func_names, stderr_func_names,
147 replace_dict, "r")
148gp_debug_print(func_defs)
149exec(func_defs)
Michael Walsh18176322016-11-15 15:11:21 -0600150
151# Define an alias. rpvar is just a special case of rpvars where the args
152# list contains only one element.
153cmd_buf = "rpvar = rpvars"
Michael Walsh6e646982019-03-28 12:55:31 -0500154gp_debug_print("\n" + cmd_buf + "\n")
Michael Walsh18176322016-11-15 15:11:21 -0600155exec(cmd_buf)