1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
# -*- coding -*-
"""
Provides some command utility functions.
TODO:
matcher that ignores empty lines and whitespace and has contains comparison
"""
from __future__ import absolute_import, print_function
from behave4cmd0 import pathutil
from behave4cmd0.__setup import TOP, TOPA
import os.path
import sys
import shutil
import time
import tempfile
from fnmatch import fnmatch
# -----------------------------------------------------------------------------
# CONSTANTS:
# -----------------------------------------------------------------------------
# HERE = os.path.dirname(__file__)
# TOP = os.path.join(HERE, "..")
# TOPA = os.path.abspath(TOP)
WORKDIR = os.path.join(TOP, "__WORKDIR__")
# -----------------------------------------------------------------------------
# UTILITY FUNCTIONS:
# -----------------------------------------------------------------------------
def workdir_save_coverage_files(workdir, destdir=None):
assert os.path.isdir(workdir)
if not destdir:
destdir = TOPA
if os.path.abspath(workdir) == os.path.abspath(destdir):
return # -- SKIP: Source directory is destination directory (SAME).
for fname in os.listdir(workdir):
if fnmatch(fname, ".coverage.*"):
# -- MOVE COVERAGE FILES:
sourcename = os.path.join(workdir, fname)
shutil.move(sourcename, destdir)
# def ensure_directory_exists(dirname):
# """
# Ensures that a directory exits.
# If it does not exist, it is automatically created.
# """
# if not os.path.exists(dirname):
# os.makedirs(dirname)
# assert os.path.exists(dirname)
# assert os.path.isdir(dirname)
def ensure_context_attribute_exists(context, name, default_value=None):
"""
Ensure a behave resource exists as attribute in the behave context.
If this is not the case, the attribute is created by using the default_value.
"""
if not hasattr(context, name):
setattr(context, name, default_value)
def ensure_workdir_exists(context):
"""
Ensures that the work directory exists.
In addition, the location of the workdir is stored as attribute in
the context object.
"""
ensure_context_attribute_exists(context, "workdir", None)
if not context.workdir:
context.workdir = os.path.abspath(WORKDIR)
pathutil.ensure_directory_exists(context.workdir)
def ensure_workdir_not_exists(context):
"""Ensures that the work directory does not exist."""
ensure_context_attribute_exists(context, "workdir", None)
if context.workdir:
orig_dirname = real_dirname = context.workdir
context.workdir = None
if os.path.exists(real_dirname):
renamed_dirname = tempfile.mktemp(prefix=os.path.basename(real_dirname),
suffix="_DEAD",
dir=os.path.dirname(real_dirname) or ".")
os.rename(real_dirname, renamed_dirname)
real_dirname = renamed_dirname
max_iterations = 2
if sys.platform.startswith("win"):
max_iterations = 15
for iteration in range(max_iterations):
if not os.path.exists(real_dirname):
if iteration > 1:
print("REMOVE-WORKDIR after %s iterations" % (iteration+1))
break
shutil.rmtree(real_dirname, ignore_errors=True)
time.sleep(0.5)
assert not os.path.isdir(real_dirname), "ENSURE not-isa dir: %s" % real_dirname
assert not os.path.exists(real_dirname), "ENSURE dir not-exists: %s" % real_dirname
assert not os.path.isdir(orig_dirname), "ENSURE not-isa dir: %s" % orig_dirname
# def create_textfile_with_contents(filename, contents):
# """
# Creates a textual file with the provided contents in the workdir.
# Overwrites an existing file.
# """
# ensure_directory_exists(os.path.dirname(filename))
# if os.path.exists(filename):
# os.remove(filename)
# outstream = open(filename, "w")
# outstream.write(contents)
# if not contents.endswith("\n"):
# outstream.write("\n")
# outstream.flush()
# outstream.close()
# assert os.path.exists(filename)
# def text_remove_empty_lines(text):
# """
# Whitespace normalization:
# - Strip empty lines
# - Strip trailing whitespace
# """
# lines = [ line.rstrip() for line in text.splitlines() if line.strip() ]
# return "\n".join(lines)
#
# def text_normalize(text):
# """
# Whitespace normalization:
# - Strip empty lines
# - Strip leading whitespace in a line
# - Strip trailing whitespace in a line
# - Normalize line endings
# """
# lines = [ line.strip() for line in text.splitlines() if line.strip() ]
# return "\n".join(lines)
# def posixpath_normpath(pathname):
# """
# Convert path into POSIX path:
# - Normalize path
# - Replace backslash with slash
# """
# backslash = '\\'
# pathname = os.path.normpath(pathname)
# if backslash in pathname:
# pathname = pathname.replace(backslash, '/')
# return pathname
|