Merge branch 'develop' of github.com:python-bonobo/bonobo into develop
This commit is contained in:
@ -1,3 +1,5 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
def execute(name, branch):
|
def execute(name, branch):
|
||||||
try:
|
try:
|
||||||
from cookiecutter.main import cookiecutter
|
from cookiecutter.main import cookiecutter
|
||||||
@ -6,11 +8,17 @@ def execute(name, branch):
|
|||||||
'You must install "cookiecutter" to use this command.\n\n $ pip install cookiecutter\n'
|
'You must install "cookiecutter" to use this command.\n\n $ pip install cookiecutter\n'
|
||||||
) from exc
|
) from exc
|
||||||
|
|
||||||
|
overwrite_if_exists = False
|
||||||
|
project_path = os.path.join(os.getcwd(), name)
|
||||||
|
if os.path.isdir(project_path) and not os.listdir(project_path):
|
||||||
|
overwrite_if_exists = True
|
||||||
|
|
||||||
return cookiecutter(
|
return cookiecutter(
|
||||||
'https://github.com/python-bonobo/cookiecutter-bonobo.git',
|
'https://github.com/python-bonobo/cookiecutter-bonobo.git',
|
||||||
extra_context={'name': name},
|
extra_context={'name': name},
|
||||||
no_input=True,
|
no_input=True,
|
||||||
checkout=branch
|
checkout=branch,
|
||||||
|
overwrite_if_exists=overwrite_if_exists
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,14 +2,14 @@ import bonobo
|
|||||||
|
|
||||||
|
|
||||||
def split_one(line):
|
def split_one(line):
|
||||||
return line.split(', ', 1)
|
return dict(zip(("name", "address"), line.split(', ', 1)))
|
||||||
|
|
||||||
|
|
||||||
graph = bonobo.Graph(
|
graph = bonobo.Graph(
|
||||||
bonobo.FileReader('coffeeshops.txt'),
|
bonobo.FileReader('coffeeshops.txt'),
|
||||||
split_one,
|
split_one,
|
||||||
bonobo.JsonWriter(
|
bonobo.JsonWriter(
|
||||||
'coffeeshops.json', fs='fs.output', ioformat='arg0'
|
'coffeeshops.json', fs='fs.output'
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -11,7 +11,7 @@ def split_one_to_map(line):
|
|||||||
class MyJsonWriter(bonobo.JsonWriter):
|
class MyJsonWriter(bonobo.JsonWriter):
|
||||||
prefix, suffix = '{', '}'
|
prefix, suffix = '{', '}'
|
||||||
|
|
||||||
def write(self, fs, file, lineno, row):
|
def write(self, fs, file, lineno, **row):
|
||||||
return bonobo.FileWriter.write(
|
return bonobo.FileWriter.write(
|
||||||
self, fs, file, lineno, json.dumps(row)[1:-1]
|
self, fs, file, lineno, json.dumps(row)[1:-1]
|
||||||
)
|
)
|
||||||
@ -20,7 +20,7 @@ class MyJsonWriter(bonobo.JsonWriter):
|
|||||||
graph = bonobo.Graph(
|
graph = bonobo.Graph(
|
||||||
bonobo.FileReader('coffeeshops.txt'),
|
bonobo.FileReader('coffeeshops.txt'),
|
||||||
split_one_to_map,
|
split_one_to_map,
|
||||||
MyJsonWriter('coffeeshops.json', fs='fs.output', ioformat='arg0'),
|
MyJsonWriter('coffeeshops.json', fs='fs.output'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -105,6 +105,9 @@ To do this, it needs to know what data-flow you want to achieve, and you'll use
|
|||||||
The `if __name__ == '__main__':` section is not required, unless you want to run it directly using the python
|
The `if __name__ == '__main__':` section is not required, unless you want to run it directly using the python
|
||||||
interpreter.
|
interpreter.
|
||||||
|
|
||||||
|
The name of the `graph` variable is arbitrary, but this variable must be global and available unconditionally.
|
||||||
|
Do not put it in its own function or in the `if __name__ == '__main__':` section.
|
||||||
|
|
||||||
|
|
||||||
Execute the job
|
Execute the job
|
||||||
:::::::::::::::
|
:::::::::::::::
|
||||||
|
|||||||
@ -8,18 +8,24 @@ from unittest.mock import patch
|
|||||||
|
|
||||||
import pkg_resources
|
import pkg_resources
|
||||||
import pytest
|
import pytest
|
||||||
|
from cookiecutter.exceptions import OutputDirExistsException
|
||||||
|
|
||||||
from bonobo import __main__, __version__, get_examples_path
|
from bonobo import __main__, __version__, get_examples_path
|
||||||
from bonobo.commands import entrypoint
|
from bonobo.commands import entrypoint
|
||||||
|
from bonobo.commands.run import DEFAULT_GRAPH_FILENAMES
|
||||||
|
|
||||||
|
|
||||||
def runner(f):
|
def runner(f):
|
||||||
@functools.wraps(f)
|
@functools.wraps(f)
|
||||||
def wrapped_runner(*args):
|
def wrapped_runner(*args, catch_errors=False):
|
||||||
with redirect_stdout(io.StringIO()) as stdout, redirect_stderr(io.StringIO()) as stderr:
|
with redirect_stdout(io.StringIO()) as stdout, redirect_stderr(io.StringIO()) as stderr:
|
||||||
try:
|
try:
|
||||||
f(list(args))
|
f(list(args))
|
||||||
except BaseException as exc:
|
except BaseException as exc:
|
||||||
|
if not catch_errors:
|
||||||
|
raise
|
||||||
|
elif isinstance(catch_errors, BaseException) and not isinstance(exc, catch_errors):
|
||||||
|
raise
|
||||||
return stdout.getvalue(), stderr.getvalue(), exc
|
return stdout.getvalue(), stderr.getvalue(), exc
|
||||||
return stdout.getvalue(), stderr.getvalue()
|
return stdout.getvalue(), stderr.getvalue()
|
||||||
|
|
||||||
@ -40,6 +46,7 @@ def runner_module(args):
|
|||||||
|
|
||||||
|
|
||||||
all_runners = pytest.mark.parametrize('runner', [runner_entrypoint, runner_module])
|
all_runners = pytest.mark.parametrize('runner', [runner_entrypoint, runner_module])
|
||||||
|
single_runner = pytest.mark.parametrize('runner', [runner_module])
|
||||||
|
|
||||||
|
|
||||||
def test_entrypoint():
|
def test_entrypoint():
|
||||||
@ -59,11 +66,41 @@ def test_entrypoint():
|
|||||||
|
|
||||||
@all_runners
|
@all_runners
|
||||||
def test_no_command(runner):
|
def test_no_command(runner):
|
||||||
_, err, exc = runner()
|
_, err, exc = runner(catch_errors=True)
|
||||||
assert type(exc) == SystemExit
|
assert type(exc) == SystemExit
|
||||||
assert 'error: the following arguments are required: command' in err
|
assert 'error: the following arguments are required: command' in err
|
||||||
|
|
||||||
|
|
||||||
|
@all_runners
|
||||||
|
def test_init(runner, tmpdir):
|
||||||
|
name = 'project'
|
||||||
|
tmpdir.chdir()
|
||||||
|
runner('init', name)
|
||||||
|
assert os.path.isdir(name)
|
||||||
|
assert set(os.listdir(name)) & set(DEFAULT_GRAPH_FILENAMES)
|
||||||
|
|
||||||
|
@single_runner
|
||||||
|
def test_init_in_empty_then_nonempty_directory(runner, tmpdir):
|
||||||
|
name = 'project'
|
||||||
|
tmpdir.chdir()
|
||||||
|
os.mkdir(name)
|
||||||
|
|
||||||
|
# run in empty dir
|
||||||
|
runner('init', name)
|
||||||
|
assert set(os.listdir(name)) & set(DEFAULT_GRAPH_FILENAMES)
|
||||||
|
|
||||||
|
# run in non empty dir
|
||||||
|
with pytest.raises(OutputDirExistsException):
|
||||||
|
runner('init', name)
|
||||||
|
|
||||||
|
|
||||||
|
@single_runner
|
||||||
|
def test_init_within_empty_directory(runner, tmpdir):
|
||||||
|
tmpdir.chdir()
|
||||||
|
runner('init', '.')
|
||||||
|
assert set(os.listdir()) & set(DEFAULT_GRAPH_FILENAMES)
|
||||||
|
|
||||||
|
|
||||||
@all_runners
|
@all_runners
|
||||||
def test_run(runner):
|
def test_run(runner):
|
||||||
out, err = runner('run', '--quiet', get_examples_path('types/strings.py'))
|
out, err = runner('run', '--quiet', get_examples_path('types/strings.py'))
|
||||||
|
|||||||
Reference in New Issue
Block a user