""" Utility module to help debug Python scripts

	--------------------------------------------------------------------------
	File: 			utilsDebug.py

	Overview: 		Python module to supply functions to help debug Python
					scripts.
									
	Gotchas:		None.

	Copyright:		None.
	--------------------------------------------------------------------------
	
"""

# Python modules:

# Third party modules:

# In-house modules:

# Instantiations:

#-----------------------------------------------------------------------------
# Details:	Class to implement simple stack function trace. Instantiation the
#			class as the first function you want to trace. Example:
#				obj = utilsDebug.CDebugFnVerbose( "validate_arguments()" );
# Gotchas:	This class will not work in properly in a multi-threaded 
#			environment.
# Authors:	Illya Rudkin 28/11/2013.
# Changes:	None.
#--
class CDebugFnVerbose:
	# Public static properties:
	bVerboseOn = False;	# True = turn on function tracing, False = turn off.
		
	# Public:
	#++------------------------------------------------------------------------
	# Details:	CDebugFnVerbose constructor.
	# Type:		Method.
	# Args:		vstrFnName	- (R) Text description i.e. a function name.
	# Return:	None.
	# Throws:	None.
	#--
	# CDebugFnVerbose( vstrFnName )
	
	#++------------------------------------------------------------------------
	# Details:	Print out information on the object specified.
	# Type:		Method.
	# Args:		vstrText	- (R) Some helper text description.
	#			vObject		- (R) Some Python type object.
	# Return:	None.
	# Throws:	None.
	#--
	def dump_object( self, vstrText, vObject ):
		if CDebugFnVerbose.bVerboseOn == False:
			return;
		print "%d%s> Dp: %s" % (CDebugFnVerbose.__nLevel, self.__get_dots(), 
								vstrText),;
		print vObject;
	
	#++------------------------------------------------------------------------
	# Details:	Print out some progress text given by the client.
	# Type:		Method.
	# Args:		vstrText	- (R) Some helper text description.
	# Return:	None.
	# Throws:	None.
	#--
	def dump_text( self, vstrText ):
		if CDebugFnVerbose.bVerboseOn == False:
			return;
		print "%d%s> Dp: %s" % (CDebugFnVerbose.__nLevel, self.__get_dots(),
								vstrText);
				
	# Private methods:
	def __init__( self, vstrFnName ):
		self.__indent_out( vstrFnName );
		
	# Class destructor 
	def __del__( self ):
		self.__indent_back();
		
	#++------------------------------------------------------------------------
	# Details:	Build an indentation string of dots based on the __nLevel.
	# Type:		Method.
	# Args:		None.
	# Return:	Str -	variable length string.
	# Throws:	None.
	#--
	def __get_dots( self ):
		return "".join( "." for i in range( 0, CDebugFnVerbose.__nLevel ) );
	
	#++------------------------------------------------------------------------
	# Details:	Build and print out debug verbosity text indicating the function
	#			just exited from.
	# Type:		Method.
	# Args:		None.
	# Return:	None.
	# Throws:	None.
	#--
	def __indent_back( self ):
		if CDebugFnVerbose.bVerboseOn:
			print "%d%s< fn: %s" % (CDebugFnVerbose.__nLevel, self.__get_dots(),
									self.__strFnName);
		CDebugFnVerbose.__nLevel -= 1;

	#++------------------------------------------------------------------------
	# Details:	Build and print out debug verbosity text indicating the function
	#			just entered.
	# Type:		Method.
	# Args:		vstrFnName - (R) Name of the function entered.
	# Return:	None.
	# Throws:	None.
	#--
	def __indent_out( self, vstrFnName ):
		CDebugFnVerbose.__nLevel += 1;
		self.__strFnName = vstrFnName;
		if CDebugFnVerbose.bVerboseOn:
			print "%d%s> fn: %s" % ( CDebugFnVerbose.__nLevel, self.__get_dots(), 
									 self.__strFnName);

	# Private statics attributes:
	__nLevel = 0;	# Indentation level counter
	
	# Private attributes:
	__strFnName = "";
	
	
	
