# Conversion pipeline templates # ============================= # The problem: # ------------ # # Suppose you have some data that you want to convert to another format # (e.g. from GIF image format to PPM image format). Maybe the # conversion involves several steps (e.g. piping it through compress or # uuencode). Some of the conversion steps may require that their input # is a disk file, others may be able to read standard input; similar for # their output. The input to the entire conversion may also be read # from a disk file or from an open file, and similar for its output. # # The module lets you construct a pipeline template by sticking one or # more conversion steps together. It will take care of creating and # removing temporary files if they are necessary to hold intermediate # data. You can then use the template to do conversions from many # different sources to many different destinations. The temporary # file names used are different each time the template is used. # # The templates are objects so you can create templates for many # different conversion steps and store them in a dictionary, for # instance. # Directions: # ----------- # # To create a template: # t = Template() # # To add a conversion step to a template: # t.append(command, kind) # where kind is a string of two characters: the first is '-' if the # command reads its standard input or 'f' if it requires a file; the # second likewise for the output. The command must be valid /bin/sh # syntax. If input or output files are required, they are passed as # $IN and $OUT; otherwise, it must be possible to use the command in # a pipeline. # # To add a conversion step at the beginning: # t.prepend(command, kind) # # To convert a file to another file using a template: # sts = t.copy(infile, outfile) # If infile or outfile are the empty string, standard input is read or # standard output is written, respectively. The return value is the # exit status of the conversion pipeline. # # To open a file for reading or writing through a conversion pipeline: # fp = t.open(file, mode) # where mode is 'r' to read the file, or 'w' to write it -- just like # for the built-in function open() or for os.popen(). # # To create a new template object initialized to a given one: # t2 = t.clone() # # For an example, see the function test() at the end of the file. import sys import re import os import tempfile import string # Conversion step kinds FILEIN_FILEOUT = 'ff' # Must read & write real files STDIN_FILEOUT = '-f' # Must write a real file FILEIN_STDOUT = 'f-' # Must read a real file STDIN_STDOUT = '--' # Normal pipeline element SOURCE = '.-' # Must be first, writes stdout SINK = '-.' # Must be last, reads stdin stepkinds = [FILEIN_FILEOUT, STDIN_FILEOUT, FILEIN_STDOUT, STDIN_STDOUT, \ SOURCE, SINK] # A pipeline template is a Template object: class Template: # Template() returns a fresh pipeline template def __init__(self): self.debugging = 0 self.reset() # t.__repr__() implements `t` def __repr__(self): return '