2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
|||||||
# This file has been auto-generated.
|
# This file has been auto-generated.
|
||||||
# All changes will be lost, see Projectfile.
|
# All changes will be lost, see Projectfile.
|
||||||
#
|
#
|
||||||
# Updated at 2017-06-05 09:21:02.910936
|
# Updated at 2017-06-08 21:45:05.840502
|
||||||
|
|
||||||
PACKAGE ?= bonobo
|
PACKAGE ?= bonobo
|
||||||
PYTHON ?= $(shell which python)
|
PYTHON ?= $(shell which python)
|
||||||
|
|||||||
@ -44,8 +44,9 @@ python.add_requirements(
|
|||||||
'requests >=2.0,<3.0',
|
'requests >=2.0,<3.0',
|
||||||
'stevedore >=1.21,<2.0',
|
'stevedore >=1.21,<2.0',
|
||||||
dev=[
|
dev=[
|
||||||
'pytest-timeout >=1,<2',
|
|
||||||
'cookiecutter >=1.5,<1.6',
|
'cookiecutter >=1.5,<1.6',
|
||||||
|
'pytest-sugar >=0.8,<0.9',
|
||||||
|
'pytest-timeout >=1,<2',
|
||||||
],
|
],
|
||||||
docker=[
|
docker=[
|
||||||
'bonobo-docker',
|
'bonobo-docker',
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
def execute(name):
|
def execute(name, branch):
|
||||||
try:
|
try:
|
||||||
from cookiecutter.main import cookiecutter
|
from cookiecutter.main import cookiecutter
|
||||||
except ImportError as exc:
|
except ImportError as exc:
|
||||||
@ -7,10 +7,12 @@ def execute(name):
|
|||||||
) from exc
|
) from exc
|
||||||
|
|
||||||
return cookiecutter(
|
return cookiecutter(
|
||||||
'https://github.com/python-bonobo/cookiecutter-bonobo.git', extra_context={'name': name}, no_input=True
|
'https://github.com/python-bonobo/cookiecutter-bonobo.git', extra_context={'name': name}, no_input=True,
|
||||||
|
checkout=branch
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def register(parser):
|
def register(parser):
|
||||||
parser.add_argument('name')
|
parser.add_argument('name')
|
||||||
|
parser.add_argument('--branch', '-b', default='master')
|
||||||
return execute
|
return execute
|
||||||
|
|||||||
@ -3,9 +3,10 @@ import os
|
|||||||
DEFAULT_SERVICES_FILENAME = '_services.py'
|
DEFAULT_SERVICES_FILENAME = '_services.py'
|
||||||
DEFAULT_SERVICES_ATTR = 'get_services'
|
DEFAULT_SERVICES_ATTR = 'get_services'
|
||||||
|
|
||||||
DEFAULT_GRAPH_FILENAME = '__main__.py'
|
DEFAULT_GRAPH_FILENAMES = ('__main__.py', 'main.py',)
|
||||||
DEFAULT_GRAPH_ATTR = 'get_graph'
|
DEFAULT_GRAPH_ATTR = 'get_graph'
|
||||||
|
|
||||||
|
|
||||||
def get_default_services(filename, services=None):
|
def get_default_services(filename, services=None):
|
||||||
dirname = os.path.dirname(filename)
|
dirname = os.path.dirname(filename)
|
||||||
services_filename = os.path.join(dirname, DEFAULT_SERVICES_FILENAME)
|
services_filename = os.path.join(dirname, DEFAULT_SERVICES_FILENAME)
|
||||||
@ -48,7 +49,14 @@ def execute(filename, module, install=False, quiet=False, verbose=False):
|
|||||||
pip.utils.pkg_resources = importlib.reload(pip.utils.pkg_resources)
|
pip.utils.pkg_resources = importlib.reload(pip.utils.pkg_resources)
|
||||||
import site
|
import site
|
||||||
importlib.reload(site)
|
importlib.reload(site)
|
||||||
filename = os.path.join(filename, DEFAULT_GRAPH_FILENAME)
|
|
||||||
|
pathname = filename
|
||||||
|
for filename in DEFAULT_GRAPH_FILENAMES:
|
||||||
|
filename = os.path.join(pathname, filename)
|
||||||
|
if os.path.exists(filename):
|
||||||
|
break
|
||||||
|
if not os.path.exists(filename):
|
||||||
|
raise IOError('Could not find entrypoint (candidates: {}).'.format(', '.join(DEFAULT_GRAPH_FILENAMES)))
|
||||||
elif install:
|
elif install:
|
||||||
raise RuntimeError('Cannot --install on a file (only available for dirs containing requirements.txt).')
|
raise RuntimeError('Cannot --install on a file (only available for dirs containing requirements.txt).')
|
||||||
context = runpy.run_path(filename, run_name='__bonobo__')
|
context = runpy.run_path(filename, run_name='__bonobo__')
|
||||||
|
|||||||
@ -1,182 +1,182 @@
|
|||||||
{"O q de poule": "53 rue du ruisseau, 75018 Paris, France",
|
{"Le Reynou": "2 bis quai de la m\u00e9gisserie, 75001 Paris, France",
|
||||||
|
"les montparnos": "65 boulevard Pasteur, 75015 Paris, France",
|
||||||
|
"Le Saint Jean": "23 rue des abbesses, 75018 Paris, France",
|
||||||
|
"Le Felteu": "1 rue Pecquay, 75004 Paris, France",
|
||||||
|
"O q de poule": "53 rue du ruisseau, 75018 Paris, France",
|
||||||
"Le chantereine": "51 Rue Victoire, 75009 Paris, France",
|
"Le chantereine": "51 Rue Victoire, 75009 Paris, France",
|
||||||
|
"Le M\u00fcller": "11 rue Feutrier, 75018 Paris, France",
|
||||||
"La Caravane": "Rue de la Fontaine au Roi, 75011 Paris, France",
|
"La Caravane": "Rue de la Fontaine au Roi, 75011 Paris, France",
|
||||||
"Le Pas Sage": "1 Passage du Grand Cerf, 75002 Paris, France",
|
"Le Pas Sage": "1 Passage du Grand Cerf, 75002 Paris, France",
|
||||||
"La Renaissance": "112 Rue Championnet, 75018 Paris, France",
|
"La Renaissance": "112 Rue Championnet, 75018 Paris, France",
|
||||||
"Ext\u00e9rieur Quai": "5, rue d'Alsace, 75010 Paris, France",
|
"Ext\u00e9rieur Quai": "5, rue d'Alsace, 75010 Paris, France",
|
||||||
"Le Reynou": "2 bis quai de la m\u00e9gisserie, 75001 Paris, France",
|
"Le Sully": "6 Bd henri IV, 75004 Paris, France",
|
||||||
"les montparnos": "65 boulevard Pasteur, 75015 Paris, France",
|
"Le drapeau de la fidelit\u00e9": "21 rue Copreaux, 75015 Paris, France",
|
||||||
|
"Le caf\u00e9 des amis": "125 rue Blomet, 75015 Paris, France",
|
||||||
|
"Le Kleemend's": "34 avenue Pierre Mend\u00e8s-France, 75013 Paris, France",
|
||||||
|
"Assaporare Dix sur Dix": "75, avenue Ledru-Rollin, 75012 Paris, France",
|
||||||
|
"Caf\u00e9 Pierre": "202 rue du faubourg st antoine, 75012 Paris, France",
|
||||||
|
"Le Caf\u00e9 Livres": "10 rue Saint Martin, 75004 Paris, France",
|
||||||
|
"Le Chaumontois": "12 rue Armand Carrel, 75018 Paris, France",
|
||||||
|
"Le Square": "31 rue Saint-Dominique, 75007 Paris, France",
|
||||||
|
"Les Arcades": "61 rue de Ponthieu, 75008 Paris, France",
|
||||||
|
"Le Bosquet": "46 avenue Bosquet, 75007 Paris, France",
|
||||||
"Le bistrot de Ma\u00eblle et Augustin": "42 rue coquill\u00e8re, 75001 Paris, France",
|
"Le bistrot de Ma\u00eblle et Augustin": "42 rue coquill\u00e8re, 75001 Paris, France",
|
||||||
"D\u00e9d\u00e9 la frite": "52 rue Notre-Dame des Victoires, 75002 Paris, France",
|
"D\u00e9d\u00e9 la frite": "52 rue Notre-Dame des Victoires, 75002 Paris, France",
|
||||||
"Assaporare Dix sur Dix": "75, avenue Ledru-Rollin, 75012 Paris, France",
|
|
||||||
"Cardinal Saint-Germain": "11 boulevard Saint-Germain, 75005 Paris, France",
|
"Cardinal Saint-Germain": "11 boulevard Saint-Germain, 75005 Paris, France",
|
||||||
"Caf\u00e9 antoine": "17 rue Jean de la Fontaine, 75016 Paris, France",
|
"Caf\u00e9 antoine": "17 rue Jean de la Fontaine, 75016 Paris, France",
|
||||||
"Au cerceau d'or": "129 boulevard sebastopol, 75002 Paris, France",
|
"Au cerceau d'or": "129 boulevard sebastopol, 75002 Paris, France",
|
||||||
"Le Chaumontois": "12 rue Armand Carrel, 75018 Paris, France",
|
|
||||||
"Aux cadrans": "21 ter boulevard Diderot, 75012 Paris, France",
|
"Aux cadrans": "21 ter boulevard Diderot, 75012 Paris, France",
|
||||||
"Le Saint Jean": "23 rue des abbesses, 75018 Paris, France",
|
|
||||||
"Le Square": "31 rue Saint-Dominique, 75007 Paris, France",
|
|
||||||
"Les Arcades": "61 rue de Ponthieu, 75008 Paris, France",
|
|
||||||
"Caf\u00e9 Lea": "5 rue Claude Bernard, 75005 Paris, France",
|
"Caf\u00e9 Lea": "5 rue Claude Bernard, 75005 Paris, France",
|
||||||
"Le Bellerive": "71 quai de Seine, 75019 Paris, France",
|
"Le Bellerive": "71 quai de Seine, 75019 Paris, France",
|
||||||
"La Bauloise": "36 rue du hameau, 75015 Paris, France",
|
"La Bauloise": "36 rue du hameau, 75015 Paris, France",
|
||||||
"Le Dellac": "14 rue Rougemont, 75009 Paris, France",
|
"Le Dellac": "14 rue Rougemont, 75009 Paris, France",
|
||||||
"Le Bosquet": "46 avenue Bosquet, 75007 Paris, France",
|
|
||||||
"Le Sully": "6 Bd henri IV, 75004 Paris, France",
|
|
||||||
"Le Felteu": "1 rue Pecquay, 75004 Paris, France",
|
|
||||||
"Le drapeau de la fidelit\u00e9": "21 rue Copreaux, 75015 Paris, France",
|
|
||||||
"Le caf\u00e9 des amis": "125 rue Blomet, 75015 Paris, France",
|
|
||||||
"Le Kleemend's": "34 avenue Pierre Mend\u00e8s-France, 75013 Paris, France",
|
|
||||||
"Caf\u00e9 Pierre": "202 rue du faubourg st antoine, 75012 Paris, France",
|
|
||||||
"Le M\u00fcller": "11 rue Feutrier, 75018 Paris, France",
|
|
||||||
"Le Caf\u00e9 Livres": "10 rue Saint Martin, 75004 Paris, France",
|
|
||||||
"La Cordonnerie": "142 Rue Saint-Denis 75002 Paris, 75002 Paris, France",
|
|
||||||
"Invitez vous chez nous": "7 rue Ep\u00e9e de Bois, 75005 Paris, France",
|
|
||||||
"Au bon coin": "49 rue des Cloys, 75018 Paris, France",
|
|
||||||
"La Br\u00fblerie des Ternes": "111 rue mouffetard, 75005 Paris, France",
|
|
||||||
"Le Petit Choiseul": "23 rue saint augustin, 75002 Paris, France",
|
|
||||||
"O'Breizh": "27 rue de Penthi\u00e8vre, 75008 Paris, France",
|
|
||||||
"Le Supercoin": "3, rue Baudelique, 75018 Paris, France",
|
|
||||||
"Populettes": "86 bis rue Riquet, 75018 Paris, France",
|
|
||||||
"Le Couvent": "69 rue Broca, 75013 Paris, France",
|
|
||||||
"Caf\u00e9 Zen": "46 rue Victoire, 75009 Paris, France",
|
|
||||||
"Le Chat bossu": "126, rue du Faubourg Saint Antoine, 75012 Paris, France",
|
|
||||||
"Le petit club": "55 rue de la tombe Issoire, 75014 Paris, France",
|
|
||||||
"Le Relais Haussmann": "146, boulevard Haussmann, 75008 Paris, France",
|
|
||||||
"Denfert caf\u00e9": "58 boulvevard Saint Jacques, 75014 Paris, France",
|
|
||||||
"Bagels & Coffee Corner": "Place de Clichy, 75017 Paris, France",
|
|
||||||
"Le Plein soleil": "90 avenue Parmentier, 75011 Paris, France",
|
|
||||||
"La Perle": "78 rue vieille du temple, 75003 Paris, France",
|
|
||||||
"Le Caf\u00e9 frapp\u00e9": "95 rue Montmartre, 75002 Paris, France",
|
|
||||||
"L'\u00c9cir": "59 Boulevard Saint-Jacques, 75014 Paris, France",
|
|
||||||
"Le Descartes": "1 rue Thouin, 75005 Paris, France",
|
|
||||||
"Br\u00fblerie San Jos\u00e9": "30 rue des Petits-Champs, 75002 Paris, France",
|
"Br\u00fblerie San Jos\u00e9": "30 rue des Petits-Champs, 75002 Paris, France",
|
||||||
"Caf\u00e9 de la Mairie (du VIII)": "rue de Lisbonne, 75008 Paris, France",
|
"Caf\u00e9 de la Mairie (du VIII)": "rue de Lisbonne, 75008 Paris, France",
|
||||||
"Au panini de la place": "47 rue Belgrand, 75020 Paris, France",
|
"Le General Beuret": "9 Place du General Beuret, 75015 Paris, France",
|
||||||
"Extra old caf\u00e9": "307 fg saint Antoine, 75011 Paris, France",
|
"Le Cap Bourbon": "1 rue Louis le Grand, 75002 Paris, France",
|
||||||
"En attendant l'or": "3 rue Faidherbe, 75011 Paris, France",
|
"En attendant l'or": "3 rue Faidherbe, 75011 Paris, France",
|
||||||
"Le Pure caf\u00e9": "14 rue Jean Mac\u00e9, 75011 Paris, France",
|
"Caf\u00e9 Martin": "2 place Martin Nadaud, 75001 Paris, France",
|
||||||
"Le Village": "182 rue de Courcelles, 75017 Paris, France",
|
"Etienne": "14 rue Turbigo, Paris, 75001 Paris, France",
|
||||||
"Le Malar": "88 rue Saint-Dominique, 75007 Paris, France",
|
"L'ing\u00e9nu": "184 bd Voltaire, 75011 Paris, France",
|
||||||
"Pause Caf\u00e9": "41 rue de Charonne, 75011 Paris, France",
|
"Le Biz": "18 rue Favart, 75002 Paris, France",
|
||||||
"Chez Fafa": "44 rue Vinaigriers, 75010 Paris, France",
|
"L'Olive": "8 rue L'Olive, 75018 Paris, France",
|
||||||
"La Recoleta au Manoir": "229 avenue Gambetta, 75020 Paris, France",
|
"Le pari's caf\u00e9": "104 rue caulaincourt, 75018 Paris, France",
|
||||||
"Le Pareloup": "80 Rue Saint-Charles, 75015 Paris, France",
|
"Le Poulailler": "60 rue saint-sabin, 75011 Paris, France",
|
||||||
"La Marine": "55 bis quai de valmy, 75010 Paris, France",
|
"La Marine": "55 bis quai de valmy, 75010 Paris, France",
|
||||||
"American Kitchen": "49 rue bichat, 75010 Paris, France",
|
"American Kitchen": "49 rue bichat, 75010 Paris, France",
|
||||||
|
"Chai 33": "33 Cour Saint Emilion, 75012 Paris, France",
|
||||||
"Face Bar": "82 rue des archives, 75003 Paris, France",
|
"Face Bar": "82 rue des archives, 75003 Paris, France",
|
||||||
"Le Bloc": "21 avenue Brochant, 75017 Paris, France",
|
"Le Bloc": "21 avenue Brochant, 75017 Paris, France",
|
||||||
"La Bricole": "52 rue Liebniz, 75018 Paris, France",
|
"La Bricole": "52 rue Liebniz, 75018 Paris, France",
|
||||||
"le ronsard": "place maubert, 75005 Paris, France",
|
"le ronsard": "place maubert, 75005 Paris, France",
|
||||||
"l'Usine": "1 rue d'Avron, 75020 Paris, France",
|
"l'Usine": "1 rue d'Avron, 75020 Paris, France",
|
||||||
"La Brasserie Gait\u00e9": "3 rue de la Gait\u00e9, 75014 Paris, France",
|
"La Cordonnerie": "142 Rue Saint-Denis 75002 Paris, 75002 Paris, France",
|
||||||
"Le General Beuret": "9 Place du General Beuret, 75015 Paris, France",
|
"Invitez vous chez nous": "7 rue Ep\u00e9e de Bois, 75005 Paris, France",
|
||||||
"Le Cap Bourbon": "1 rue Louis le Grand, 75002 Paris, France",
|
"Le sully": "13 rue du Faubourg Saint Denis, 75010 Paris, France",
|
||||||
"Le Ragueneau": "202 rue Saint-Honor\u00e9, 75001 Paris, France",
|
"Le Ragueneau": "202 rue Saint-Honor\u00e9, 75001 Paris, France",
|
||||||
"Le Germinal": "95 avenue Emile Zola, 75015 Paris, France",
|
"Le Germinal": "95 avenue Emile Zola, 75015 Paris, France",
|
||||||
"Caf\u00e9 Martin": "2 place Martin Nadaud, 75001 Paris, France",
|
|
||||||
"Etienne": "14 rue Turbigo, Paris, 75001 Paris, France",
|
|
||||||
"L'ing\u00e9nu": "184 bd Voltaire, 75011 Paris, France",
|
|
||||||
"Le refuge": "72 rue lamarck, 75018 Paris, France",
|
"Le refuge": "72 rue lamarck, 75018 Paris, France",
|
||||||
"Le Biz": "18 rue Favart, 75002 Paris, France",
|
|
||||||
"L'Olive": "8 rue L'Olive, 75018 Paris, France",
|
|
||||||
"Le sully": "13 rue du Faubourg Saint Denis, 75010 Paris, France",
|
|
||||||
"Drole d'endroit pour une rencontre": "58 rue de Montorgueil, 75002 Paris, France",
|
"Drole d'endroit pour une rencontre": "58 rue de Montorgueil, 75002 Paris, France",
|
||||||
|
"Le Petit Choiseul": "23 rue saint augustin, 75002 Paris, France",
|
||||||
|
"O'Breizh": "27 rue de Penthi\u00e8vre, 75008 Paris, France",
|
||||||
|
"Le Supercoin": "3, rue Baudelique, 75018 Paris, France",
|
||||||
|
"Populettes": "86 bis rue Riquet, 75018 Paris, France",
|
||||||
|
"La Recoleta au Manoir": "229 avenue Gambetta, 75020 Paris, France",
|
||||||
"L'Assassin": "99 rue Jean-Pierre Timbaud, 75011 Paris, France",
|
"L'Assassin": "99 rue Jean-Pierre Timbaud, 75011 Paris, France",
|
||||||
"Le pari's caf\u00e9": "104 rue caulaincourt, 75018 Paris, France",
|
"Le Pareloup": "80 Rue Saint-Charles, 75015 Paris, France",
|
||||||
"Le Poulailler": "60 rue saint-sabin, 75011 Paris, France",
|
"Caf\u00e9 Zen": "46 rue Victoire, 75009 Paris, France",
|
||||||
"Chai 33": "33 Cour Saint Emilion, 75012 Paris, France",
|
"La Brasserie Gait\u00e9": "3 rue de la Gait\u00e9, 75014 Paris, France",
|
||||||
|
"Au bon coin": "49 rue des Cloys, 75018 Paris, France",
|
||||||
|
"La Br\u00fblerie des Ternes": "111 rue mouffetard, 75005 Paris, France",
|
||||||
|
"Le Chat bossu": "126, rue du Faubourg Saint Antoine, 75012 Paris, France",
|
||||||
|
"Denfert caf\u00e9": "58 boulvevard Saint Jacques, 75014 Paris, France",
|
||||||
|
"Le Couvent": "69 rue Broca, 75013 Paris, France",
|
||||||
|
"Bagels & Coffee Corner": "Place de Clichy, 75017 Paris, France",
|
||||||
|
"La Perle": "78 rue vieille du temple, 75003 Paris, France",
|
||||||
|
"Le Caf\u00e9 frapp\u00e9": "95 rue Montmartre, 75002 Paris, France",
|
||||||
|
"L'\u00c9cir": "59 Boulevard Saint-Jacques, 75014 Paris, France",
|
||||||
|
"Le Descartes": "1 rue Thouin, 75005 Paris, France",
|
||||||
|
"Le petit club": "55 rue de la tombe Issoire, 75014 Paris, France",
|
||||||
|
"Le Relais Haussmann": "146, boulevard Haussmann, 75008 Paris, France",
|
||||||
|
"Au panini de la place": "47 rue Belgrand, 75020 Paris, France",
|
||||||
|
"Extra old caf\u00e9": "307 fg saint Antoine, 75011 Paris, France",
|
||||||
|
"Le Plein soleil": "90 avenue Parmentier, 75011 Paris, France",
|
||||||
|
"Le Pure caf\u00e9": "14 rue Jean Mac\u00e9, 75011 Paris, France",
|
||||||
|
"Le Village": "182 rue de Courcelles, 75017 Paris, France",
|
||||||
|
"Le Malar": "88 rue Saint-Dominique, 75007 Paris, France",
|
||||||
|
"Pause Caf\u00e9": "41 rue de Charonne, 75011 Paris, France",
|
||||||
|
"Chez Fafa": "44 rue Vinaigriers, 75010 Paris, France",
|
||||||
"Caf\u00e9 dans l'aerogare Air France Invalides": "2 rue Robert Esnault Pelterie, 75007 Paris, France",
|
"Caf\u00e9 dans l'aerogare Air France Invalides": "2 rue Robert Esnault Pelterie, 75007 Paris, France",
|
||||||
|
"Le relais de la victoire": "73 rue de la Victoire, 75009 Paris, France",
|
||||||
|
"Caprice caf\u00e9": "12 avenue Jean Moulin, 75014 Paris, France",
|
||||||
|
"Caves populaires": "22 rue des Dames, 75017 Paris, France",
|
||||||
|
"Cafe de grenelle": "188 rue de Grenelle, 75007 Paris, France",
|
||||||
|
"Chez Prune": "36 rue Beaurepaire, 75010 Paris, France",
|
||||||
|
"L'anjou": "1 rue de Montholon, 75009 Paris, France",
|
||||||
|
"Le Brio": "216, rue Marcadet, 75018 Paris, France",
|
||||||
|
"Tamm Bara": "7 rue Clisson, 75013 Paris, France",
|
||||||
|
"La chaumi\u00e8re gourmande": "Route de la Muette \u00e0 Neuilly",
|
||||||
|
"Club hippique du Jardin d\u2019Acclimatation": "75016 Paris, France",
|
||||||
"Les P\u00e8res Populaires": "46 rue de Buzenval, 75020 Paris, France",
|
"Les P\u00e8res Populaires": "46 rue de Buzenval, 75020 Paris, France",
|
||||||
"Epicerie Musicale": "55bis quai de Valmy, 75010 Paris, France",
|
"Epicerie Musicale": "55bis quai de Valmy, 75010 Paris, France",
|
||||||
"Le relais de la victoire": "73 rue de la Victoire, 75009 Paris, France",
|
|
||||||
"Le Centenaire": "104 rue amelot, 75011 Paris, France",
|
"Le Centenaire": "104 rue amelot, 75011 Paris, France",
|
||||||
"Caf\u00e9 Pistache": "9 rue des petits champs, 75001 Paris, France",
|
"Le Zazabar": "116 Rue de M\u00e9nilmontant, 75020 Paris, France",
|
||||||
"La Cagnotte": "13 Rue Jean-Baptiste Dumay, 75020 Paris, France",
|
|
||||||
"Le bal du pirate": "60 rue des bergers, 75015 Paris, France",
|
|
||||||
"bistrot les timbr\u00e9s": "14 rue d'alleray, 75015 Paris, France",
|
|
||||||
"Le Killy Jen": "28 bis boulevard Diderot, 75012 Paris, France",
|
|
||||||
"le 1 cinq": "172 rue de vaugirard, 75015 Paris, France",
|
|
||||||
"Les Artisans": "106 rue Lecourbe, 75015 Paris, France",
|
|
||||||
"Peperoni": "83 avenue de Wagram, 75001 Paris, France",
|
|
||||||
"Ragueneau": "202 rue Saint Honor\u00e9, 75001 Paris, France",
|
"Ragueneau": "202 rue Saint Honor\u00e9, 75001 Paris, France",
|
||||||
"l'orillon bar": "35 rue de l'orillon, 75011 Paris, France",
|
|
||||||
"zic zinc": "95 rue claude decaen, 75012 Paris, France",
|
|
||||||
"L'In\u00e9vitable": "22 rue Linn\u00e9, 75005 Paris, France",
|
"L'In\u00e9vitable": "22 rue Linn\u00e9, 75005 Paris, France",
|
||||||
"Le Brio": "216, rue Marcadet, 75018 Paris, France",
|
|
||||||
"Le Dunois": "77 rue Dunois, 75013 Paris, France",
|
"Le Dunois": "77 rue Dunois, 75013 Paris, France",
|
||||||
"La Montagne Sans Genevi\u00e8ve": "13 Rue du Pot de Fer, 75005 Paris, France",
|
"La Montagne Sans Genevi\u00e8ve": "13 Rue du Pot de Fer, 75005 Paris, France",
|
||||||
"Le Caminito": "48 rue du Dessous des Berges, 75013 Paris, France",
|
"Le Caminito": "48 rue du Dessous des Berges, 75013 Paris, France",
|
||||||
"Le petit Bretonneau": "Le petit Bretonneau - \u00e0 l'int\u00e9rieur de l'H\u00f4pital, 75018 Paris, France",
|
"Le petit Bretonneau": "Le petit Bretonneau - \u00e0 l'int\u00e9rieur de l'H\u00f4pital, 75018 Paris, France",
|
||||||
"La chaumi\u00e8re gourmande": "Route de la Muette \u00e0 Neuilly",
|
"Le bal du pirate": "60 rue des bergers, 75015 Paris, France",
|
||||||
"Club hippique du Jardin d\u2019Acclimatation": "75016 Paris, France",
|
|
||||||
"Caprice caf\u00e9": "12 avenue Jean Moulin, 75014 Paris, France",
|
|
||||||
"Le Zazabar": "116 Rue de M\u00e9nilmontant, 75020 Paris, France",
|
|
||||||
"Caf\u00e9 beauveau": "9 rue de Miromesnil, 75008 Paris, France",
|
|
||||||
"Caves populaires": "22 rue des Dames, 75017 Paris, France",
|
|
||||||
"Cafe de grenelle": "188 rue de Grenelle, 75007 Paris, France",
|
|
||||||
"Au Vin Des Rues": "21 rue Boulard, 75014 Paris, France",
|
|
||||||
"L'antre d'eux": "16 rue DE MEZIERES, 75006 Paris, France",
|
"L'antre d'eux": "16 rue DE MEZIERES, 75006 Paris, France",
|
||||||
"Chez Prune": "36 rue Beaurepaire, 75010 Paris, France",
|
"l'orillon bar": "35 rue de l'orillon, 75011 Paris, France",
|
||||||
"L'anjou": "1 rue de Montholon, 75009 Paris, France",
|
"zic zinc": "95 rue claude decaen, 75012 Paris, France",
|
||||||
"Tamm Bara": "7 rue Clisson, 75013 Paris, France",
|
"Caf\u00e9 Pistache": "9 rue des petits champs, 75001 Paris, France",
|
||||||
"La cantoche de Paname": "40 Boulevard Beaumarchais, 75011 Paris, France",
|
"La Cagnotte": "13 Rue Jean-Baptiste Dumay, 75020 Paris, France",
|
||||||
"Le Saint Ren\u00e9": "148 Boulevard de Charonne, 75020 Paris, France",
|
"bistrot les timbr\u00e9s": "14 rue d'alleray, 75015 Paris, France",
|
||||||
"Caf\u00e9 Clochette": "16 avenue Richerand, 75010 Paris, France",
|
"Le Killy Jen": "28 bis boulevard Diderot, 75012 Paris, France",
|
||||||
"L'europ\u00e9en": "21 Bis Boulevard Diderot, 75012 Paris, France",
|
"Caf\u00e9 beauveau": "9 rue de Miromesnil, 75008 Paris, France",
|
||||||
|
"le 1 cinq": "172 rue de vaugirard, 75015 Paris, France",
|
||||||
|
"Au Vin Des Rues": "21 rue Boulard, 75014 Paris, France",
|
||||||
|
"Les Artisans": "106 rue Lecourbe, 75015 Paris, France",
|
||||||
|
"Peperoni": "83 avenue de Wagram, 75001 Paris, France",
|
||||||
"Le BB (Bouchon des Batignolles)": "2 rue Lemercier, 75017 Paris, France",
|
"Le BB (Bouchon des Batignolles)": "2 rue Lemercier, 75017 Paris, France",
|
||||||
"La Libert\u00e9": "196 rue du faubourg saint-antoine, 75012 Paris, France",
|
"La Libert\u00e9": "196 rue du faubourg saint-antoine, 75012 Paris, France",
|
||||||
"Chez Rutabaga": "16 rue des Petits Champs, 75002 Paris, France",
|
"Chez Rutabaga": "16 rue des Petits Champs, 75002 Paris, France",
|
||||||
"Les caves populaires": "22 rue des Dames, 75017 Paris, France",
|
"La cantoche de Paname": "40 Boulevard Beaumarchais, 75011 Paris, France",
|
||||||
"Le Plomb du cantal": "3 rue Ga\u00eet\u00e9, 75014 Paris, France",
|
"Le Saint Ren\u00e9": "148 Boulevard de Charonne, 75020 Paris, France",
|
||||||
"Bistrot Saint-Antoine": "58 rue du Fbg Saint-Antoine, 75012 Paris, France",
|
|
||||||
"Trois pi\u00e8ces cuisine": "101 rue des dames, 75017 Paris, France",
|
|
||||||
"La Brocante": "10 rue Rossini, 75009 Paris, France",
|
"La Brocante": "10 rue Rossini, 75009 Paris, France",
|
||||||
"Le Zinc": "61 avenue de la Motte Picquet, 75015 Paris, France",
|
"Caf\u00e9 Clochette": "16 avenue Richerand, 75010 Paris, France",
|
||||||
"Chez Oscar": "11/13 boulevard Beaumarchais, 75004 Paris, France",
|
"L'europ\u00e9en": "21 Bis Boulevard Diderot, 75012 Paris, France",
|
||||||
"Le Piquet": "48 avenue de la Motte Picquet, 75015 Paris, France",
|
|
||||||
"L'avant comptoir": "3 carrefour de l'Od\u00e9on, 75006 Paris, France",
|
|
||||||
"le chateau d'eau": "67 rue du Ch\u00e2teau d'eau, 75010 Paris, France",
|
|
||||||
"maison du vin": "52 rue des plantes, 75014 Paris, France",
|
|
||||||
"Les Vendangeurs": "6/8 rue Stanislas, 75006 Paris, France",
|
|
||||||
"NoMa": "39 rue Notre Dame de Nazareth, 75003 Paris, France",
|
"NoMa": "39 rue Notre Dame de Nazareth, 75003 Paris, France",
|
||||||
"Chez Luna": "108 rue de M\u00e9nilmontant, 75020 Paris, France",
|
|
||||||
"Le Tournebride": "104 rue Mouffetard, 75005 Paris, France",
|
|
||||||
"le lutece": "380 rue de vaugirard, 75015 Paris, France",
|
|
||||||
"Le bar Fleuri": "1 rue du Plateau, 75019 Paris, France",
|
|
||||||
"Le Fronton": "63 rue de Ponthieu, 75008 Paris, France",
|
|
||||||
"O'Paris": "1 Rue des Envierges, 75020 Paris, France",
|
"O'Paris": "1 Rue des Envierges, 75020 Paris, France",
|
||||||
"Rivolux": "16 rue de Rivoli, 75004 Paris, France",
|
|
||||||
"Brasiloja": "16 rue Ganneron, 75018 Paris, France",
|
|
||||||
"Botak cafe": "1 rue Paul albert, 75018 Paris, France",
|
"Botak cafe": "1 rue Paul albert, 75018 Paris, France",
|
||||||
"La cantine de Zo\u00e9": "136 rue du Faubourg poissonni\u00e8re, 75010 Paris, France",
|
"La cantine de Zo\u00e9": "136 rue du Faubourg poissonni\u00e8re, 75010 Paris, France",
|
||||||
"Institut des Cultures d'Islam": "19-23 rue L\u00e9on, 75018 Paris, France",
|
"Les caves populaires": "22 rue des Dames, 75017 Paris, France",
|
||||||
"Chez Miamophile": "6 rue M\u00e9lingue, 75019 Paris, France",
|
"Le Plomb du cantal": "3 rue Ga\u00eet\u00e9, 75014 Paris, France",
|
||||||
"Canopy Caf\u00e9 associatif": "19 rue Pajol, 75018 Paris, France",
|
"Trois pi\u00e8ces cuisine": "101 rue des dames, 75017 Paris, France",
|
||||||
"Caf\u00e9 rallye tournelles": "11 Quai de la Tournelle, 75005 Paris, France",
|
"Le Zinc": "61 avenue de la Motte Picquet, 75015 Paris, France",
|
||||||
"Petits Freres des Pauvres": "47 rue de Batignolles, 75017 Paris, France",
|
"L'avant comptoir": "3 carrefour de l'Od\u00e9on, 75006 Paris, France",
|
||||||
|
"Les Vendangeurs": "6/8 rue Stanislas, 75006 Paris, France",
|
||||||
|
"Chez Luna": "108 rue de M\u00e9nilmontant, 75020 Paris, France",
|
||||||
|
"Le bar Fleuri": "1 rue du Plateau, 75019 Paris, France",
|
||||||
|
"Bistrot Saint-Antoine": "58 rue du Fbg Saint-Antoine, 75012 Paris, France",
|
||||||
|
"Chez Oscar": "11/13 boulevard Beaumarchais, 75004 Paris, France",
|
||||||
|
"Le Piquet": "48 avenue de la Motte Picquet, 75015 Paris, France",
|
||||||
|
"le chateau d'eau": "67 rue du Ch\u00e2teau d'eau, 75010 Paris, France",
|
||||||
|
"maison du vin": "52 rue des plantes, 75014 Paris, France",
|
||||||
|
"Le Tournebride": "104 rue Mouffetard, 75005 Paris, France",
|
||||||
|
"Le Fronton": "63 rue de Ponthieu, 75008 Paris, France",
|
||||||
|
"le lutece": "380 rue de vaugirard, 75015 Paris, France",
|
||||||
|
"Rivolux": "16 rue de Rivoli, 75004 Paris, France",
|
||||||
|
"Brasiloja": "16 rue Ganneron, 75018 Paris, France",
|
||||||
"Le caf\u00e9 Monde et M\u00e9dias": "Place de la R\u00e9publique, 75003 Paris, France",
|
"Le caf\u00e9 Monde et M\u00e9dias": "Place de la R\u00e9publique, 75003 Paris, France",
|
||||||
"L'entrep\u00f4t": "157 rue Bercy 75012 Paris, 75012 Paris, France",
|
"L'entrep\u00f4t": "157 rue Bercy 75012 Paris, 75012 Paris, France",
|
||||||
"Coffee Chope": "344Vrue Vaugirard, 75015 Paris, France",
|
"Coffee Chope": "344Vrue Vaugirard, 75015 Paris, France",
|
||||||
"Le Comptoir": "354 bis rue Vaugirard, 75015 Paris, France",
|
|
||||||
"L'empreinte": "54, avenue Daumesnil, 75012 Paris, France",
|
|
||||||
"Caf\u00e9 Victor": "10 boulevard Victor, 75015 Paris, France",
|
|
||||||
"Caf\u00e9 Varenne": "36 rue de Varenne, 75007 Paris, France",
|
|
||||||
"Le Brigadier": "12 rue Blanche, 75009 Paris, France",
|
|
||||||
"Melting Pot": "3 rue de Lagny, 75020 Paris, France",
|
|
||||||
"L'Entracte": "place de l'opera, 75002 Paris, France",
|
|
||||||
"le Zango": "58 rue Daguerre, 75014 Paris, France",
|
|
||||||
"Panem": "18 rue de Crussol, 75011 Paris, France",
|
|
||||||
"Waikiki": "10 rue d\"Ulm, 75005 Paris, France",
|
|
||||||
"l'El\u00e9phant du nil": "125 Rue Saint-Antoine, 75004 Paris, France",
|
"l'El\u00e9phant du nil": "125 Rue Saint-Antoine, 75004 Paris, France",
|
||||||
"Le Parc Vaugirard": "358 rue de Vaugirard, 75015 Paris, France",
|
"Le Parc Vaugirard": "358 rue de Vaugirard, 75015 Paris, France",
|
||||||
"Pari's Caf\u00e9": "174 avenue de Clichy, 75017 Paris, France",
|
"Pari's Caf\u00e9": "174 avenue de Clichy, 75017 Paris, France",
|
||||||
|
"Le Comptoir": "354 bis rue Vaugirard, 75015 Paris, France",
|
||||||
|
"Caf\u00e9 Varenne": "36 rue de Varenne, 75007 Paris, France",
|
||||||
|
"Melting Pot": "3 rue de Lagny, 75020 Paris, France",
|
||||||
|
"le Zango": "58 rue Daguerre, 75014 Paris, France",
|
||||||
|
"Chez Miamophile": "6 rue M\u00e9lingue, 75019 Paris, France",
|
||||||
|
"Institut des Cultures d'Islam": "19-23 rue L\u00e9on, 75018 Paris, France",
|
||||||
|
"Canopy Caf\u00e9 associatif": "19 rue Pajol, 75018 Paris, France",
|
||||||
|
"Caf\u00e9 rallye tournelles": "11 Quai de la Tournelle, 75005 Paris, France",
|
||||||
|
"Petits Freres des Pauvres": "47 rue de Batignolles, 75017 Paris, France",
|
||||||
"Brasserie le Morvan": "61 rue du ch\u00e2teau d'eau, 75010 Paris, France",
|
"Brasserie le Morvan": "61 rue du ch\u00e2teau d'eau, 75010 Paris, France",
|
||||||
|
"L'Angle": "28 rue de Ponthieu, 75008 Paris, France",
|
||||||
|
"Caf\u00e9 Dupont": "198 rue de la Convention, 75015 Paris, France",
|
||||||
|
"L'Entracte": "place de l'opera, 75002 Paris, France",
|
||||||
|
"Panem": "18 rue de Crussol, 75011 Paris, France",
|
||||||
"Au pays de Vannes": "34 bis rue de Wattignies, 75012 Paris, France",
|
"Au pays de Vannes": "34 bis rue de Wattignies, 75012 Paris, France",
|
||||||
"Le Lucernaire": "53 rue Notre-Dame des Champs, 75006 Paris, France",
|
"Le Lucernaire": "53 rue Notre-Dame des Champs, 75006 Paris, France",
|
||||||
"L'Angle": "28 rue de Ponthieu, 75008 Paris, France",
|
|
||||||
"Le Caf\u00e9 d'avant": "35 rue Claude Bernard, 75005 Paris, France",
|
"Le Caf\u00e9 d'avant": "35 rue Claude Bernard, 75005 Paris, France",
|
||||||
"Caf\u00e9 Dupont": "198 rue de la Convention, 75015 Paris, France",
|
|
||||||
"L'\u00e2ge d'or": "26 rue du Docteur Magnan, 75013 Paris, France",
|
"L'\u00e2ge d'or": "26 rue du Docteur Magnan, 75013 Paris, France",
|
||||||
"Le S\u00e9vign\u00e9": "15 rue du Parc Royal, 75003 Paris, France",
|
"Le S\u00e9vign\u00e9": "15 rue du Parc Royal, 75003 Paris, France",
|
||||||
"L'horizon": "93, rue de la Roquette, 75011 Paris, France"}
|
"L'horizon": "93, rue de la Roquette, 75011 Paris, France",
|
||||||
|
"L'empreinte": "54, avenue Daumesnil, 75012 Paris, France",
|
||||||
|
"Caf\u00e9 Victor": "10 boulevard Victor, 75015 Paris, France",
|
||||||
|
"Le Brigadier": "12 rue Blanche, 75009 Paris, France",
|
||||||
|
"Waikiki": "10 rue d\"Ulm, 75005 Paris, France"}
|
||||||
@ -1,182 +1,182 @@
|
|||||||
|
Le Reynou, 2 bis quai de la mégisserie, 75001 Paris, France
|
||||||
|
les montparnos, 65 boulevard Pasteur, 75015 Paris, France
|
||||||
|
Le Saint Jean, 23 rue des abbesses, 75018 Paris, France
|
||||||
|
Le Felteu, 1 rue Pecquay, 75004 Paris, France
|
||||||
O q de poule, 53 rue du ruisseau, 75018 Paris, France
|
O q de poule, 53 rue du ruisseau, 75018 Paris, France
|
||||||
Le chantereine, 51 Rue Victoire, 75009 Paris, France
|
Le chantereine, 51 Rue Victoire, 75009 Paris, France
|
||||||
|
Le Müller, 11 rue Feutrier, 75018 Paris, France
|
||||||
La Caravane, Rue de la Fontaine au Roi, 75011 Paris, France
|
La Caravane, Rue de la Fontaine au Roi, 75011 Paris, France
|
||||||
Le Pas Sage, 1 Passage du Grand Cerf, 75002 Paris, France
|
Le Pas Sage, 1 Passage du Grand Cerf, 75002 Paris, France
|
||||||
La Renaissance, 112 Rue Championnet, 75018 Paris, France
|
La Renaissance, 112 Rue Championnet, 75018 Paris, France
|
||||||
Extérieur Quai, 5, rue d'Alsace, 75010 Paris, France
|
Extérieur Quai, 5, rue d'Alsace, 75010 Paris, France
|
||||||
Le Reynou, 2 bis quai de la mégisserie, 75001 Paris, France
|
Le Sully, 6 Bd henri IV, 75004 Paris, France
|
||||||
les montparnos, 65 boulevard Pasteur, 75015 Paris, France
|
Le drapeau de la fidelité, 21 rue Copreaux, 75015 Paris, France
|
||||||
|
Le café des amis, 125 rue Blomet, 75015 Paris, France
|
||||||
|
Le Kleemend's, 34 avenue Pierre Mendès-France, 75013 Paris, France
|
||||||
|
Assaporare Dix sur Dix, 75, avenue Ledru-Rollin, 75012 Paris, France
|
||||||
|
Café Pierre, 202 rue du faubourg st antoine, 75012 Paris, France
|
||||||
|
Le Café Livres, 10 rue Saint Martin, 75004 Paris, France
|
||||||
|
Le Chaumontois, 12 rue Armand Carrel, 75018 Paris, France
|
||||||
|
Le Square, 31 rue Saint-Dominique, 75007 Paris, France
|
||||||
|
Les Arcades, 61 rue de Ponthieu, 75008 Paris, France
|
||||||
|
Le Bosquet, 46 avenue Bosquet, 75007 Paris, France
|
||||||
Le bistrot de Maëlle et Augustin, 42 rue coquillère, 75001 Paris, France
|
Le bistrot de Maëlle et Augustin, 42 rue coquillère, 75001 Paris, France
|
||||||
Dédé la frite, 52 rue Notre-Dame des Victoires, 75002 Paris, France
|
Dédé la frite, 52 rue Notre-Dame des Victoires, 75002 Paris, France
|
||||||
Assaporare Dix sur Dix, 75, avenue Ledru-Rollin, 75012 Paris, France
|
|
||||||
Cardinal Saint-Germain, 11 boulevard Saint-Germain, 75005 Paris, France
|
Cardinal Saint-Germain, 11 boulevard Saint-Germain, 75005 Paris, France
|
||||||
Café antoine, 17 rue Jean de la Fontaine, 75016 Paris, France
|
Café antoine, 17 rue Jean de la Fontaine, 75016 Paris, France
|
||||||
Au cerceau d'or, 129 boulevard sebastopol, 75002 Paris, France
|
Au cerceau d'or, 129 boulevard sebastopol, 75002 Paris, France
|
||||||
Le Chaumontois, 12 rue Armand Carrel, 75018 Paris, France
|
|
||||||
Aux cadrans, 21 ter boulevard Diderot, 75012 Paris, France
|
Aux cadrans, 21 ter boulevard Diderot, 75012 Paris, France
|
||||||
Le Saint Jean, 23 rue des abbesses, 75018 Paris, France
|
|
||||||
Le Square, 31 rue Saint-Dominique, 75007 Paris, France
|
|
||||||
Les Arcades, 61 rue de Ponthieu, 75008 Paris, France
|
|
||||||
Café Lea, 5 rue Claude Bernard, 75005 Paris, France
|
Café Lea, 5 rue Claude Bernard, 75005 Paris, France
|
||||||
Le Bellerive, 71 quai de Seine, 75019 Paris, France
|
Le Bellerive, 71 quai de Seine, 75019 Paris, France
|
||||||
La Bauloise, 36 rue du hameau, 75015 Paris, France
|
La Bauloise, 36 rue du hameau, 75015 Paris, France
|
||||||
Le Dellac, 14 rue Rougemont, 75009 Paris, France
|
Le Dellac, 14 rue Rougemont, 75009 Paris, France
|
||||||
Le Bosquet, 46 avenue Bosquet, 75007 Paris, France
|
|
||||||
Le Sully, 6 Bd henri IV, 75004 Paris, France
|
|
||||||
Le Felteu, 1 rue Pecquay, 75004 Paris, France
|
|
||||||
Le drapeau de la fidelité, 21 rue Copreaux, 75015 Paris, France
|
|
||||||
Le café des amis, 125 rue Blomet, 75015 Paris, France
|
|
||||||
Le Kleemend's, 34 avenue Pierre Mendès-France, 75013 Paris, France
|
|
||||||
Café Pierre, 202 rue du faubourg st antoine, 75012 Paris, France
|
|
||||||
Le Müller, 11 rue Feutrier, 75018 Paris, France
|
|
||||||
Le Café Livres, 10 rue Saint Martin, 75004 Paris, France
|
|
||||||
La Cordonnerie, 142 Rue Saint-Denis 75002 Paris, 75002 Paris, France
|
|
||||||
Invitez vous chez nous, 7 rue Epée de Bois, 75005 Paris, France
|
|
||||||
Au bon coin, 49 rue des Cloys, 75018 Paris, France
|
|
||||||
La Brûlerie des Ternes, 111 rue mouffetard, 75005 Paris, France
|
|
||||||
Le Petit Choiseul, 23 rue saint augustin, 75002 Paris, France
|
|
||||||
O'Breizh, 27 rue de Penthièvre, 75008 Paris, France
|
|
||||||
Le Supercoin, 3, rue Baudelique, 75018 Paris, France
|
|
||||||
Populettes, 86 bis rue Riquet, 75018 Paris, France
|
|
||||||
Le Couvent, 69 rue Broca, 75013 Paris, France
|
|
||||||
Café Zen, 46 rue Victoire, 75009 Paris, France
|
|
||||||
Le Chat bossu, 126, rue du Faubourg Saint Antoine, 75012 Paris, France
|
|
||||||
Le petit club, 55 rue de la tombe Issoire, 75014 Paris, France
|
|
||||||
Le Relais Haussmann, 146, boulevard Haussmann, 75008 Paris, France
|
|
||||||
Denfert café, 58 boulvevard Saint Jacques, 75014 Paris, France
|
|
||||||
Bagels & Coffee Corner, Place de Clichy, 75017 Paris, France
|
|
||||||
Le Plein soleil, 90 avenue Parmentier, 75011 Paris, France
|
|
||||||
La Perle, 78 rue vieille du temple, 75003 Paris, France
|
|
||||||
Le Café frappé, 95 rue Montmartre, 75002 Paris, France
|
|
||||||
L'Écir, 59 Boulevard Saint-Jacques, 75014 Paris, France
|
|
||||||
Le Descartes, 1 rue Thouin, 75005 Paris, France
|
|
||||||
Brûlerie San José, 30 rue des Petits-Champs, 75002 Paris, France
|
Brûlerie San José, 30 rue des Petits-Champs, 75002 Paris, France
|
||||||
Café de la Mairie (du VIII), rue de Lisbonne, 75008 Paris, France
|
Café de la Mairie (du VIII), rue de Lisbonne, 75008 Paris, France
|
||||||
Au panini de la place, 47 rue Belgrand, 75020 Paris, France
|
Le General Beuret, 9 Place du General Beuret, 75015 Paris, France
|
||||||
Extra old café, 307 fg saint Antoine, 75011 Paris, France
|
Le Cap Bourbon, 1 rue Louis le Grand, 75002 Paris, France
|
||||||
En attendant l'or, 3 rue Faidherbe, 75011 Paris, France
|
En attendant l'or, 3 rue Faidherbe, 75011 Paris, France
|
||||||
Le Pure café, 14 rue Jean Macé, 75011 Paris, France
|
Café Martin, 2 place Martin Nadaud, 75001 Paris, France
|
||||||
Le Village, 182 rue de Courcelles, 75017 Paris, France
|
Etienne, 14 rue Turbigo, Paris, 75001 Paris, France
|
||||||
Le Malar, 88 rue Saint-Dominique, 75007 Paris, France
|
L'ingénu, 184 bd Voltaire, 75011 Paris, France
|
||||||
Pause Café, 41 rue de Charonne, 75011 Paris, France
|
Le Biz, 18 rue Favart, 75002 Paris, France
|
||||||
Chez Fafa, 44 rue Vinaigriers, 75010 Paris, France
|
L'Olive, 8 rue L'Olive, 75018 Paris, France
|
||||||
La Recoleta au Manoir, 229 avenue Gambetta, 75020 Paris, France
|
Le pari's café, 104 rue caulaincourt, 75018 Paris, France
|
||||||
Le Pareloup, 80 Rue Saint-Charles, 75015 Paris, France
|
Le Poulailler, 60 rue saint-sabin, 75011 Paris, France
|
||||||
La Marine, 55 bis quai de valmy, 75010 Paris, France
|
La Marine, 55 bis quai de valmy, 75010 Paris, France
|
||||||
American Kitchen, 49 rue bichat, 75010 Paris, France
|
American Kitchen, 49 rue bichat, 75010 Paris, France
|
||||||
|
Chai 33, 33 Cour Saint Emilion, 75012 Paris, France
|
||||||
Face Bar, 82 rue des archives, 75003 Paris, France
|
Face Bar, 82 rue des archives, 75003 Paris, France
|
||||||
Le Bloc, 21 avenue Brochant, 75017 Paris, France
|
Le Bloc, 21 avenue Brochant, 75017 Paris, France
|
||||||
La Bricole, 52 rue Liebniz, 75018 Paris, France
|
La Bricole, 52 rue Liebniz, 75018 Paris, France
|
||||||
le ronsard, place maubert, 75005 Paris, France
|
le ronsard, place maubert, 75005 Paris, France
|
||||||
l'Usine, 1 rue d'Avron, 75020 Paris, France
|
l'Usine, 1 rue d'Avron, 75020 Paris, France
|
||||||
La Brasserie Gaité, 3 rue de la Gaité, 75014 Paris, France
|
La Cordonnerie, 142 Rue Saint-Denis 75002 Paris, 75002 Paris, France
|
||||||
Le General Beuret, 9 Place du General Beuret, 75015 Paris, France
|
Invitez vous chez nous, 7 rue Epée de Bois, 75005 Paris, France
|
||||||
Le Cap Bourbon, 1 rue Louis le Grand, 75002 Paris, France
|
Le sully, 13 rue du Faubourg Saint Denis, 75010 Paris, France
|
||||||
Le Ragueneau, 202 rue Saint-Honoré, 75001 Paris, France
|
Le Ragueneau, 202 rue Saint-Honoré, 75001 Paris, France
|
||||||
Le Germinal, 95 avenue Emile Zola, 75015 Paris, France
|
Le Germinal, 95 avenue Emile Zola, 75015 Paris, France
|
||||||
Café Martin, 2 place Martin Nadaud, 75001 Paris, France
|
|
||||||
Etienne, 14 rue Turbigo, Paris, 75001 Paris, France
|
|
||||||
L'ingénu, 184 bd Voltaire, 75011 Paris, France
|
|
||||||
Le refuge, 72 rue lamarck, 75018 Paris, France
|
Le refuge, 72 rue lamarck, 75018 Paris, France
|
||||||
Le Biz, 18 rue Favart, 75002 Paris, France
|
|
||||||
L'Olive, 8 rue L'Olive, 75018 Paris, France
|
|
||||||
Le sully, 13 rue du Faubourg Saint Denis, 75010 Paris, France
|
|
||||||
Drole d'endroit pour une rencontre, 58 rue de Montorgueil, 75002 Paris, France
|
Drole d'endroit pour une rencontre, 58 rue de Montorgueil, 75002 Paris, France
|
||||||
|
Le Petit Choiseul, 23 rue saint augustin, 75002 Paris, France
|
||||||
|
O'Breizh, 27 rue de Penthièvre, 75008 Paris, France
|
||||||
|
Le Supercoin, 3, rue Baudelique, 75018 Paris, France
|
||||||
|
Populettes, 86 bis rue Riquet, 75018 Paris, France
|
||||||
|
La Recoleta au Manoir, 229 avenue Gambetta, 75020 Paris, France
|
||||||
L'Assassin, 99 rue Jean-Pierre Timbaud, 75011 Paris, France
|
L'Assassin, 99 rue Jean-Pierre Timbaud, 75011 Paris, France
|
||||||
Le pari's café, 104 rue caulaincourt, 75018 Paris, France
|
Le Pareloup, 80 Rue Saint-Charles, 75015 Paris, France
|
||||||
Le Poulailler, 60 rue saint-sabin, 75011 Paris, France
|
Café Zen, 46 rue Victoire, 75009 Paris, France
|
||||||
Chai 33, 33 Cour Saint Emilion, 75012 Paris, France
|
La Brasserie Gaité, 3 rue de la Gaité, 75014 Paris, France
|
||||||
|
Au bon coin, 49 rue des Cloys, 75018 Paris, France
|
||||||
|
La Brûlerie des Ternes, 111 rue mouffetard, 75005 Paris, France
|
||||||
|
Le Chat bossu, 126, rue du Faubourg Saint Antoine, 75012 Paris, France
|
||||||
|
Denfert café, 58 boulvevard Saint Jacques, 75014 Paris, France
|
||||||
|
Le Couvent, 69 rue Broca, 75013 Paris, France
|
||||||
|
Bagels & Coffee Corner, Place de Clichy, 75017 Paris, France
|
||||||
|
La Perle, 78 rue vieille du temple, 75003 Paris, France
|
||||||
|
Le Café frappé, 95 rue Montmartre, 75002 Paris, France
|
||||||
|
L'Écir, 59 Boulevard Saint-Jacques, 75014 Paris, France
|
||||||
|
Le Descartes, 1 rue Thouin, 75005 Paris, France
|
||||||
|
Le petit club, 55 rue de la tombe Issoire, 75014 Paris, France
|
||||||
|
Le Relais Haussmann, 146, boulevard Haussmann, 75008 Paris, France
|
||||||
|
Au panini de la place, 47 rue Belgrand, 75020 Paris, France
|
||||||
|
Extra old café, 307 fg saint Antoine, 75011 Paris, France
|
||||||
|
Le Plein soleil, 90 avenue Parmentier, 75011 Paris, France
|
||||||
|
Le Pure café, 14 rue Jean Macé, 75011 Paris, France
|
||||||
|
Le Village, 182 rue de Courcelles, 75017 Paris, France
|
||||||
|
Le Malar, 88 rue Saint-Dominique, 75007 Paris, France
|
||||||
|
Pause Café, 41 rue de Charonne, 75011 Paris, France
|
||||||
|
Chez Fafa, 44 rue Vinaigriers, 75010 Paris, France
|
||||||
Café dans l'aerogare Air France Invalides, 2 rue Robert Esnault Pelterie, 75007 Paris, France
|
Café dans l'aerogare Air France Invalides, 2 rue Robert Esnault Pelterie, 75007 Paris, France
|
||||||
|
Le relais de la victoire, 73 rue de la Victoire, 75009 Paris, France
|
||||||
|
Caprice café, 12 avenue Jean Moulin, 75014 Paris, France
|
||||||
|
Caves populaires, 22 rue des Dames, 75017 Paris, France
|
||||||
|
Cafe de grenelle, 188 rue de Grenelle, 75007 Paris, France
|
||||||
|
Chez Prune, 36 rue Beaurepaire, 75010 Paris, France
|
||||||
|
L'anjou, 1 rue de Montholon, 75009 Paris, France
|
||||||
|
Le Brio, 216, rue Marcadet, 75018 Paris, France
|
||||||
|
Tamm Bara, 7 rue Clisson, 75013 Paris, France
|
||||||
|
La chaumière gourmande, Route de la Muette à Neuilly
|
||||||
|
Club hippique du Jardin d’Acclimatation, 75016 Paris, France
|
||||||
Les Pères Populaires, 46 rue de Buzenval, 75020 Paris, France
|
Les Pères Populaires, 46 rue de Buzenval, 75020 Paris, France
|
||||||
Epicerie Musicale, 55bis quai de Valmy, 75010 Paris, France
|
Epicerie Musicale, 55bis quai de Valmy, 75010 Paris, France
|
||||||
Le relais de la victoire, 73 rue de la Victoire, 75009 Paris, France
|
|
||||||
Le Centenaire, 104 rue amelot, 75011 Paris, France
|
Le Centenaire, 104 rue amelot, 75011 Paris, France
|
||||||
Café Pistache, 9 rue des petits champs, 75001 Paris, France
|
Le Zazabar, 116 Rue de Ménilmontant, 75020 Paris, France
|
||||||
La Cagnotte, 13 Rue Jean-Baptiste Dumay, 75020 Paris, France
|
|
||||||
Le bal du pirate, 60 rue des bergers, 75015 Paris, France
|
|
||||||
bistrot les timbrés, 14 rue d'alleray, 75015 Paris, France
|
|
||||||
Le Killy Jen, 28 bis boulevard Diderot, 75012 Paris, France
|
|
||||||
le 1 cinq, 172 rue de vaugirard, 75015 Paris, France
|
|
||||||
Les Artisans, 106 rue Lecourbe, 75015 Paris, France
|
|
||||||
Peperoni, 83 avenue de Wagram, 75001 Paris, France
|
|
||||||
Ragueneau, 202 rue Saint Honoré, 75001 Paris, France
|
Ragueneau, 202 rue Saint Honoré, 75001 Paris, France
|
||||||
l'orillon bar, 35 rue de l'orillon, 75011 Paris, France
|
|
||||||
zic zinc, 95 rue claude decaen, 75012 Paris, France
|
|
||||||
L'Inévitable, 22 rue Linné, 75005 Paris, France
|
L'Inévitable, 22 rue Linné, 75005 Paris, France
|
||||||
Le Brio, 216, rue Marcadet, 75018 Paris, France
|
|
||||||
Le Dunois, 77 rue Dunois, 75013 Paris, France
|
Le Dunois, 77 rue Dunois, 75013 Paris, France
|
||||||
La Montagne Sans Geneviève, 13 Rue du Pot de Fer, 75005 Paris, France
|
La Montagne Sans Geneviève, 13 Rue du Pot de Fer, 75005 Paris, France
|
||||||
Le Caminito, 48 rue du Dessous des Berges, 75013 Paris, France
|
Le Caminito, 48 rue du Dessous des Berges, 75013 Paris, France
|
||||||
Le petit Bretonneau, Le petit Bretonneau - à l'intérieur de l'Hôpital, 75018 Paris, France
|
Le petit Bretonneau, Le petit Bretonneau - à l'intérieur de l'Hôpital, 75018 Paris, France
|
||||||
La chaumière gourmande, Route de la Muette à Neuilly
|
Le bal du pirate, 60 rue des bergers, 75015 Paris, France
|
||||||
Club hippique du Jardin d’Acclimatation, 75016 Paris, France
|
|
||||||
Caprice café, 12 avenue Jean Moulin, 75014 Paris, France
|
|
||||||
Le Zazabar, 116 Rue de Ménilmontant, 75020 Paris, France
|
|
||||||
Café beauveau, 9 rue de Miromesnil, 75008 Paris, France
|
|
||||||
Caves populaires, 22 rue des Dames, 75017 Paris, France
|
|
||||||
Cafe de grenelle, 188 rue de Grenelle, 75007 Paris, France
|
|
||||||
Au Vin Des Rues, 21 rue Boulard, 75014 Paris, France
|
|
||||||
L'antre d'eux, 16 rue DE MEZIERES, 75006 Paris, France
|
L'antre d'eux, 16 rue DE MEZIERES, 75006 Paris, France
|
||||||
Chez Prune, 36 rue Beaurepaire, 75010 Paris, France
|
l'orillon bar, 35 rue de l'orillon, 75011 Paris, France
|
||||||
L'anjou, 1 rue de Montholon, 75009 Paris, France
|
zic zinc, 95 rue claude decaen, 75012 Paris, France
|
||||||
Tamm Bara, 7 rue Clisson, 75013 Paris, France
|
Café Pistache, 9 rue des petits champs, 75001 Paris, France
|
||||||
La cantoche de Paname, 40 Boulevard Beaumarchais, 75011 Paris, France
|
La Cagnotte, 13 Rue Jean-Baptiste Dumay, 75020 Paris, France
|
||||||
Le Saint René, 148 Boulevard de Charonne, 75020 Paris, France
|
bistrot les timbrés, 14 rue d'alleray, 75015 Paris, France
|
||||||
Café Clochette, 16 avenue Richerand, 75010 Paris, France
|
Le Killy Jen, 28 bis boulevard Diderot, 75012 Paris, France
|
||||||
L'européen, 21 Bis Boulevard Diderot, 75012 Paris, France
|
Café beauveau, 9 rue de Miromesnil, 75008 Paris, France
|
||||||
|
le 1 cinq, 172 rue de vaugirard, 75015 Paris, France
|
||||||
|
Au Vin Des Rues, 21 rue Boulard, 75014 Paris, France
|
||||||
|
Les Artisans, 106 rue Lecourbe, 75015 Paris, France
|
||||||
|
Peperoni, 83 avenue de Wagram, 75001 Paris, France
|
||||||
Le BB (Bouchon des Batignolles), 2 rue Lemercier, 75017 Paris, France
|
Le BB (Bouchon des Batignolles), 2 rue Lemercier, 75017 Paris, France
|
||||||
La Liberté, 196 rue du faubourg saint-antoine, 75012 Paris, France
|
La Liberté, 196 rue du faubourg saint-antoine, 75012 Paris, France
|
||||||
Chez Rutabaga, 16 rue des Petits Champs, 75002 Paris, France
|
Chez Rutabaga, 16 rue des Petits Champs, 75002 Paris, France
|
||||||
Les caves populaires, 22 rue des Dames, 75017 Paris, France
|
La cantoche de Paname, 40 Boulevard Beaumarchais, 75011 Paris, France
|
||||||
Le Plomb du cantal, 3 rue Gaîté, 75014 Paris, France
|
Le Saint René, 148 Boulevard de Charonne, 75020 Paris, France
|
||||||
Bistrot Saint-Antoine, 58 rue du Fbg Saint-Antoine, 75012 Paris, France
|
|
||||||
Trois pièces cuisine, 101 rue des dames, 75017 Paris, France
|
|
||||||
La Brocante, 10 rue Rossini, 75009 Paris, France
|
La Brocante, 10 rue Rossini, 75009 Paris, France
|
||||||
Le Zinc, 61 avenue de la Motte Picquet, 75015 Paris, France
|
Café Clochette, 16 avenue Richerand, 75010 Paris, France
|
||||||
Chez Oscar, 11/13 boulevard Beaumarchais, 75004 Paris, France
|
L'européen, 21 Bis Boulevard Diderot, 75012 Paris, France
|
||||||
Le Piquet, 48 avenue de la Motte Picquet, 75015 Paris, France
|
|
||||||
L'avant comptoir, 3 carrefour de l'Odéon, 75006 Paris, France
|
|
||||||
le chateau d'eau, 67 rue du Château d'eau, 75010 Paris, France
|
|
||||||
maison du vin, 52 rue des plantes, 75014 Paris, France
|
|
||||||
Les Vendangeurs, 6/8 rue Stanislas, 75006 Paris, France
|
|
||||||
NoMa, 39 rue Notre Dame de Nazareth, 75003 Paris, France
|
NoMa, 39 rue Notre Dame de Nazareth, 75003 Paris, France
|
||||||
Chez Luna, 108 rue de Ménilmontant, 75020 Paris, France
|
|
||||||
Le Tournebride, 104 rue Mouffetard, 75005 Paris, France
|
|
||||||
le lutece, 380 rue de vaugirard, 75015 Paris, France
|
|
||||||
Le bar Fleuri, 1 rue du Plateau, 75019 Paris, France
|
|
||||||
Le Fronton, 63 rue de Ponthieu, 75008 Paris, France
|
|
||||||
O'Paris, 1 Rue des Envierges, 75020 Paris, France
|
O'Paris, 1 Rue des Envierges, 75020 Paris, France
|
||||||
Rivolux, 16 rue de Rivoli, 75004 Paris, France
|
|
||||||
Brasiloja, 16 rue Ganneron, 75018 Paris, France
|
|
||||||
Botak cafe, 1 rue Paul albert, 75018 Paris, France
|
Botak cafe, 1 rue Paul albert, 75018 Paris, France
|
||||||
La cantine de Zoé, 136 rue du Faubourg poissonnière, 75010 Paris, France
|
La cantine de Zoé, 136 rue du Faubourg poissonnière, 75010 Paris, France
|
||||||
Institut des Cultures d'Islam, 19-23 rue Léon, 75018 Paris, France
|
Les caves populaires, 22 rue des Dames, 75017 Paris, France
|
||||||
Chez Miamophile, 6 rue Mélingue, 75019 Paris, France
|
Le Plomb du cantal, 3 rue Gaîté, 75014 Paris, France
|
||||||
Canopy Café associatif, 19 rue Pajol, 75018 Paris, France
|
Trois pièces cuisine, 101 rue des dames, 75017 Paris, France
|
||||||
Café rallye tournelles, 11 Quai de la Tournelle, 75005 Paris, France
|
Le Zinc, 61 avenue de la Motte Picquet, 75015 Paris, France
|
||||||
Petits Freres des Pauvres, 47 rue de Batignolles, 75017 Paris, France
|
L'avant comptoir, 3 carrefour de l'Odéon, 75006 Paris, France
|
||||||
|
Les Vendangeurs, 6/8 rue Stanislas, 75006 Paris, France
|
||||||
|
Chez Luna, 108 rue de Ménilmontant, 75020 Paris, France
|
||||||
|
Le bar Fleuri, 1 rue du Plateau, 75019 Paris, France
|
||||||
|
Bistrot Saint-Antoine, 58 rue du Fbg Saint-Antoine, 75012 Paris, France
|
||||||
|
Chez Oscar, 11/13 boulevard Beaumarchais, 75004 Paris, France
|
||||||
|
Le Piquet, 48 avenue de la Motte Picquet, 75015 Paris, France
|
||||||
|
le chateau d'eau, 67 rue du Château d'eau, 75010 Paris, France
|
||||||
|
maison du vin, 52 rue des plantes, 75014 Paris, France
|
||||||
|
Le Tournebride, 104 rue Mouffetard, 75005 Paris, France
|
||||||
|
Le Fronton, 63 rue de Ponthieu, 75008 Paris, France
|
||||||
|
le lutece, 380 rue de vaugirard, 75015 Paris, France
|
||||||
|
Rivolux, 16 rue de Rivoli, 75004 Paris, France
|
||||||
|
Brasiloja, 16 rue Ganneron, 75018 Paris, France
|
||||||
Le café Monde et Médias, Place de la République, 75003 Paris, France
|
Le café Monde et Médias, Place de la République, 75003 Paris, France
|
||||||
L'entrepôt, 157 rue Bercy 75012 Paris, 75012 Paris, France
|
L'entrepôt, 157 rue Bercy 75012 Paris, 75012 Paris, France
|
||||||
Coffee Chope, 344Vrue Vaugirard, 75015 Paris, France
|
Coffee Chope, 344Vrue Vaugirard, 75015 Paris, France
|
||||||
Le Comptoir, 354 bis rue Vaugirard, 75015 Paris, France
|
|
||||||
L'empreinte, 54, avenue Daumesnil, 75012 Paris, France
|
|
||||||
Café Victor, 10 boulevard Victor, 75015 Paris, France
|
|
||||||
Café Varenne, 36 rue de Varenne, 75007 Paris, France
|
|
||||||
Le Brigadier, 12 rue Blanche, 75009 Paris, France
|
|
||||||
Melting Pot, 3 rue de Lagny, 75020 Paris, France
|
|
||||||
L'Entracte, place de l'opera, 75002 Paris, France
|
|
||||||
le Zango, 58 rue Daguerre, 75014 Paris, France
|
|
||||||
Panem, 18 rue de Crussol, 75011 Paris, France
|
|
||||||
Waikiki, 10 rue d"Ulm, 75005 Paris, France
|
|
||||||
l'Eléphant du nil, 125 Rue Saint-Antoine, 75004 Paris, France
|
l'Eléphant du nil, 125 Rue Saint-Antoine, 75004 Paris, France
|
||||||
Le Parc Vaugirard, 358 rue de Vaugirard, 75015 Paris, France
|
Le Parc Vaugirard, 358 rue de Vaugirard, 75015 Paris, France
|
||||||
Pari's Café, 174 avenue de Clichy, 75017 Paris, France
|
Pari's Café, 174 avenue de Clichy, 75017 Paris, France
|
||||||
|
Le Comptoir, 354 bis rue Vaugirard, 75015 Paris, France
|
||||||
|
Café Varenne, 36 rue de Varenne, 75007 Paris, France
|
||||||
|
Melting Pot, 3 rue de Lagny, 75020 Paris, France
|
||||||
|
le Zango, 58 rue Daguerre, 75014 Paris, France
|
||||||
|
Chez Miamophile, 6 rue Mélingue, 75019 Paris, France
|
||||||
|
Institut des Cultures d'Islam, 19-23 rue Léon, 75018 Paris, France
|
||||||
|
Canopy Café associatif, 19 rue Pajol, 75018 Paris, France
|
||||||
|
Café rallye tournelles, 11 Quai de la Tournelle, 75005 Paris, France
|
||||||
|
Petits Freres des Pauvres, 47 rue de Batignolles, 75017 Paris, France
|
||||||
Brasserie le Morvan, 61 rue du château d'eau, 75010 Paris, France
|
Brasserie le Morvan, 61 rue du château d'eau, 75010 Paris, France
|
||||||
|
L'Angle, 28 rue de Ponthieu, 75008 Paris, France
|
||||||
|
Café Dupont, 198 rue de la Convention, 75015 Paris, France
|
||||||
|
L'Entracte, place de l'opera, 75002 Paris, France
|
||||||
|
Panem, 18 rue de Crussol, 75011 Paris, France
|
||||||
Au pays de Vannes, 34 bis rue de Wattignies, 75012 Paris, France
|
Au pays de Vannes, 34 bis rue de Wattignies, 75012 Paris, France
|
||||||
Le Lucernaire, 53 rue Notre-Dame des Champs, 75006 Paris, France
|
Le Lucernaire, 53 rue Notre-Dame des Champs, 75006 Paris, France
|
||||||
L'Angle, 28 rue de Ponthieu, 75008 Paris, France
|
|
||||||
Le Café d'avant, 35 rue Claude Bernard, 75005 Paris, France
|
Le Café d'avant, 35 rue Claude Bernard, 75005 Paris, France
|
||||||
Café Dupont, 198 rue de la Convention, 75015 Paris, France
|
|
||||||
L'âge d'or, 26 rue du Docteur Magnan, 75013 Paris, France
|
L'âge d'or, 26 rue du Docteur Magnan, 75013 Paris, France
|
||||||
Le Sévigné, 15 rue du Parc Royal, 75003 Paris, France
|
Le Sévigné, 15 rue du Parc Royal, 75003 Paris, France
|
||||||
L'horizon, 93, rue de la Roquette, 75011 Paris, France
|
L'horizon, 93, rue de la Roquette, 75011 Paris, France
|
||||||
|
L'empreinte, 54, avenue Daumesnil, 75012 Paris, France
|
||||||
|
Café Victor, 10 boulevard Victor, 75015 Paris, France
|
||||||
|
Le Brigadier, 12 rue Blanche, 75009 Paris, France
|
||||||
|
Waikiki, 10 rue d"Ulm, 75005 Paris, France
|
||||||
@ -2,8 +2,8 @@ import bonobo
|
|||||||
from bonobo.commands.run import get_default_services
|
from bonobo.commands.run import get_default_services
|
||||||
|
|
||||||
graph = bonobo.Graph(
|
graph = bonobo.Graph(
|
||||||
bonobo.CsvReader('datasets/coffeeshops.txt'),
|
bonobo.CsvReader('datasets/coffeeshops.txt', headers=('item', )),
|
||||||
print,
|
bonobo.PrettyPrinter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@ -1,15 +1,16 @@
|
|||||||
import bonobo
|
import bonobo
|
||||||
|
from bonobo import Bag
|
||||||
from bonobo.commands.run import get_default_services
|
from bonobo.commands.run import get_default_services
|
||||||
|
|
||||||
|
|
||||||
def get_fields(row):
|
def get_fields(**row):
|
||||||
return row['fields']
|
return Bag(**row['fields'])
|
||||||
|
|
||||||
|
|
||||||
graph = bonobo.Graph(
|
graph = bonobo.Graph(
|
||||||
bonobo.JsonReader('datasets/theaters.json'),
|
bonobo.JsonReader('datasets/theaters.json'),
|
||||||
get_fields,
|
get_fields,
|
||||||
bonobo.PrettyPrint(title_keys=('eq_nom_equipement', )),
|
bonobo.PrettyPrinter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@ -1,10 +1,38 @@
|
|||||||
|
'''
|
||||||
|
This example shows how a different file system service can be injected
|
||||||
|
into a transformation (as compressing pickled objects often makes sense
|
||||||
|
anyways). The pickle itself contains a list of lists as follows:
|
||||||
|
|
||||||
|
```
|
||||||
|
[
|
||||||
|
['category', 'sms'],
|
||||||
|
['ham', 'Go until jurong point, crazy..'],
|
||||||
|
['ham', 'Ok lar... Joking wif u oni...'],
|
||||||
|
['spam', 'Free entry in 2 a wkly comp to win...'],
|
||||||
|
['ham', 'U dun say so early hor... U c already then say...'],
|
||||||
|
['ham', 'Nah I don't think he goes to usf, he lives around here though'],
|
||||||
|
['spam', 'FreeMsg Hey there darling it's been 3 week's now...'],
|
||||||
|
...
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
where the first column categorizes and sms as "ham" or "spam". The second
|
||||||
|
column contains the sms itself.
|
||||||
|
|
||||||
|
Data set taken from:
|
||||||
|
https://www.kaggle.com/uciml/sms-spam-collection-dataset/downloads/sms-spam-collection-dataset.zip
|
||||||
|
|
||||||
|
The transformation (1) reads the pickled data, (2) marks and shortens
|
||||||
|
messages categorized as spam, and (3) prints the output.
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
import bonobo
|
import bonobo
|
||||||
|
from bonobo.commands.run import get_default_services
|
||||||
from fs.tarfs import TarFS
|
from fs.tarfs import TarFS
|
||||||
import os
|
|
||||||
|
|
||||||
|
|
||||||
def cleanse_sms(row):
|
def cleanse_sms(**row):
|
||||||
|
|
||||||
if row['category'] == 'spam':
|
if row['category'] == 'spam':
|
||||||
row['sms_clean'] = '**MARKED AS SPAM** ' + row['sms'][0:50] + (
|
row['sms_clean'] = '**MARKED AS SPAM** ' + row['sms'][0:50] + (
|
||||||
'...' if len(row['sms']) > 50 else ''
|
'...' if len(row['sms']) > 50 else ''
|
||||||
@ -16,46 +44,16 @@ def cleanse_sms(row):
|
|||||||
|
|
||||||
|
|
||||||
graph = bonobo.Graph(
|
graph = bonobo.Graph(
|
||||||
bonobo.PickleReader('spam.pkl'
|
# spam.pkl is within the gzipped tarball
|
||||||
), # spam.pkl is within the gzipped tarball
|
bonobo.PickleReader('spam.pkl'),
|
||||||
cleanse_sms,
|
cleanse_sms,
|
||||||
print
|
bonobo.PrettyPrinter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_services():
|
||||||
|
return {'fs': TarFS(bonobo.get_examples_path('datasets/spam.tgz'))}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
'''
|
bonobo.run(graph, services=get_default_services(__file__))
|
||||||
This example shows how a different file system service can be injected
|
|
||||||
into a transformation (as compressing pickled objects often makes sense
|
|
||||||
anyways). The pickle itself contains a list of lists as follows:
|
|
||||||
|
|
||||||
```
|
|
||||||
[
|
|
||||||
['category', 'sms'],
|
|
||||||
['ham', 'Go until jurong point, crazy..'],
|
|
||||||
['ham', 'Ok lar... Joking wif u oni...'],
|
|
||||||
['spam', 'Free entry in 2 a wkly comp to win...'],
|
|
||||||
['ham', 'U dun say so early hor... U c already then say...'],
|
|
||||||
['ham', 'Nah I don't think he goes to usf, he lives around here though'],
|
|
||||||
['spam', 'FreeMsg Hey there darling it's been 3 week's now...'],
|
|
||||||
...
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
where the first column categorizes and sms as "ham" or "spam". The second
|
|
||||||
column contains the sms itself.
|
|
||||||
|
|
||||||
Data set taken from:
|
|
||||||
https://www.kaggle.com/uciml/sms-spam-collection-dataset/downloads/sms-spam-collection-dataset.zip
|
|
||||||
|
|
||||||
The transformation (1) reads the pickled data, (2) marks and shortens
|
|
||||||
messages categorized as spam, and (3) prints the output.
|
|
||||||
'''
|
|
||||||
|
|
||||||
services = {
|
|
||||||
'fs':
|
|
||||||
TarFS(
|
|
||||||
os.path.
|
|
||||||
join(bonobo.get_examples_path(), 'datasets', 'spam.tgz')
|
|
||||||
)
|
|
||||||
}
|
|
||||||
bonobo.run(graph, services=services)
|
|
||||||
|
|||||||
@ -1,7 +1,11 @@
|
|||||||
import bonobo
|
import bonobo
|
||||||
|
|
||||||
graph = bonobo.Graph(
|
graph = bonobo.Graph(
|
||||||
['foo', 'bar', 'baz', ],
|
[
|
||||||
|
'foo',
|
||||||
|
'bar',
|
||||||
|
'baz',
|
||||||
|
],
|
||||||
str.upper,
|
str.upper,
|
||||||
print,
|
print,
|
||||||
)
|
)
|
||||||
|
|||||||
@ -3,10 +3,8 @@ import csv
|
|||||||
from bonobo.config import Option
|
from bonobo.config import Option
|
||||||
from bonobo.config.processors import ContextProcessor
|
from bonobo.config.processors import ContextProcessor
|
||||||
from bonobo.constants import NOT_MODIFIED
|
from bonobo.constants import NOT_MODIFIED
|
||||||
from bonobo.errors import ConfigurationError, ValidationError
|
from bonobo.nodes.io.file import FileHandler, FileReader, FileWriter
|
||||||
from bonobo.structs import Bag
|
|
||||||
from bonobo.util.objects import ValueHolder
|
from bonobo.util.objects import ValueHolder
|
||||||
from .file import FileHandler, FileReader, FileWriter
|
|
||||||
|
|
||||||
|
|
||||||
class CsvHandler(FileHandler):
|
class CsvHandler(FileHandler):
|
||||||
@ -30,14 +28,6 @@ class CsvHandler(FileHandler):
|
|||||||
headers = Option(tuple)
|
headers = Option(tuple)
|
||||||
|
|
||||||
|
|
||||||
def validate_csv_output_format(v):
|
|
||||||
if callable(v):
|
|
||||||
return v
|
|
||||||
if v in {'dict', 'kwargs'}:
|
|
||||||
return v
|
|
||||||
raise ValidationError('Unsupported format {!r}.'.format(v))
|
|
||||||
|
|
||||||
|
|
||||||
class CsvReader(CsvHandler, FileReader):
|
class CsvReader(CsvHandler, FileReader):
|
||||||
"""
|
"""
|
||||||
Reads a CSV and yield the values as dicts.
|
Reads a CSV and yield the values as dicts.
|
||||||
@ -49,26 +39,17 @@ class CsvReader(CsvHandler, FileReader):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
skip = Option(int, default=0)
|
skip = Option(int, default=0)
|
||||||
output_format = Option(validate_csv_output_format, default='dict')
|
|
||||||
|
|
||||||
@ContextProcessor
|
@ContextProcessor
|
||||||
def csv_headers(self, context, fs, file):
|
def csv_headers(self, context, fs, file):
|
||||||
yield ValueHolder(self.headers)
|
yield ValueHolder(self.headers)
|
||||||
|
|
||||||
def get_output_formater(self):
|
|
||||||
if callable(self.output_format):
|
|
||||||
return self.output_format
|
|
||||||
elif isinstance(self.output_format, str):
|
|
||||||
return getattr(self, '_format_as_' + self.output_format)
|
|
||||||
else:
|
|
||||||
raise ConfigurationError('Unsupported format {!r} for {}.'.format(self.output_format, type(self).__name__))
|
|
||||||
|
|
||||||
def read(self, fs, file, headers):
|
def read(self, fs, file, headers):
|
||||||
reader = csv.reader(file, delimiter=self.delimiter, quotechar=self.quotechar)
|
reader = csv.reader(file, delimiter=self.delimiter, quotechar=self.quotechar)
|
||||||
formater = self.get_output_formater()
|
|
||||||
|
|
||||||
if not headers.get():
|
if not headers.get():
|
||||||
headers.set(next(reader))
|
headers.set(next(reader))
|
||||||
|
_headers = headers.get()
|
||||||
|
|
||||||
field_count = len(headers)
|
field_count = len(headers)
|
||||||
|
|
||||||
@ -80,13 +61,7 @@ class CsvReader(CsvHandler, FileReader):
|
|||||||
if len(row) != field_count:
|
if len(row) != field_count:
|
||||||
raise ValueError('Got a line with %d fields, expecting %d.' % (len(row), field_count, ))
|
raise ValueError('Got a line with %d fields, expecting %d.' % (len(row), field_count, ))
|
||||||
|
|
||||||
yield formater(headers.get(), row)
|
yield self.get_output(dict(zip(_headers, row)))
|
||||||
|
|
||||||
def _format_as_dict(self, headers, values):
|
|
||||||
return dict(zip(headers, values))
|
|
||||||
|
|
||||||
def _format_as_kwargs(self, headers, values):
|
|
||||||
return Bag(**dict(zip(headers, values)))
|
|
||||||
|
|
||||||
|
|
||||||
class CsvWriter(CsvHandler, FileWriter):
|
class CsvWriter(CsvHandler, FileWriter):
|
||||||
@ -96,7 +71,8 @@ class CsvWriter(CsvHandler, FileWriter):
|
|||||||
headers = ValueHolder(list(self.headers) if self.headers else None)
|
headers = ValueHolder(list(self.headers) if self.headers else None)
|
||||||
yield writer, headers
|
yield writer, headers
|
||||||
|
|
||||||
def write(self, fs, file, lineno, writer, headers, row):
|
def write(self, fs, file, lineno, writer, headers, *args, **kwargs):
|
||||||
|
row = self.get_input(*args, **kwargs)
|
||||||
if not lineno:
|
if not lineno:
|
||||||
headers.set(headers.value or row.keys())
|
headers.set(headers.value or row.keys())
|
||||||
writer.writerow(headers.get())
|
writer.writerow(headers.get())
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
|
from bonobo import settings
|
||||||
from bonobo.config import Option, Service
|
from bonobo.config import Option, Service
|
||||||
from bonobo.config.configurables import Configurable
|
from bonobo.config.configurables import Configurable
|
||||||
from bonobo.config.processors import ContextProcessor
|
from bonobo.config.processors import ContextProcessor
|
||||||
from bonobo.constants import NOT_MODIFIED
|
from bonobo.constants import NOT_MODIFIED
|
||||||
|
from bonobo.structs.bags import Bag
|
||||||
from bonobo.util.objects import ValueHolder
|
from bonobo.util.objects import ValueHolder
|
||||||
|
|
||||||
|
|
||||||
@ -19,8 +21,8 @@ class FileHandler(Configurable):
|
|||||||
eol = Option(str, default='\n') # type: str
|
eol = Option(str, default='\n') # type: str
|
||||||
mode = Option(str) # type: str
|
mode = Option(str) # type: str
|
||||||
encoding = Option(str, default='utf-8') # type: str
|
encoding = Option(str, default='utf-8') # type: str
|
||||||
|
|
||||||
fs = Service('fs') # type: str
|
fs = Service('fs') # type: str
|
||||||
|
ioformat = Option(default=settings.IOFORMAT.get)
|
||||||
|
|
||||||
@ContextProcessor
|
@ContextProcessor
|
||||||
def file(self, context, fs):
|
def file(self, context, fs):
|
||||||
@ -30,15 +32,35 @@ class FileHandler(Configurable):
|
|||||||
def open(self, fs):
|
def open(self, fs):
|
||||||
return fs.open(self.path, self.mode, encoding=self.encoding)
|
return fs.open(self.path, self.mode, encoding=self.encoding)
|
||||||
|
|
||||||
|
def get_input(self, *args, **kwargs):
|
||||||
|
if self.ioformat == settings.IOFORMAT_ARG0:
|
||||||
|
assert len(args) == 1 and not len(kwargs), 'ARG0 format implies one arg and no kwargs.'
|
||||||
|
return args[0]
|
||||||
|
|
||||||
|
if self.ioformat == settings.IOFORMAT_KWARGS:
|
||||||
|
assert len(args) == 0 and len(kwargs), 'KWARGS format implies no arg.'
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
raise NotImplementedError('Unsupported format.')
|
||||||
|
|
||||||
|
def get_output(self, row):
|
||||||
|
if self.ioformat == settings.IOFORMAT_ARG0:
|
||||||
|
return row
|
||||||
|
|
||||||
|
if self.ioformat == settings.IOFORMAT_KWARGS:
|
||||||
|
return Bag(**row)
|
||||||
|
|
||||||
|
raise NotImplementedError('Unsupported format.')
|
||||||
|
|
||||||
|
|
||||||
class Reader(FileHandler):
|
class Reader(FileHandler):
|
||||||
"""Abstract component factory for readers.
|
"""Abstract component factory for readers.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __call__(self, *args):
|
def __call__(self, *args, **kwargs):
|
||||||
yield from self.read(*args)
|
yield from self.read(*args, **kwargs)
|
||||||
|
|
||||||
def read(self, *args):
|
def read(self, *args, **kwargs):
|
||||||
raise NotImplementedError('Abstract.')
|
raise NotImplementedError('Abstract.')
|
||||||
|
|
||||||
|
|
||||||
@ -46,10 +68,10 @@ class Writer(FileHandler):
|
|||||||
"""Abstract component factory for writers.
|
"""Abstract component factory for writers.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __call__(self, *args):
|
def __call__(self, *args, **kwargs):
|
||||||
return self.write(*args)
|
return self.write(*args)
|
||||||
|
|
||||||
def write(self, *args):
|
def write(self, *args, **kwargs):
|
||||||
raise NotImplementedError('Abstract.')
|
raise NotImplementedError('Abstract.')
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
from bonobo.config.processors import ContextProcessor
|
from bonobo.config.processors import ContextProcessor
|
||||||
from .file import FileWriter, FileReader
|
from bonobo.nodes.io.file import FileWriter, FileReader
|
||||||
|
|
||||||
|
|
||||||
class JsonHandler():
|
class JsonHandler():
|
||||||
@ -14,7 +14,7 @@ class JsonReader(JsonHandler, FileReader):
|
|||||||
|
|
||||||
def read(self, fs, file):
|
def read(self, fs, file):
|
||||||
for line in self.loader(file):
|
for line in self.loader(file):
|
||||||
yield line
|
yield self.get_output(line)
|
||||||
|
|
||||||
|
|
||||||
class JsonWriter(JsonHandler, FileWriter):
|
class JsonWriter(JsonHandler, FileWriter):
|
||||||
|
|||||||
@ -53,7 +53,7 @@ class PickleReader(PickleHandler, FileReader):
|
|||||||
if len(i) != item_count:
|
if len(i) != item_count:
|
||||||
raise ValueError('Received an object with %d items, expecting %d.' % (len(i), item_count, ))
|
raise ValueError('Received an object with %d items, expecting %d.' % (len(i), item_count, ))
|
||||||
|
|
||||||
yield dict(zip(i)) if is_dict else dict(zip(pickle_headers.value, i))
|
yield self.get_output(dict(zip(i)) if is_dict else dict(zip(pickle_headers.value, i)))
|
||||||
|
|
||||||
|
|
||||||
class PickleWriter(PickleHandler, FileWriter):
|
class PickleWriter(PickleHandler, FileWriter):
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
||||||
import logging
|
from bonobo.errors import ValidationError
|
||||||
|
|
||||||
|
|
||||||
def to_bool(s):
|
def to_bool(s):
|
||||||
@ -11,6 +12,36 @@ def to_bool(s):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
class Setting:
|
||||||
|
def __init__(self, name, default=None, validator=None):
|
||||||
|
self.name = name
|
||||||
|
|
||||||
|
if default:
|
||||||
|
self.default = default if callable(default) else lambda: default
|
||||||
|
else:
|
||||||
|
self.default = lambda: None
|
||||||
|
|
||||||
|
if validator:
|
||||||
|
self.validator = validator
|
||||||
|
else:
|
||||||
|
self.validator = None
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return '<Setting {}={!r}>'.format(self.name, self.value)
|
||||||
|
|
||||||
|
def set(self, value):
|
||||||
|
if self.validator and not self.validator(value):
|
||||||
|
raise ValidationError('Invalid value {!r} for setting {}.'.format(value, self.name))
|
||||||
|
self.value = value
|
||||||
|
|
||||||
|
def get(self):
|
||||||
|
try:
|
||||||
|
return self.value
|
||||||
|
except AttributeError:
|
||||||
|
self.value = self.default()
|
||||||
|
return self.value
|
||||||
|
|
||||||
|
|
||||||
# Debug/verbose mode.
|
# Debug/verbose mode.
|
||||||
DEBUG = to_bool(os.environ.get('DEBUG', 'f'))
|
DEBUG = to_bool(os.environ.get('DEBUG', 'f'))
|
||||||
|
|
||||||
@ -23,6 +54,17 @@ QUIET = to_bool(os.environ.get('QUIET', 'f'))
|
|||||||
# Logging level.
|
# Logging level.
|
||||||
LOGGING_LEVEL = logging.DEBUG if DEBUG else logging.INFO
|
LOGGING_LEVEL = logging.DEBUG if DEBUG else logging.INFO
|
||||||
|
|
||||||
|
# Input/Output format for transformations
|
||||||
|
IOFORMAT_ARG0 = 'arg0'
|
||||||
|
IOFORMAT_KWARGS = 'kwargs'
|
||||||
|
|
||||||
|
IOFORMATS = {
|
||||||
|
IOFORMAT_ARG0,
|
||||||
|
IOFORMAT_KWARGS,
|
||||||
|
}
|
||||||
|
|
||||||
|
IOFORMAT = Setting('IOFORMAT', default=IOFORMAT_KWARGS, validator=IOFORMATS.__contains__)
|
||||||
|
|
||||||
|
|
||||||
def check():
|
def check():
|
||||||
if DEBUG and QUIET:
|
if DEBUG and QUIET:
|
||||||
|
|||||||
@ -21,7 +21,7 @@ def force_iterator(mixed):
|
|||||||
def ensure_tuple(tuple_or_mixed):
|
def ensure_tuple(tuple_or_mixed):
|
||||||
if isinstance(tuple_or_mixed, tuple):
|
if isinstance(tuple_or_mixed, tuple):
|
||||||
return tuple_or_mixed
|
return tuple_or_mixed
|
||||||
return (tuple_or_mixed,)
|
return (tuple_or_mixed, )
|
||||||
|
|
||||||
|
|
||||||
def tuplize(generator):
|
def tuplize(generator):
|
||||||
|
|||||||
@ -4,11 +4,5 @@ Bonobo with Docker
|
|||||||
.. todo:: The `bonobo-docker` package is at a very alpha stage, and things will change. This section is here to give a
|
.. todo:: The `bonobo-docker` package is at a very alpha stage, and things will change. This section is here to give a
|
||||||
brief overview but is neither complete nor definitive.
|
brief overview but is neither complete nor definitive.
|
||||||
|
|
||||||
Installation
|
Read the introduction: https://www.bonobo-project.org/with/docker
|
||||||
::::::::::::
|
|
||||||
|
|
||||||
Overview
|
|
||||||
::::::::
|
|
||||||
|
|
||||||
Details
|
|
||||||
:::::::
|
|
||||||
|
|||||||
@ -26,6 +26,8 @@ that did not block you but can be a no-go for others, please consider contributi
|
|||||||
|
|
||||||
tut01
|
tut01
|
||||||
tut02
|
tut02
|
||||||
|
tut03
|
||||||
|
tut04
|
||||||
|
|
||||||
|
|
||||||
What's next?
|
What's next?
|
||||||
|
|||||||
@ -1,7 +1,12 @@
|
|||||||
Configurables and Services
|
Configurables and Services
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
TODO
|
This document does not exist yet, but will be available soon.
|
||||||
|
|
||||||
|
Meanwhile, you can read the matching references:
|
||||||
|
|
||||||
|
* :doc:`/guide/services`
|
||||||
|
* :doc:`/reference/api_config`
|
||||||
|
|
||||||
Next
|
Next
|
||||||
::::
|
::::
|
||||||
|
|||||||
@ -1,4 +1,8 @@
|
|||||||
Working with databases
|
Working with databases
|
||||||
======================
|
======================
|
||||||
|
|
||||||
TODO
|
This document does not exist yet, but will be available soon.
|
||||||
|
|
||||||
|
Meanwhile, you can jump to bonobo-sqlalchemy development repository:
|
||||||
|
|
||||||
|
* https://github.com/hartym/bonobo-sqlalchemy
|
||||||
|
|||||||
@ -4,7 +4,7 @@ arrow==0.10.0
|
|||||||
babel==2.4.0
|
babel==2.4.0
|
||||||
binaryornot==0.4.3
|
binaryornot==0.4.3
|
||||||
certifi==2017.4.17
|
certifi==2017.4.17
|
||||||
chardet==3.0.3
|
chardet==3.0.4
|
||||||
click==6.7
|
click==6.7
|
||||||
cookiecutter==1.5.1
|
cookiecutter==1.5.1
|
||||||
coverage==4.4.1
|
coverage==4.4.1
|
||||||
@ -19,6 +19,7 @@ poyo==0.4.1
|
|||||||
py==1.4.34
|
py==1.4.34
|
||||||
pygments==2.2.0
|
pygments==2.2.0
|
||||||
pytest-cov==2.5.1
|
pytest-cov==2.5.1
|
||||||
|
pytest-sugar==0.8.0
|
||||||
pytest-timeout==1.2.0
|
pytest-timeout==1.2.0
|
||||||
pytest==3.1.1
|
pytest==3.1.1
|
||||||
python-dateutil==2.6.0
|
python-dateutil==2.6.0
|
||||||
@ -28,5 +29,6 @@ six==1.10.0
|
|||||||
snowballstemmer==1.2.1
|
snowballstemmer==1.2.1
|
||||||
sphinx==1.6.2
|
sphinx==1.6.2
|
||||||
sphinxcontrib-websupport==1.0.1
|
sphinxcontrib-websupport==1.0.1
|
||||||
|
termcolor==1.1.0
|
||||||
urllib3==1.21.1
|
urllib3==1.21.1
|
||||||
whichcraft==0.4.1
|
whichcraft==0.4.1
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
-e .[docker]
|
-e .[docker]
|
||||||
appdirs==1.4.3
|
appdirs==1.4.3
|
||||||
bonobo-docker==0.2.4
|
bonobo-docker==0.2.5
|
||||||
bonobo==0.3.1
|
bonobo==0.3.1
|
||||||
certifi==2017.4.17
|
certifi==2017.4.17
|
||||||
chardet==3.0.3
|
chardet==3.0.4
|
||||||
colorama==0.3.9
|
colorama==0.3.9
|
||||||
docker-pycreds==0.2.1
|
docker-pycreds==0.2.1
|
||||||
docker==2.3.0
|
docker==2.3.0
|
||||||
@ -17,6 +17,6 @@ pyparsing==2.2.0
|
|||||||
pytz==2017.2
|
pytz==2017.2
|
||||||
requests==2.17.3
|
requests==2.17.3
|
||||||
six==1.10.0
|
six==1.10.0
|
||||||
stevedore==1.22.0
|
stevedore==1.23.0
|
||||||
urllib3==1.21.1
|
urllib3==1.21.1
|
||||||
websocket-client==0.40.0
|
websocket-client==0.40.0
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
appnope==0.1.0
|
appnope==0.1.0
|
||||||
bleach==2.0.0
|
bleach==2.0.0
|
||||||
decorator==4.0.11
|
decorator==4.0.11
|
||||||
entrypoints==0.2.2
|
entrypoints==0.2.3
|
||||||
html5lib==0.999999999
|
html5lib==0.999999999
|
||||||
ipykernel==4.6.1
|
ipykernel==4.6.1
|
||||||
ipython-genutils==0.2.0
|
ipython-genutils==0.2.0
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
-e .
|
-e .
|
||||||
appdirs==1.4.3
|
appdirs==1.4.3
|
||||||
certifi==2017.4.17
|
certifi==2017.4.17
|
||||||
chardet==3.0.3
|
chardet==3.0.4
|
||||||
colorama==0.3.9
|
colorama==0.3.9
|
||||||
enum34==1.1.6
|
enum34==1.1.6
|
||||||
fs==2.0.3
|
fs==2.0.3
|
||||||
@ -13,5 +13,5 @@ pyparsing==2.2.0
|
|||||||
pytz==2017.2
|
pytz==2017.2
|
||||||
requests==2.17.3
|
requests==2.17.3
|
||||||
six==1.10.0
|
six==1.10.0
|
||||||
stevedore==1.22.0
|
stevedore==1.23.0
|
||||||
urllib3==1.21.1
|
urllib3==1.21.1
|
||||||
|
|||||||
3
setup.py
3
setup.py
@ -59,7 +59,8 @@ setup(
|
|||||||
extras_require={
|
extras_require={
|
||||||
'dev': [
|
'dev': [
|
||||||
'cookiecutter (>= 1.5, < 1.6)', 'coverage (>= 4.4, < 5.0)', 'pytest (>= 3.1, < 4.0)',
|
'cookiecutter (>= 1.5, < 1.6)', 'coverage (>= 4.4, < 5.0)', 'pytest (>= 3.1, < 4.0)',
|
||||||
'pytest-cov (>= 2.5, < 3.0)', 'pytest-timeout (>= 1, < 2)', 'sphinx (>= 1.6, < 2.0)'
|
'pytest-cov (>= 2.5, < 3.0)', 'pytest-sugar (>= 0.8, < 0.9)', 'pytest-timeout (>= 1, < 2)',
|
||||||
|
'sphinx (>= 1.6, < 2.0)'
|
||||||
],
|
],
|
||||||
'docker': ['bonobo-docker'],
|
'docker': ['bonobo-docker'],
|
||||||
'jupyter': ['ipywidgets (>= 6.0.0, < 7)', 'jupyter (>= 1.0, < 1.1)']
|
'jupyter': ['ipywidgets (>= 6.0.0, < 7)', 'jupyter (>= 1.0, < 1.1)']
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from bonobo import Bag, CsvReader, CsvWriter, open_fs
|
from bonobo import Bag, CsvReader, CsvWriter, open_fs, settings
|
||||||
from bonobo.constants import BEGIN, END
|
from bonobo.constants import BEGIN, END
|
||||||
from bonobo.execution.node import NodeExecutionContext
|
from bonobo.execution.node import NodeExecutionContext
|
||||||
from bonobo.util.testing import CapturingNodeExecutionContext
|
from bonobo.util.testing import CapturingNodeExecutionContext
|
||||||
@ -9,7 +9,7 @@ from bonobo.util.testing import CapturingNodeExecutionContext
|
|||||||
def test_write_csv_to_file(tmpdir):
|
def test_write_csv_to_file(tmpdir):
|
||||||
fs, filename = open_fs(tmpdir), 'output.csv'
|
fs, filename = open_fs(tmpdir), 'output.csv'
|
||||||
|
|
||||||
writer = CsvWriter(path=filename)
|
writer = CsvWriter(path=filename, ioformat=settings.IOFORMAT_ARG0)
|
||||||
context = NodeExecutionContext(writer, services={'fs': fs})
|
context = NodeExecutionContext(writer, services={'fs': fs})
|
||||||
|
|
||||||
context.write(BEGIN, Bag({'foo': 'bar'}), Bag({'foo': 'baz', 'ignore': 'this'}), END)
|
context.write(BEGIN, Bag({'foo': 'bar'}), Bag({'foo': 'baz', 'ignore': 'this'}), END)
|
||||||
@ -19,7 +19,7 @@ def test_write_csv_to_file(tmpdir):
|
|||||||
context.step()
|
context.step()
|
||||||
context.stop()
|
context.stop()
|
||||||
|
|
||||||
with fs.open(filename)as fp:
|
with fs.open(filename) as fp:
|
||||||
assert fp.read() == 'foo\nbar\nbaz\n'
|
assert fp.read() == 'foo\nbar\nbaz\n'
|
||||||
|
|
||||||
with pytest.raises(AttributeError):
|
with pytest.raises(AttributeError):
|
||||||
@ -31,7 +31,7 @@ def test_read_csv_from_file(tmpdir):
|
|||||||
with fs.open(filename, 'w') as fp:
|
with fs.open(filename, 'w') as fp:
|
||||||
fp.write('a,b,c\na foo,b foo,c foo\na bar,b bar,c bar')
|
fp.write('a,b,c\na foo,b foo,c foo\na bar,b bar,c bar')
|
||||||
|
|
||||||
reader = CsvReader(path=filename, delimiter=',')
|
reader = CsvReader(path=filename, delimiter=',', ioformat=settings.IOFORMAT_ARG0)
|
||||||
|
|
||||||
context = CapturingNodeExecutionContext(reader, services={'fs': fs})
|
context = CapturingNodeExecutionContext(reader, services={'fs': fs})
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ def test_read_csv_kwargs_output_formater(tmpdir):
|
|||||||
with fs.open(filename, 'w') as fp:
|
with fs.open(filename, 'w') as fp:
|
||||||
fp.write('a,b,c\na foo,b foo,c foo\na bar,b bar,c bar')
|
fp.write('a,b,c\na foo,b foo,c foo\na bar,b bar,c bar')
|
||||||
|
|
||||||
reader = CsvReader(path=filename, delimiter=',', output_format='kwargs')
|
reader = CsvReader(path=filename, delimiter=',')
|
||||||
|
|
||||||
context = CapturingNodeExecutionContext(reader, services={'fs': fs})
|
context = CapturingNodeExecutionContext(reader, services={'fs': fs})
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from bonobo import Bag, JsonReader, JsonWriter, open_fs
|
from bonobo import Bag, JsonReader, JsonWriter, open_fs, settings
|
||||||
from bonobo.constants import BEGIN, END
|
from bonobo.constants import BEGIN, END
|
||||||
from bonobo.execution.node import NodeExecutionContext
|
from bonobo.execution.node import NodeExecutionContext
|
||||||
from bonobo.util.testing import CapturingNodeExecutionContext
|
from bonobo.util.testing import CapturingNodeExecutionContext
|
||||||
@ -9,7 +9,7 @@ from bonobo.util.testing import CapturingNodeExecutionContext
|
|||||||
def test_write_json_to_file(tmpdir):
|
def test_write_json_to_file(tmpdir):
|
||||||
fs, filename = open_fs(tmpdir), 'output.json'
|
fs, filename = open_fs(tmpdir), 'output.json'
|
||||||
|
|
||||||
writer = JsonWriter(path=filename)
|
writer = JsonWriter(filename, ioformat=settings.IOFORMAT_ARG0)
|
||||||
context = NodeExecutionContext(writer, services={'fs': fs})
|
context = NodeExecutionContext(writer, services={'fs': fs})
|
||||||
|
|
||||||
context.start()
|
context.start()
|
||||||
@ -31,7 +31,7 @@ def test_read_json_from_file(tmpdir):
|
|||||||
fs, filename = open_fs(tmpdir), 'input.json'
|
fs, filename = open_fs(tmpdir), 'input.json'
|
||||||
with fs.open(filename, 'w') as fp:
|
with fs.open(filename, 'w') as fp:
|
||||||
fp.write('[{"x": "foo"},{"x": "bar"}]')
|
fp.write('[{"x": "foo"},{"x": "bar"}]')
|
||||||
reader = JsonReader(path=filename)
|
reader = JsonReader(filename, ioformat=settings.IOFORMAT_ARG0)
|
||||||
|
|
||||||
context = CapturingNodeExecutionContext(reader, services={'fs': fs})
|
context = CapturingNodeExecutionContext(reader, services={'fs': fs})
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
import pickle
|
import pickle
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from bonobo import Bag, PickleReader, PickleWriter, open_fs
|
from bonobo import Bag, PickleReader, PickleWriter, open_fs, settings
|
||||||
from bonobo.constants import BEGIN, END
|
from bonobo.constants import BEGIN, END
|
||||||
from bonobo.execution.node import NodeExecutionContext
|
from bonobo.execution.node import NodeExecutionContext
|
||||||
from bonobo.util.testing import CapturingNodeExecutionContext
|
from bonobo.util.testing import CapturingNodeExecutionContext
|
||||||
@ -10,7 +11,7 @@ from bonobo.util.testing import CapturingNodeExecutionContext
|
|||||||
def test_write_pickled_dict_to_file(tmpdir):
|
def test_write_pickled_dict_to_file(tmpdir):
|
||||||
fs, filename = open_fs(tmpdir), 'output.pkl'
|
fs, filename = open_fs(tmpdir), 'output.pkl'
|
||||||
|
|
||||||
writer = PickleWriter(path=filename)
|
writer = PickleWriter(filename, ioformat=settings.IOFORMAT_ARG0)
|
||||||
context = NodeExecutionContext(writer, services={'fs': fs})
|
context = NodeExecutionContext(writer, services={'fs': fs})
|
||||||
|
|
||||||
context.write(BEGIN, Bag({'foo': 'bar'}), Bag({'foo': 'baz', 'ignore': 'this'}), END)
|
context.write(BEGIN, Bag({'foo': 'bar'}), Bag({'foo': 'baz', 'ignore': 'this'}), END)
|
||||||
@ -32,7 +33,7 @@ def test_read_pickled_list_from_file(tmpdir):
|
|||||||
with fs.open(filename, 'wb') as fp:
|
with fs.open(filename, 'wb') as fp:
|
||||||
fp.write(pickle.dumps([['a', 'b', 'c'], ['a foo', 'b foo', 'c foo'], ['a bar', 'b bar', 'c bar']]))
|
fp.write(pickle.dumps([['a', 'b', 'c'], ['a foo', 'b foo', 'c foo'], ['a bar', 'b bar', 'c bar']]))
|
||||||
|
|
||||||
reader = PickleReader(path=filename)
|
reader = PickleReader(filename, ioformat=settings.IOFORMAT_ARG0)
|
||||||
|
|
||||||
context = CapturingNodeExecutionContext(reader, services={'fs': fs})
|
context = CapturingNodeExecutionContext(reader, services={'fs': fs})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user