<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Fabrício</title>
    <description>The latest articles on DEV Community by Fabrício (@fabcovalesci).</description>
    <link>https://dev.to/fabcovalesci</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F432208%2Fea2ce913-c323-4ace-ad62-e1ac285a49c9.jpg</url>
      <title>DEV Community: Fabrício</title>
      <link>https://dev.to/fabcovalesci</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabcovalesci"/>
    <language>en</language>
    <item>
      <title>Git hooks e Husky.js 🐶</title>
      <dc:creator>Fabrício</dc:creator>
      <pubDate>Sat, 29 Jan 2022 05:39:00 +0000</pubDate>
      <link>https://dev.to/fabcovalesci/git-hooks-e-huskyjs-1bm8</link>
      <guid>https://dev.to/fabcovalesci/git-hooks-e-huskyjs-1bm8</guid>
      <description>&lt;h4&gt;
  
  
  Você já passou pela seguinte situação:
&lt;/h4&gt;

&lt;p&gt;Terminar sua task, e comitar SEM rodar os testes (por que você esqueceu 😁) ?&lt;br&gt;
Acredito que alguns devs já passaram por isso, mas graças ao git existe uma maneira de automatizar essa tarefa, e evitar possiveis esquecimentos, atravéz do git hooks.&lt;/p&gt;
&lt;h4&gt;
  
  
  Mas o que são Git Hooks ?
&lt;/h4&gt;

&lt;p&gt;De acordo com a &lt;a href="https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks"&gt;documentação do Git&lt;/a&gt;, git hooks são: "&lt;em&gt;o Git tem uma maneira de disparar scripts personalizados quando certas ações importantes ocorrem&lt;/em&gt;".&lt;/p&gt;

&lt;p&gt;Todos os hooks são armazenados nos "hooks" subdiretório do git, em ".git/hooks", assim como ilustra a figura abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sG5MbdyF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/we3aosdj8321hob6pr5f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sG5MbdyF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/we3aosdj8321hob6pr5f.png" alt="caminho do git hook" width="725" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o git hooks é possivel adicionar um script para ser executado antes || durante || após, uma determinada ação.&lt;/p&gt;

&lt;p&gt;Pensando no nosso caso: executar os testes antes do &lt;code&gt;git commit&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  E o Husky.js 🐶 ?
&lt;/h4&gt;

&lt;p&gt;De acordo com a sua &lt;a href="https://typicode.github.io/husky/#/"&gt;documentação&lt;/a&gt; &lt;em&gt;"Husky melhora seus commits e muito mais 🐶 uau!".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Husky uma biblioteca javascript que permite criar git hooks modernos e fácil de utilizar.&lt;/p&gt;

&lt;p&gt;Vamos ver um exemplo prático para compreender melhor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Passos do projeto:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;&lt;br&gt;
npm init -y&lt;br&gt;
npm install mocha chai --save-dev&lt;br&gt;
git init -&amp;gt; se já tiver o git no projeto este passo não é necessário&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Inicialmente criei um projeto bem simples, para demonstrar como o Husky.js funciona, basicamente é um index.js com uma função de soma.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index.js
export const Soma = (x, y) =&amp;gt; {
    return x + y;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também possui o diretório para os testes, que neste caso vou utilizar o &lt;a href="https://mochajs.org/"&gt;mocha&lt;/a&gt; e o &lt;a href="https://www.chaijs.com/"&gt;chai&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;test/test.js

import { assert } from 'chai';
import { Soma } from '../index.js'


describe('Teste - Adição', function(){
    it('deve retornar soma entre dois numeros inteiros', function(done){
        assert.deepEqual(Soma(4, 4), 8);
        done()
    });

    it('verificar tipagem recebida na assinatura do metodo', function(done){
        assert.deepEqual(Soma(2, '2'), 4);
        done()
    });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos adicionar o mocha no package.json&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"scripts": {
    "test": "mocha --reporter spec"
  },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Vamos instalar o Husky.js agora:&lt;/strong&gt;&lt;br&gt;
1 - Instalar o husky.js&lt;br&gt;
&lt;code&gt;npm install husky --save-dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2 - Ativar ganchos do Git&lt;br&gt;
&lt;code&gt;npx husky install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3 - Criando um hook&lt;br&gt;
&lt;code&gt;npx husky add .husky/pre-commit "npm test"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O Husky irá criar um diretório chamado &lt;code&gt;.husky&lt;/code&gt; e dentro possui os hooks criados. A imagem abaixo mostra como fica após executar os comandos acima.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f5bWCfjz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u8wx1tf15zz15uztx1p5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f5bWCfjz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u8wx1tf15zz15uztx1p5.png" alt="diretorio husky" width="352" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este hook irá executar os testes antes do &lt;code&gt;git commit&lt;/code&gt;, e se o teste falhar, seu commit será abortado automaticamente, incrível neh !!&lt;/p&gt;

&lt;p&gt;Agora vamos testar !!&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm test&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Veja o resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G_GDv6cT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fv4qon2o3d7d640l4xcz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G_GDv6cT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fv4qon2o3d7d640l4xcz.png" alt="Image description" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nosso teste falhou por que foi passado uma &lt;code&gt;string&lt;/code&gt; ao invés de um número inteiro, e com isso o &lt;code&gt;git commit&lt;/code&gt; foi interronpido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vamos fazer o teste passar então.&lt;/strong&gt;&lt;br&gt;
Na nossa função de soma, verificamos por meio de regex se contém número dentro de uma string e convertemos para inteiro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index.js

export const Soma = (x, y) =&amp;gt; {
    x = typeof x === "number" ? x : parseInt(x.match(/^[0-9]*$/))[0]
    y = typeof y === "number" ? y : parseInt(y.match(/^[0-9]*$/)[0])
    return x + y;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testar novamente 😊.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FuEDYtk8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/174m5lyhxi8vux66y0f6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FuEDYtk8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/174m5lyhxi8vux66y0f6.png" alt="testar novamente" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nossos testes passaram e com isso o &lt;code&gt;git commit&lt;/code&gt; foi completado com sucesso 😀.&lt;/p&gt;

&lt;p&gt;Podemos realizar outras automações, criando nossos próprios scripts, que podem ser executados antes, durante ou depois de algum comando git, como por exemplo &lt;code&gt;es-lint&lt;/code&gt; para formatar código.&lt;/p&gt;

&lt;p&gt;Depois dessa você já pode executar o git commit -m 'message', sem se preocupar em rodar os testes antes. E claro eles devem passar 😉.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links úteis:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://typicode.github.io/husky/#/"&gt;Documentação do Husky.js&lt;/a&gt;&lt;br&gt;
&lt;a href="https://git-scm.com/"&gt;Documentação do Git&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/fabriciocovalesci/Test_huskyJS"&gt;Link do projeto acima&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>git</category>
      <category>tutorial</category>
      <category>huskyjs</category>
    </item>
    <item>
      <title>O que é o pyenv ?</title>
      <dc:creator>Fabrício</dc:creator>
      <pubDate>Sun, 07 Nov 2021 02:48:21 +0000</pubDate>
      <link>https://dev.to/fabcovalesci/o-que-e-o-pyenv--8p</link>
      <guid>https://dev.to/fabcovalesci/o-que-e-o-pyenv--8p</guid>
      <description>&lt;p&gt;O &lt;a href="https://github.com/pyenv/pyenv" rel="noopener noreferrer"&gt;pyenv&lt;/a&gt; é um gerenciador de versões do python, com ele é possivel utilizar diversas versões do interpretador.&lt;/p&gt;

&lt;p&gt;A grande vantagem de se usar o pyenv, é a facilidade de criar ambientes rapidamente.&lt;/p&gt;

&lt;p&gt;Veja abaixo como instalar e utilizar o pyenv.&lt;/p&gt;

&lt;p&gt;Instalação:&lt;/p&gt;

&lt;p&gt;Todos os comandos abaixo estão disponiveis no repositório oficial, que pode ser acessado aqui.&lt;a href="https://github.com/pyenv/pyenv" rel="noopener noreferrer"&gt;aqui&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como sugere a &lt;a href="https://github.com/pyenv/pyenv/wiki" rel="noopener noreferrer"&gt;documentação do pyenv&lt;/a&gt;, é necessário a instalação de algumas dependências:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get update

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instalar o pyenv:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl https://pyenv.run | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configurar as variaveis de ambiente&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reinicia o terminal&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exec $SHELL 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usando o pyenv&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Verifique a versão que seu sistema operacional está utilizando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python -V
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pzj9sp2xb15ki02alvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3pzj9sp2xb15ki02alvr.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para procurar uma versão especifica é necessário apenas digitar o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyenv install -l
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após escolher a versão é preciso instalar, com o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyenv install &amp;lt;versão-escolhida-aqui-EX: '3.9.7'&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para listar as todas as versões que foram instaladas na sua máquina, digite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyenv versions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa56ewq38cpw5umvctl2s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa56ewq38cpw5umvctl2s.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para definir a versão nova em seu sistema operacional, o comando “pyenv global” seguido da versão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyenv global 3.9.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para desinstalar uma versão especifica o comando “pyenv uninstall” seguindo da versão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pyenv uninstall 3.9.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este foi um breve tutorial sobre &lt;strong&gt;pyenv&lt;/strong&gt;, que pode ser muito útil, quando se esta trabalhando varios projetos com versões diferentes.&lt;/p&gt;

</description>
      <category>python</category>
      <category>pyenv</category>
    </item>
  </channel>
</rss>
