Como escrevo uma regra arara para executar condicionalmente um comando

Como escrevo uma regra arara para executar condicionalmente um comando

Eu queria escrever uma arararegra que executasse condicionalmente um comando com base na existência de arquivos externos.

Aqui está um exemplo de regra que consegui fazer funcionar:

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: echo
name: echo
command: /bin/echo "-->@{getBasename(file)}<--"
arguments: []

Também posso testar condicionalmente um arquivo

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: test
name: testing
commands: 
  - <arara> /bin/echo @{ isTrue ( isFile ("./dir/file") , "TRUE" , "FALSE") }
arguments: []

Gostaria de mudar o que estou executando: ou seja, a parte "/bin/echo". Mas quando tento algo como:

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: test
name: testing
commands: 
  - <arara> @{mycommand} @{ isTrue ( isFile ("./dir/file") , "TRUE" , ".") }
arguments: 
  - identifier: mycommand
    flag: <arara> @{ isTrue ( isFile ("./dir/file") , "/bin/echo " , "/bin/ls ") }

Isso é executado sem erros, mas não faz o que eu quero.

Eu também tentei algo como:

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: test
name: testing
commands: 
  - <arara> @{mycommand} @{ isTrue ( isFile ("./dir/file") , "TRUE" , ".") }
arguments: 
  - identifier: mycommand
    flag: <arara> @{ isFile ("./dir/file") == true  ?  "/bin/echo " : "/bin/ls " }

Isso gera um erro

It appears that the 'test' task has a YAML syntax error or an
invalid field. Could you take a look at the 'test.yaml' file
located at '/Users/acellett/projects/ini/arara/rules'. I tried my
best to dump the error message, so here it is:

Problem: mapping values are not allowed here
Error found in line 12, column 60.
     ... ("./dir/file")  ?  "/bin/echo " : "/bin/ls " }
                                         ^

Meu arquivo de teste (chamado "example_01.tex") se parece com:

%  arara: test: { files: [example_01.tex] }

na linha de comando que estou emitindo

$ arara -v example_01.tex

O resultado do registro é:

01 Jan 2014 10:58:59.870 INFO  Arara - Welcome to arara!
01 Jan 2014 10:58:59.874 INFO  Arara - Processing file 'example_01.tex', please wait.
01 Jan 2014 10:58:59.875 INFO  DirectiveExtractor - Reading directives from example_01.tex.
01 Jan 2014 10:58:59.876 TRACE DirectiveExtractor - Directive found in line 1 with test: { files: [example_01.tex] }.
01 Jan 2014 10:58:59.884 INFO  DirectiveParser - Parsing directives.
01 Jan 2014 10:58:59.889 INFO  TaskDeployer - Deploying tasks into commands.
01 Jan 2014 10:58:59.889 TRACE TaskDeployer - Task 'test' found in '/Users/acellett/projects/ini/arara/rules'.
01 Jan 2014 10:58:59.933 INFO  CommandTrigger - Ready to run commands.
01 Jan 2014 10:58:59.934 INFO  CommandTrigger - Running 'testing'.
01 Jan 2014 10:58:59.934 TRACE CommandTrigger - Command:  TRUE
01 Jan 2014 10:59:00.063 TRACE CommandTrigger - Output logging:
01 Jan 2014 10:59:00.064 TRACE CommandTrigger - 
01 Jan 2014 10:59:00.064 INFO  CommandTrigger - 'testing' was successfully executed.
01 Jan 2014 10:59:00.064 INFO  CommandTrigger - All commands were successfully executed.
01 Jan 2014 10:59:00.065 INFO  Arara - Done.

embora eu não tenha muita certeza de como interpretar isso.

Então, basicamente, o que eu gostaria de saber é como escrever uma regra que seja executada de maneira diferente, dependendo da existência de algum outro arquivo.

Aliás, posso escrever:

!config
# open rule for arara
# author: AEllett
# requires arara 3.0+
identifier: test
name: testing
commands: 
  - <arara> @{ isTrue ( isFile ("./dir/file") , "/bin/echo " , "/bin/ls ") } @{ isTrue ( isFile ("./dir/file") , "TRUE" , ".") }
arguments: []

Mas eu realmente queria que os comandos fossem escolhidos através dos argumentos.

Responder1

Aparentemente, a pressão dos colegas funciona. :)Estou olhando para você, Tom.:P

Plano B, vamos ver se consigo 800 votos: Sou engenheiro de segurança no Facebook e a culpa é minha. :)

Eu provavelmente deveria me concentrar em como otimizar o código, mas como estou com pressa, não consigo pensar em uma abordagem direta agora.:)

O erro levantado é, nos bastidores , uma das advertências de uso <arara>no início de um comando: podemos salvar algumas aspas, mas podemos encontrar alguns problemas provenientes do mapeamento YAML.

O :caractere é muito usado pelo formato YAML e, portanto, sua ocorrência posteriormente na string faz com que o analisador fique confuso, daí o erro. A solução é contar com as boas e velhas cotações (simples ou duplas). Como você já tem aspas duplas, opte pelas simples:

flag: '@{ isFile ("./dir/file") == true  ?  "/bin/echo " : "/bin/ls " }'

Agora deve funcionar. Bem, tipo isso.:)

flagsó é avaliado se o argumento for apresentado na diretiva, caso contrário o argumento será resolvido para uma string vazia. Para que essa avaliação aconteça, vocêterter mycommandna directiva. Se você não fornecer, @{mycommand}ficará vazio na commandlinha principal, onde é chamado.

Se você deseja mycommandser avaliado independentemente de sua ocorrência em uma diretiva, opte defaultpor flag. Vejamos um exemplo:

- identifier: engine
  flag: <arara> @{parameters.engine}
  default: pdflatex

Digamos que eu queira ter uma regra na qual eu possa definir qual motor quero usar, então tenho um engineargumento. O primeiro caso:

% arara: foo

ararafará isso:

  1. Há uma defaultocorrência, então decida engineavaliá-la.
  2. Nenhuma engineocorrência na diretriz, mantenha as coisas como estão.

No final do dia, engineserá pdflatex. Agora vamos ver o segundo caso:

% arara: foo: { engine: xelatex }

araraagora se comporta assim:

  1. Há uma defaultocorrência, então resolva enginesua avaliação, que é pdflatex.
  2. Há uma ocorrência enginena diretiva, avalie flage substitua o valor padrão.

Agora, engineserá xelatex.:)

Com algumas pequenas edições,

!config
identifier: test
name: testing
commands: 
  - <arara> @{mycommand} @{ isTrue ( isFile ("./dir/file") , "TRUE" , ".") }
arguments: 
  - identifier: mycommand
    default: '@{ isFile ("./dir/file") == true  ?  "/bin/echo " : "/bin/ls " }'

sua regra agora funciona.:)

Espero que ajude!:)

informação relacionada