Default service configuration in directory or file (#38).
This commit is contained in:
@ -1,7 +1,7 @@
|
|||||||
#! /bin/bash
|
#! /bin/bash
|
||||||
|
|
||||||
__PATH__=$(cd $(dirname "$0")/..; pwd)
|
__PATH__=$(cd $(dirname "$0")/..; pwd)
|
||||||
EXAMPLES=$(cd $__PATH__; find bonobo/examples -name \*.py -not -name __init__.py)
|
EXAMPLES=$(cd $__PATH__; find bonobo/examples -name \*.py -not -name _\*)
|
||||||
|
|
||||||
for example in $EXAMPLES; do
|
for example in $EXAMPLES; do
|
||||||
echo "===== $example ====="
|
echo "===== $example ====="
|
||||||
|
|||||||
@ -1,6 +1,33 @@
|
|||||||
import argparse
|
import argparse
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
import bonobo
|
import bonobo
|
||||||
|
|
||||||
|
DEFAULT_SERVICES_FILENAME = '_services.py'
|
||||||
|
DEFAULT_SERVICES_ATTR = 'get_services'
|
||||||
|
|
||||||
|
|
||||||
|
def get_default_services(filename, services=None):
|
||||||
|
dirname = os.path.dirname(filename)
|
||||||
|
services_filename = os.path.join(dirname, DEFAULT_SERVICES_FILENAME)
|
||||||
|
if os.path.exists(services_filename):
|
||||||
|
with open(services_filename) as file:
|
||||||
|
code = compile(file.read(), services_filename, 'exec')
|
||||||
|
context = {
|
||||||
|
'__name__': '__bonobo__',
|
||||||
|
'__file__': services_filename,
|
||||||
|
}
|
||||||
|
try:
|
||||||
|
exec(code, context)
|
||||||
|
except Exception as exc:
|
||||||
|
raise
|
||||||
|
return {
|
||||||
|
**context[DEFAULT_SERVICES_ATTR](),
|
||||||
|
**(services or {}),
|
||||||
|
}
|
||||||
|
return services or {}
|
||||||
|
|
||||||
|
|
||||||
def execute(file, quiet=False):
|
def execute(file, quiet=False):
|
||||||
with file:
|
with file:
|
||||||
@ -32,8 +59,7 @@ def execute(file, quiet=False):
|
|||||||
|
|
||||||
# todo if console and not quiet, then add the console plugin
|
# todo if console and not quiet, then add the console plugin
|
||||||
# todo when better console plugin, add it if console and just disable display
|
# todo when better console plugin, add it if console and just disable display
|
||||||
|
return bonobo.run(graph, plugins=[], services=get_default_services(file.name, context.get(DEFAULT_SERVICES_ATTR)() if DEFAULT_SERVICES_ATTR in context else None))
|
||||||
return bonobo.run(graph)
|
|
||||||
|
|
||||||
|
|
||||||
def register(parser):
|
def register(parser):
|
||||||
|
|||||||
9
bonobo/examples/datasets/_services.py
Normal file
9
bonobo/examples/datasets/_services.py
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
from os.path import dirname
|
||||||
|
|
||||||
|
import bonobo
|
||||||
|
|
||||||
|
|
||||||
|
def get_services():
|
||||||
|
return {
|
||||||
|
'fs': bonobo.open_fs(dirname(__file__))
|
||||||
|
}
|
||||||
@ -1,4 +1,5 @@
|
|||||||
import bonobo
|
import bonobo
|
||||||
|
from bonobo.commands.run import get_default_services
|
||||||
from bonobo.ext.opendatasoft import OpenDataSoftAPI
|
from bonobo.ext.opendatasoft import OpenDataSoftAPI
|
||||||
|
|
||||||
filename = 'coffeeshops.txt'
|
filename = 'coffeeshops.txt'
|
||||||
@ -9,13 +10,5 @@ graph = bonobo.Graph(
|
|||||||
bonobo.FileWriter(path=filename),
|
bonobo.FileWriter(path=filename),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_services():
|
|
||||||
from os.path import dirname
|
|
||||||
return {
|
|
||||||
'fs': bonobo.open_fs(dirname(__file__))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
bonobo.run(graph, services=get_services())
|
bonobo.run(graph, services=get_default_services(__file__))
|
||||||
|
|||||||
@ -3,6 +3,7 @@ import json
|
|||||||
from colorama import Fore, Style
|
from colorama import Fore, Style
|
||||||
|
|
||||||
import bonobo
|
import bonobo
|
||||||
|
from bonobo.commands.run import get_default_services
|
||||||
from bonobo.ext.opendatasoft import OpenDataSoftAPI
|
from bonobo.ext.opendatasoft import OpenDataSoftAPI
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -57,16 +58,8 @@ graph = bonobo.Graph(
|
|||||||
normalize,
|
normalize,
|
||||||
filter_france,
|
filter_france,
|
||||||
bonobo.Tee(display),
|
bonobo.Tee(display),
|
||||||
bonobo.JsonWriter(path='datasets/fablabs.txt'),
|
bonobo.JsonWriter(path='fablabs.txt'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_services():
|
|
||||||
from os.path import dirname
|
|
||||||
return {
|
|
||||||
'fs': bonobo.open_fs(dirname(__file__))
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
bonobo.run(graph, services=get_services())
|
bonobo.run(graph, services=get_default_services(__file__))
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import bonobo
|
import bonobo
|
||||||
|
from bonobo.commands.run import get_default_services
|
||||||
|
|
||||||
from ._services import get_services
|
# XXX does not work anymore because of filesystem service, can't read HTTP
|
||||||
|
|
||||||
url = 'https://data.toulouse-metropole.fr/explore/dataset/theatres-et-salles-de-spectacles/download?format=json&timezone=Europe/Berlin&use_labels_for_header=true'
|
url = 'https://data.toulouse-metropole.fr/explore/dataset/theatres-et-salles-de-spectacles/download?format=json&timezone=Europe/Berlin&use_labels_for_header=true'
|
||||||
|
|
||||||
graph = bonobo.Graph(
|
graph = bonobo.Graph(
|
||||||
@ -10,4 +10,4 @@ graph = bonobo.Graph(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
bonobo.run(graph)
|
bonobo.run(graph, services=get_default_services(__file__))
|
||||||
7
bonobo/examples/files/_services.py
Normal file
7
bonobo/examples/files/_services.py
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
from bonobo import get_examples_path, open_fs
|
||||||
|
|
||||||
|
|
||||||
|
def get_services():
|
||||||
|
return {
|
||||||
|
'fs': open_fs(get_examples_path())
|
||||||
|
}
|
||||||
@ -1,6 +1,5 @@
|
|||||||
import bonobo
|
import bonobo
|
||||||
|
from bonobo.commands.run import get_default_services
|
||||||
from ._services import get_services
|
|
||||||
|
|
||||||
graph = bonobo.Graph(
|
graph = bonobo.Graph(
|
||||||
bonobo.CsvReader(path='datasets/coffeeshops.txt'),
|
bonobo.CsvReader(path='datasets/coffeeshops.txt'),
|
||||||
@ -8,4 +7,4 @@ graph = bonobo.Graph(
|
|||||||
)
|
)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
bonobo.run(graph, services=get_services())
|
bonobo.run(graph, services=get_default_services(__file__))
|
||||||
@ -1,20 +0,0 @@
|
|||||||
from bonobo import FileReader, Graph, get_examples_path
|
|
||||||
|
|
||||||
|
|
||||||
def skip_comments(line):
|
|
||||||
if not line.startswith('#'):
|
|
||||||
yield line
|
|
||||||
|
|
||||||
|
|
||||||
graph = Graph(
|
|
||||||
FileReader(path=get_examples_path('datasets/passwd.txt')),
|
|
||||||
skip_comments,
|
|
||||||
lambda s: s.split(':'),
|
|
||||||
lambda l: l[0],
|
|
||||||
print,
|
|
||||||
)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
import bonobo
|
|
||||||
|
|
||||||
bonobo.run(graph)
|
|
||||||
19
bonobo/examples/files/text_handlers.py
Normal file
19
bonobo/examples/files/text_handlers.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import bonobo
|
||||||
|
from bonobo.commands.run import get_default_services
|
||||||
|
|
||||||
|
|
||||||
|
def skip_comments(line):
|
||||||
|
if not line.startswith('#'):
|
||||||
|
yield line
|
||||||
|
|
||||||
|
|
||||||
|
graph = bonobo.Graph(
|
||||||
|
bonobo.FileReader(path='datasets/passwd.txt'),
|
||||||
|
skip_comments,
|
||||||
|
lambda s: s.split(':'),
|
||||||
|
lambda l: l[0],
|
||||||
|
print,
|
||||||
|
)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
bonobo.run(graph, services=get_default_services(__file__))
|
||||||
@ -1,9 +1,17 @@
|
|||||||
import bonobo
|
import bonobo
|
||||||
|
from bonobo.commands.run import get_default_services
|
||||||
|
|
||||||
graph = bonobo.Graph(
|
graph = bonobo.Graph(
|
||||||
bonobo.FileReader(path=bonobo.get_examples_path('datasets/coffeeshops.txt')),
|
bonobo.FileReader(path='datasets/coffeeshops.txt'),
|
||||||
print,
|
print,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_services():
|
||||||
|
return {
|
||||||
|
'fs': bonobo.open_fs(bonobo.get_examples_path())
|
||||||
|
}
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
bonobo.run(graph)
|
bonobo.run(graph, services=get_default_services(__file__, get_services()))
|
||||||
|
|
||||||
|
|||||||
@ -3,7 +3,7 @@ Services and dependencies (draft implementation)
|
|||||||
|
|
||||||
:Status: Draft implementation
|
:Status: Draft implementation
|
||||||
:Stability: Alpha
|
:Stability: Alpha
|
||||||
:Last-Modified: 27 apr 2017
|
:Last-Modified: 28 apr 2017
|
||||||
|
|
||||||
Most probably, you'll want to use external systems within your transformations. Those systems may include databases,
|
Most probably, you'll want to use external systems within your transformations. Those systems may include databases,
|
||||||
apis (using http, for example), filesystems, etc.
|
apis (using http, for example), filesystems, etc.
|
||||||
@ -82,6 +82,13 @@ A dictionary, or dictionary-like, "services" named argument can be passed to the
|
|||||||
provided is pretty basic, and feature-less. But you can use much more evolved libraries instead of the provided
|
provided is pretty basic, and feature-less. But you can use much more evolved libraries instead of the provided
|
||||||
stub, and as long as it works the same (a.k.a implements a dictionary-like interface), the system will use it.
|
stub, and as long as it works the same (a.k.a implements a dictionary-like interface), the system will use it.
|
||||||
|
|
||||||
|
Service configuration (to be decided and implemented)
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
|
||||||
|
* There should be a way to configure default service implementation for a python file, a directory, a project ...
|
||||||
|
* There should be a way to override services when running a transformation.
|
||||||
|
* There should be a way to use environment for service configuration.
|
||||||
|
|
||||||
Future and proposals
|
Future and proposals
|
||||||
::::::::::::::::::::
|
::::::::::::::::::::
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user