A gem Commands
tem como objetivo disponibilizar:
- Uma classe base
Commands::Command
para comandos - Um módulo
Commands::Commander
para expor comandos como métodos de instâncias
O projeto pode ser configurado via docker. A seguir estão os passos para a configuração:
- Adicione uma chave privada do git no diretório
.docker/.ssh
para ser copiada para dentro do container
Obs.: Caso já tenha uma chave id_rsa no diretório
~/.ssh
de sua máquina, o script, a ser executado nos próximos passos, já irá copiá-lo, automaticamente, para dentro da pasta.docker/.ssh
- Adicionar as seguintes linhas no arquivo
~/.bashrc
ou~/.bash_profile
export DOCKER_USER_UID=$(id -u)
export DOCKER_GROUP_GID=$(id -g)
-
Na raiz do projeto execute o comando
bin/docker-setup
e toda a configuração do docker será realizada -
Após executar o comando da etapa anterior, o projeto estará pronto para ser utilizado. Existem no projeto alguns comandos para facilitar o uso no dia-a-dia:
bin/docker-up
: Inicia o container do projeto no modo--detach
ou-d
bin/docker-down
: Interrompe o container do projetobin/docker-guard
: Inicia oguard
para execução dos testesbin/docker-bash
: Acessa o bash do containerbin/docker-sync
: Sincroniza o projeto novamente
Adicione a seguinte linha no Gemfile
definindo a branch de release adequada:
gem 'commands', git: '[email protected]:caiena/commands.rb.git', branch: 'release-0.1'
Execute o seguinte comando no diretório raiz do projeto Rails:
bundle install
- Utilize a classe
Commands::Command
como classe pai de outra classe desejada:
class Example < Commands::Command
# resto do código
end
- Implemente o método
call
:
class Example < Commands::Command
def call
# implemente a lógica
end
# resto do código
end
-
Uma vez que uma classe herda da classe
Commands::Command
, alguns métodos de instância se tornam disponíveis:-
success?
- Verifica se o comando não teve erros
example = Example.new example.call example.success?
- Verifica se o comando não teve erros
-
failure?
- Verifica se o comando teve erros
example = Example.new example.call example.failure?
- Verifica se o comando teve erros
-
merge_remote_errors!
- Realiza o merge de erros retornados na response HTTP de um remote com os erros do comando prefixando todos os atributos com
remote_
example = Example.new # Retorno de alguma API # Ex.: { "body" => { "errors" => { "service_order_state" => [{ "error" => "invalid" }] } } } response = Remote::Api.call example.call # Adiciona o erro no comando, adicionando `remote_` no atributo # Ex.: errors.add :remote_service_order_state, :invalid merged_errors = example.merge_remote_errors!(response.body)
- Realiza o merge de erros retornados na response HTTP de um remote com os erros do comando prefixando todos os atributos com
-
errors_as_json
- Exibe os erros do comando como json
example = Example.new example.call # "#{attr_name}" => [{ error: :"#{error_type}", metadata: value }, ...] json_errors = example.errors_as_json
- Exibe os erros do comando como json
-
raise_invalid!
- Lança uma exceção
Commands::Command::CommandInvalid
example = Example.new # Exceção Commands::Command::CommandInvalid example.raise_invalid!
- Lança uma exceção
-
-
A classe
Commands::Command
implementa uma variável de leitura chamadaresult
que informa o resultado do processamento do comando:example = Example.new example.call # Resultado do processamento do comando result = example.result
-
Inclua o módulo
Commands::Commander
na classe desejadaclass Example include Commands::Commander end
-
Vincule o comando na classe
class Example include Commands::Commander command :my_command, args: ->(instance) { { some_param: instance } }, class_name: "MyNamespace::MyCommand" end
-
Utilize o comando definido na classe como método de instância
example = Example.new # chamando o método call do comando example.my_command # chamando o método call! do comando # Lança uma exceção Commands::Command::CommandInvalid se falhar example.my_command!
-
Pode-se passar parâmetros para o comando
example = Example.new # passando parâmetros example.my_command(arg1: 100, arg2: "teste") # Lança uma exceção Commands::Command::CommandInvalid se falhar example.my_command!(arg1: 100, arg2: "teste")