diff options
author | Lars Wirzenius <liw@liw.fi> | 2020-05-20 10:14:00 +0300 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2020-05-20 10:59:54 +0300 |
commit | 0a073fa0b2a7e456d3bff9c9bfe930e8b3ee7449 (patch) | |
tree | ec50e222e1c9b139d08a0eae6911cbe87e0fb485 /files.py | |
parent | 6ca305d000360de74e686d801c638086c876d08a (diff) | |
download | subplot-0a073fa0b2a7e456d3bff9c9bfe930e8b3ee7449.tar.gz |
refactor: move things from subplot.{py,yaml} to separate files
files.{py,yaml} contain re-usable steps for handling files.
runcmd.{py,yaml} contain re-usable steps for running commands and
inspecting results.
Diffstat (limited to 'files.py')
-rw-r--r-- | files.py | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/files.py b/files.py new file mode 100644 index 0000000..9ee1739 --- /dev/null +++ b/files.py @@ -0,0 +1,81 @@ +# Some generic file handling step implementations. + +import os +import re +import time + + +# Create a file on disk from an embedded file. +def create_file(ctx, filename=None): + with open(filename, "wb") as f: + f.write(get_file(filename)) + + +# Update mtime of a file in datadir to a specific time. +def touch_file(ctx, filename=None, y=None, mon=None, d=None, h=None, min=None, s=None): + t = (int(y), int(mon), int(d), int(h), int(min), int(s), -1, -1, -1) + ts = time.mktime(t) + os.utime(filename, times=(ts, ts)) + + +# Update mtime of a file in datadir to current time. +def update_mtime(ctx, filename=None): + os.utime(filename) + + +# Check that a file exists. +def file_exists(ctx, filename=None): + assert_eq(os.path.exists(filename), True) + + +# Check that a file does not exist. +def file_does_not_exist(ctx, filename=None): + assert_eq(os.path.exists(filename), False) + + +# Check that only specific files exist in the current working directory. +def only_these_files_exist(ctx, filenames=None): + filenames = filenames.replace(",", "").split() + assert_eq(set(os.listdir(".")), set(filenames)) + + +# Check that a file contents match a regex. +def file_matches(ctx, filename=None, regex=None): + with open(filename) as f: + content = f.read() + m = re.search(regex, content) + if m is None: + print("content:", repr(content)) + print("regex:", repr(regex)) + assert_eq(bool(m), True) + + +# Check that a file contains a fixed string. +def file_contains(ctx, filename=None, pattern=None): + with open(filename) as f: + content = f.read() + assert_eq(pattern in content, True) + + +# Retrieve metadata for a file as a struct so it can be easily inspected. +def _get_metadata(filename): + st = os.lstat(filename) + keys = ["st_dev", "st_gid", "st_ino", "st_mode", "st_mtime", "st_size", "st_uid"] + return {key: getattr(st, key) for key in keys} + + +# Store in the context current metdata for a file. +def remember_metadata(ctx, filename=None): + meta = ctx.get("remembered-metadata", {}) + meta[filename] = _get_metadata(filename) + ctx["remembered-metadata"] = meta + + +# Check that current metadata of a file is as stored in the context. +def has_same_metadata_as_remembered(ctx, filename=None): + assert_eq(ctx["remembered-metadata"][filename], _get_metadata(filename)) + + +# Check that current metadata of a file is different than stored in the context. +def has_diff_metadata_than_remembered(ctx, filename=None): + assert_ne(ctx["remembered-metadata"][filename], _get_metadata(filename)) |