Skip to content
Snippets Groups Projects
Commit aac90673 authored by Paul McCarthy's avatar Paul McCarthy :mountain_bicyclist:
Browse files

RF/BF: Update fileOrText decorator to work with input files - they must be

specified as pathlib.Path objects, so they can be differentiated from input
values.
parent e48be57c
No related branches found
No related tags found
No related merge requests found
...@@ -95,6 +95,7 @@ import sys ...@@ -95,6 +95,7 @@ import sys
import glob import glob
import random import random
import string import string
import pathlib
import fnmatch import fnmatch
import inspect import inspect
import logging import logging
...@@ -557,8 +558,9 @@ class _FileOrThing(object): ...@@ -557,8 +558,9 @@ class _FileOrThing(object):
def __init__(self, stdout): def __init__(self, stdout):
"""Create a ``_Results`` dict. """Create a ``_Results`` dict.
:arg stdout: Return value of the ecorated function (typically the :arg stdout: Return value of the ecorated function (typically a
standard output of the underlying command). tuple containing the standard output and error of the
underlying command).
""" """
super().__init__() super().__init__()
self.__stdout = stdout self.__stdout = stdout
...@@ -1101,14 +1103,39 @@ def fileOrText(*args, **kwargs): ...@@ -1101,14 +1103,39 @@ def fileOrText(*args, **kwargs):
"""Decorator which can be used to ensure that any text output (e.g. log """Decorator which can be used to ensure that any text output (e.g. log
file) are saved to text files, and output files can be loaded and returned file) are saved to text files, and output files can be loaded and returned
as strings. as strings.
To be able to distinguish between input values and input file paths, the
``fileOrText`` decorator requires that input and output file paths are
passed in as ``pathlib.Path`` objects. For example, given a function
like this::
@fileOrText()
def myfunc(infile, outfile):
...
if we want to pass file paths for both ``infile`` and ``outfile``, we would
do this::
from pathlib import Path
myfunc(Path('input.txt'), Path('output.txt'))
Input values may be passed in as normal strings, e.g.::
myfunc('input data', Path('output.txt'))
Output values can be loaded as normal via the :attr:`LOAD` symbol, e.g.::
myfunc(Path('input.txt'), LOAD)
""" """
def prepIn(workdir, name, val): def prepIn(workdir, name, val):
infile = None infile = None
if isinstance(val, six.string_types): if not isinstance(val, pathlib.Path):
with tempfile.NamedTemporaryFile(mode='w', suffix='.txt') as f: with tempfile.NamedTemporaryFile(mode='w',
suffix='.txt',
delete=False) as f:
f.write(val) f.write(val)
infile = f.name infile = f.name
return infile return infile
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment