Source code for fundamentals.utKit

#!/usr/bin/env python
# encoding: utf-8
"""
*A unit-testing kit to simplify my unit-tests*

Author
: David Young
"""

from builtins import object
import sys
import os
import logging
import logging.config
import yaml

try:
    yaml.warnings({"YAMLLoadWarning": False})
except:
    pass


[docs] class utKit(object): """ *Default setup for fundamentals style unit-testing workflow (all tests base on nose module)* **Key Arguments** - ``moduleDirectory`` -- the directory to the unit-testing test file **Usage** To use this kit within any of your unit-test modules add the following code before your test methods: ```python from fundamentals.utKit import utKit # SETUP AND TEARDOWN FIXTURE FUNCTIONS FOR THE ENTIRE MODULE moduleDirectory = os.path.dirname(__file__) utKit = utKit(moduleDirectory) log, dbConn, pathToInputDir, pathToOutputDir = utKit.setupModule() utKit.tearDownModule() ``` """ # Initialisation def __init__(self, moduleDirectory): self.moduleDirectory = moduleDirectory # x-self-arg-tmpx # SETUP PATHS TO COMMON DIRECTORIES FOR TEST DATA self.pathToInputDir = moduleDirectory + "/input/" self.pathToOutputDir = moduleDirectory + "/output/" # SETUP LOGGING self.loggerConfig = """ version: 1 formatters: file_style: format: '* %(asctime)s - %(name)s - %(levelname)s (%(pathname)s > %(funcName)s > %(lineno)d) - %(message)s ' datefmt: '%Y/%m/%d %H:%M:%S' console_style: format: '* %(asctime)s - %(levelname)s: %(pathname)s:%(funcName)s:%(lineno)d > %(message)s' datefmt: '%H:%M:%S' html_style: format: '<div id="row" class="%(levelname)s"><span class="date">%(asctime)s</span> <span class="label">file:</span><span class="filename">%(filename)s</span> <span class="label">method:</span><span class="funcName">%(funcName)s</span> <span class="label">line#:</span><span class="lineno">%(lineno)d</span> <span class="pathname">%(pathname)s</span> <div class="right"><span class="message">%(message)s</span><span class="levelname">%(levelname)s</span></div></div>' datefmt: '%Y-%m-%d <span class= "time">%H:%M <span class= "seconds">%Ss</span></span>' handlers: console: class: logging.StreamHandler level: DEBUG formatter: console_style stream: ext://sys.stdout root: level: DEBUG handlers: [console]""" self.dbConfig = """ version: 1 db: unit_tests host: localhost user: utuser password: utpass """ return
[docs] def setupModule(self): """ *The setupModule method* **Return** - ``log`` -- a logger - ``dbConn`` -- a database connection to a test database (details from yaml settings file) - ``pathToInputDir`` -- path to modules own test input directory - ``pathToOutputDir`` -- path to modules own test output directory """ ## VARIABLES ## logging.config.dictConfig(yaml.safe_load(self.loggerConfig)) log = logging.getLogger(__name__) if self.dbConfig: import pymysql as ms connDict = yaml.safe_load(self.dbConfig) dbConn = ms.connect( host=connDict["host"], user=connDict["user"], passwd=connDict["password"], db=connDict["db"], use_unicode=True, charset="utf8", local_infile=1, client_flag=ms.constants.CLIENT.MULTI_STATEMENTS, connect_timeout=3600, ) dbConn.autocommit(True) else: dbConn = False return log, dbConn, self.pathToInputDir, self.pathToOutputDir
[docs] def tearDownModule(self): """ *The tearDownModule method* """ return None
[docs] def get_project_root(self): """ *Get the root of the `python` package - useful for getting files in the root directory of a project* **Return** - ``rootPath`` -- the root path of a project """ import os rootPath = os.path.dirname(__file__) return rootPath
[docs] def refresh_database(self): """ *Refresh the unit test database* """ from fundamentals.mysql import directory_script_runner from fundamentals import tools packageDirectory = self.get_project_root() su = tools( arguments={"settingsFile": packageDirectory + "/test_settings.yaml"}, docString=__doc__, logLevel="DEBUG", options_first=False, projectName=None, defaultSettingsFile=False, ) arguments, settings, log, dbConn = su.setup() directory_script_runner( log=log, pathToScriptDirectory=packageDirectory + "/tests/input", dbConn=dbConn, successRule=None, failureRule=None, )
if __name__ == "__main__": main()