100 lines
3.3 KiB
Python
100 lines
3.3 KiB
Python
import bonobo
|
|
from bonobo.commands import BaseCommand
|
|
from bonobo.registry import READER, WRITER, default_registry
|
|
from bonobo.util.resolvers import _resolve_transformations, _resolve_options
|
|
|
|
|
|
class ConvertCommand(BaseCommand):
|
|
def add_arguments(self, parser):
|
|
parser.add_argument('input_filename', help='Input filename.')
|
|
parser.add_argument('output_filename', help='Output filename.')
|
|
parser.add_argument(
|
|
'--' + READER,
|
|
'-r',
|
|
help='Choose the reader factory if it cannot be detected from extension, or if detection is wrong.'
|
|
)
|
|
parser.add_argument(
|
|
'--' + WRITER,
|
|
'-w',
|
|
help=
|
|
'Choose the writer factory if it cannot be detected from extension, or if detection is wrong (use - for console pretty print).'
|
|
)
|
|
parser.add_argument(
|
|
'--limit',
|
|
'-l',
|
|
type=int,
|
|
help='Adds a Limit() after the reader instance.',
|
|
default=None,
|
|
)
|
|
parser.add_argument(
|
|
'--transformation',
|
|
'-t',
|
|
dest='transformation',
|
|
action='append',
|
|
help='Add a transformation between input and output (can be used multiple times, order is preserved).',
|
|
)
|
|
parser.add_argument(
|
|
'--option',
|
|
'-O',
|
|
dest='option',
|
|
action='append',
|
|
help='Add a named option to both reader and writer factories (i.e. foo="bar").',
|
|
)
|
|
parser.add_argument(
|
|
'--' + READER + '-option',
|
|
'-' + READER[0].upper(),
|
|
dest=READER + '_option',
|
|
action='append',
|
|
help='Add a named option to the reader factory.',
|
|
)
|
|
parser.add_argument(
|
|
'--' + WRITER + '-option',
|
|
'-' + WRITER[0].upper(),
|
|
dest=WRITER + '_option',
|
|
action='append',
|
|
help='Add a named option to the writer factory.',
|
|
)
|
|
|
|
def handle(
|
|
self,
|
|
input_filename,
|
|
output_filename,
|
|
reader=None,
|
|
reader_option=None,
|
|
writer=None,
|
|
writer_option=None,
|
|
option=None,
|
|
limit=None,
|
|
transformation=None,
|
|
):
|
|
reader_factory = default_registry.get_reader_factory_for(input_filename, format=reader)
|
|
reader_kwargs = _resolve_options((option or []) + (reader_option or []))
|
|
|
|
if output_filename == '-':
|
|
writer_factory = bonobo.PrettyPrinter
|
|
writer_args = ()
|
|
else:
|
|
writer_factory = default_registry.get_writer_factory_for(output_filename, format=writer)
|
|
writer_args = (output_filename, )
|
|
writer_kwargs = _resolve_options((option or []) + (writer_option or []))
|
|
|
|
transformations = ()
|
|
|
|
if limit:
|
|
transformations += (bonobo.Limit(limit), )
|
|
|
|
transformations += _resolve_transformations(transformation)
|
|
|
|
graph = bonobo.Graph()
|
|
graph.add_chain(
|
|
reader_factory(input_filename, **reader_kwargs),
|
|
*transformations,
|
|
writer_factory(*writer_args, **writer_kwargs),
|
|
)
|
|
|
|
return bonobo.run(
|
|
graph, services={
|
|
'fs': bonobo.open_fs(),
|
|
}
|
|
)
|