рдореМрдЬреВрджрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдлреИрдм рдХрд╛рд░реНрдп рд╣реИрдВ - рджреВрд░рд╕реНрде рд╕рд░реНрд╡рд░ рд╕реЗ рдбрдВрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдПрдХрддреНрд░реАрдХрд░рдг, рдЖрджрд┐ред рдЖрдк рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдПрди рдорд┐рдирдЯ (рдпрд╛ рдПрдХ рдШрдВрдЯреЗ рдмрд╛рдж рднреА) рдХреЗ рдмрд╛рдж, рдЕрдЧрд▓реА рд╡рд┐рдВрдбреЛ рдореЗрдВ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рдпрд╛рдж рд░рдЦреЗрдВ, рдЬрд╛рдВрдЪреЗрдВ ... рдЕрдХреНрд╖рдо рд░реВрдк рд╕реЗред
рдореИрдВ рдЯрд╛рд╕реНрдХ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдкреЙрдк-рдЕрдк рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдпрд╣реАрдВ рдкрд░ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди
-рд╕реЗрдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрд░реНрдЯрд┐рдХрд▓ рдЖрдпрд╛ред рдореИрдВрдиреЗ рдлрд╝реИрдм-рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдпрд╣ рдЙрд╕рдХреА рдЬрдЧрд╣ рд╣реИред
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВ
from django.conf import settings as django_settings from fabric.operations import local def _notify(message): if django_settings.FAB_NOTIFY_TASK_ENDS: local(u'notify-send --expire-time=10000 "Fabric notify" "{}"'.format(message))
рд╣рд╛рдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЬрдВрдЧрд▓ рд╣реИ рдФрд░ "рд╢реЛ рд╕рдВрдХреЗрдд" рд╕реЗрдЯрд┐рдВрдЧ рд╣рдо рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗред
_Notify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рд╕рд░рд▓ рд╣реИ:
from fab_utils import _notify def mongo_get_from_remote(server='', date='', collection=''): u""" c """ ... _notify(u" ")
рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЕрдВрдд рдореЗрдВ рдХреЙрд▓ рд▓рд┐рдЦрдирд╛ ... рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ "рд╕реВрдЦрд╛" (DRY рдбреНрд░рд╛рдЗрд╡) рдирд╣реАрдВ рд╣реИред рдЪрд▓реЛ рдПрдХ рдбреЗрдХреЛрд░реЗрдЯрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
def notified(wrapped): def internal(*args, **kwargs): res = wrapped(*args, **kwargs) params = [unicode(a) for a in args] params.extend([u'{}={}'.format(k, v) for k, v in kwargs.iteritems()]) params = [_limit_str(p) for p in params] message = "{}({}) ended!!!".format(wrapped.__name__, ', '.join(params)) _notify(message) return res return internal
рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧ рд╣реИ
from fab_utils import notified @notified def mongo_get_from_remote(server='', date='', collection=''): u""" c """ ...
рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреА рдЖрдЬреНрдЮрд╛ рдкрд░ рдорджрдж :(
wad@wad-vaio:~/aggregator (develop)$ bin/fab.sh -d mongo_get_from_remote Displaying detailed information for task 'mongo_get_from_remote': No docstring provided Arguments:
рдХреНрдпрд╛ рдХрд░реЗрдВ? dockstring рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ!
def notified(wrapped): def internal(*args, **kwargs): ... return res internal.__doc__ = wrapped.__doc__ return internal
wad@wad-vaio:~/aggregator (develop!)$ bin/fab.sh -d mongo_get_from_remote Displaying detailed information for task 'mongo_get_from_remote': c Arguments:
рдкрд╣рд▓реЗ рд╕реЗ рдмреЗрд╣рддрд░, рд▓реЗрдХрд┐рди рддрд░реНрдХ рдХрд╣рд╛рдВ рд╣реИрдВ? рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдкреАрдЫреЗ рдХрдкрдбрд╝реЗ рдХреА рдЖрдВрддреЛрдВ рдореЗрдВ рдШреБрд╕рдирд╛ рдкрдбрд╝рд╛ - рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ?
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ env / рд╕реНрдерд╛рдиреАрдп / lib / python2.7 / рд╕рд╛рдЗрдЯ-рдкреИрдХреЗрдЬ / рдХрдкрдбрд╝реЗ / main.py: 466 рдкрд╛рдпрд╛ рдЧрдпрд╛
def display_command(name): """ Print command function's docstring, then exit. Invoked with -d/--display. """ ... if hasattr(command, '__details__'): task_details = command.__details__() else: task_details = get_task_details(command) ...
рд╣рд╛рдБ, рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ __details__ рд╣реИ рддреЛ рдЗрд╕реЗ рддрд░реНрдХреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛!
рдЕрдВрддрд┐рдо рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ
from fabric.tasks import get_task_details def notified(wrapped): def internal(*args, **kwargs): res = wrapped(*args, **kwargs) params = [unicode(a) for a in args] params.extend([u'{}={}'.format(k, v) for k, v in kwargs.iteritems()]) params = [_limit_str(p) for p in params] message = "{}({}) ended!!!".format(wrapped.__name__, ', '.join(params)) _notify(message) return res def _details(): return get_task_details(wrapped) internal.__doc__ = wrapped.__doc__ internal.__details__ = _details return internal
рдФрд░ рдЬрдЧрд╣ рдореЗрдВ рдлреИрдм рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдгрди
wad@wad-vaio:~/aggregator (develop!)$ bin/fab.sh -d mongo_get_from_remote Displaying detailed information for task 'mongo_get_from_remote': c Arguments: server='', date='', collection=''
рдореБрдЭреЗ рдЕрдЬрдЧрд░ рд╕реЗ рдкреНрдпрд╛рд░ рд╣реИ :)