2013-06-20 24 views
5

Beh, devo ammettere che sono nuovo per fabric e anche per python ma sono interessato a farlo nel modo giusto, quindi ... Voglio decorare alcuni dei miei attività con una funzione prepare che aggiunge alcune vars a env in base a quelle già fornite. Date un'occhiata:Come aggiungere un decoratore personalizzato a un'attività fabric

from fabric.api import * 
import fabstork.project.base as base 
import fabstork.utils.drupal as utils 

def prepare(task): 
    """ Decorator to set some additional environment variables """ 
    def prepared(*args, **kwargs): 
     env.sites_folder = env.sites_folder if 'sites_folder' in env else 'default' 
     env.settings_file = "%s/www/sites/%s/settings.php" % (env.build_path, env.sites_folder) 
     # more to come 
     return task(*args, **kwargs) 

    return prepared 


@task 
@prepare 
def push(ref='HEAD'): 
    """ 
    Deploy a commit to a host 
    """ 
    base.push(ref) 
    utils.settings_php() 
    utils.link_files() 
    utils.set_perms() 

L'esempio di cui sopra non riesce per questo push non è un compito più, non è nella lista dei task disponibili quando si fa un fab --list nella riga di comando. Omettere il decoratore porta a un compito perfetto. Che cosa sto facendo di sbagliato?

risposta

8
from fabric.decorators import task 
from functools import wraps 

def custom_decorator(func): 
    @wraps(func) 
    def decorated(*args, **kwargs): 
     print "this function is decorated." 
     return func(*args, **kwargs) 
    return decorated 

@task 
@custom_decorator 
def some_function(): 
    print "this is function" 

risultato:

# fab -l 
>Available commands: 
> 
> some_function 

# fab some_function 
>this function is decorated. 
>this is function 
> 
>Done. 
+1

Grazie! Quindi ho praticamente perso ** @ wraps (func) **. Potresti aggiornare la tua risposta specificatamente? – aaki