lifen-ruby-style

Ensembe des outils et bonnes pratiques Ruby chez Lifen :

  1. Le Guide de style Lifen présente les guidelines Lifen et détaille les règles de style.

  2. RuboCop est un outil statique d'analyse et de formattage du code, qui repose sur le guide de style de la communauté Ruby et que nous configurons selon le guide de style Lifen. Nous utilisons plusieurs extensions :

  1. Overcommit permet de gérer et paramétrer les hooks Git.

Sommaire

Installation

1. Ajout de la gem au projet

Ajouter dans le Gemfile :

group :test, :development do
  gem 'lifen-ruby-style'
end

Ou dans le .gemspec s'il s'agit d'une gem :

spec.add_development_dependency 'lifen-ruby-style'

2. Config Rubocop

Créer le fichier .rubocop.yml avec le code suivant :

inherit_gem:
  lifen-ruby-style:
    - default_rubocop.yml

Forcer rubocop à respecter les exclusions définies dans le fichier de paramétrage :

$ cd my_project                          # aller à la racine du projet
$ echo '--force-exclusion' > .rubocop

3. Config Overcommit

$ curl https://raw.githubusercontent.com/honestica/lifen-ruby-style/master/default_overcommit.yml > .overcommit.yml

4. Installer les dépendances

$ bundle install

5. Installer les hooks Git

$ bundle exec overcommit --install
Recommandations spécifiques pour VSCode ### 1. Configuration générale ```json "editor.tabSize": 2, // Uses 2 spaces for indentation "editor.rulers": [ 80, 120 ], // Add rulers at 80 and 120 characters "files.trimTrailingWhitespace": true, // Remove trailing auto inserted whitespaces "files.insertFinalNewline": true, // Insert a final new line at the end of the file when saving it "files.associations": { "Gemfile": "ruby", }, // Use Ruby language mode for Gemfiles ``` ### 2. Extension ruby - Installer l'extension [rebornix.ruby](https://marketplace.visualstudio.com/items?itemName=rebornix.Ruby), qui intègre notamment `RuboCop`. Note : Inutile d'installer [ruby-rubocop](https://marketplace.visualstudio.com/items?itemName=misogi.ruby-rubocop) qui fait doublon et qui introduit des conflits avec les environnement `rvm`. - Paramétrage recommandé de l'extension : ```json "ruby.useBundler": true, // run non-lint commands with bundle exec "ruby.useLanguageServer": true, // use the internal language server (see below) "ruby.lint": { "rubocop": { "useBundler": true // enable rubocop via bundler } }, "ruby.format": "rubocop", // use rubocop for formatting ``` - **FORCER RUBOCOP À RESPECTER LES EXCLUSIONS DÉFINIES DANS LE FICHIER DE PARAMÉTRAGE :** ```bash $ cd my_project # aller à la racine du projet $ echo '--force-exclusion' > .rubocop ``` - Paramétrage recommandé pour l'auto-formatting : ```json "editor.formatOnPaste": true, // global auto-format code when pasting "editor.formatOnSave": true, // global auto-format code when saving "[ruby]": { "editor.formatOnSave": false // disable auto-format on save only for ruby files }, ``` ou ```json "[ruby]": { "editor.formatOnPaste": true, // auto-format ruby code when pasting "editor.formatOnSave": false // auto-format ruby code when saving }, ``` ### 3. Bonus - Autres extensions utiles : - [Bracket Pair Colorizer 2](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer-2) - [Endwise](https://marketplace.visualstudio.com/items?itemName=kaiwood.endwise) - [Git Blame](https://marketplace.visualstudio.com/items?itemName=waderyan.gitblame) - [Rails Go to Spec ](https://marketplace.visualstudio.com/items?itemName=sporto.rails-go-to-spec) - [RSpec Snippets](https://marketplace.visualstudio.com/items?itemName=karunamurti.rspec-snippets)
Recommandations spécifiques pour Sublime Text ### Configuration de Sublime Text Il faut aller dans `Preferences > Settings` et modifier le fichier `Preferences.sublime-settings -- User` et y ajouter les paramètres suivants : ```json { ..., "rulers": [ 80, 120 ], "tab_size": 2, "translate_tabs_to_spaces": true, "trim_trailing_white_space_on_save": true, "word_wrap": "true", ... } ``` ### Configuration de Rubocop #### 1. Installation du plugin Il faut installer l'extension [sublime_rubocop](https://packagecontrol.io/packages/RuboCop) Et tout devrait marcher par défaut si votre système n'utilise pas rvm ou rbenv. Le cas échéant il faut personnaliser la configuration en allant dans `Preferences > Package Settings > Rubocop > Settings - User` et mettre la configuration qui va bien dans le fichier, par exemple ceci si vous utilisez Rbenv : ``` { "check_for_rvm": false, "check_for_rbenv": true, "rbenv_path": "/usr/local/bin/rbenv" } ``` #### 2. Utilisation Une fois le plugin installé vous accéderez à des commandes supplémentaires liées à Rubocop et vous pourrez par exemple : - Corriger automatiquement des fichiers - Activer/Désactiver l'auto-check des fichiers
Recommandations spécifiques pour VIM (`dense-analysis/ale`) ### 1. Installation #### via Plug (recommandé) - Ajoutez à votre `.vimrc` (dans la liste des plugins): ``` Plug 'dense-analysis/ale' ``` - Lancez `:PlugInstall` #### Autres méthodes Voir https://github.com/dense-analysis/ale#3-installation ### 2. Configuration recommandée Dans votre `.vimrc`: - Pour que le linter passe lorsque le texte change (hors sauvegardes): ``` let g:ale_lint_on_text_changed = 'never' ``` - Pour que le linter passe lorsque la touche 'enter' est pressée: ``` let g:ale_lint_on_enter = 1 ``` - Pour que le linter nettoie les petites imperfections à la sauvegarde: ``` let g:ale_fix_on_save = 1 let g:ale_fixers = { \ 'ruby': 'rubocop', \ 'javascript': 'eslint' \} ``` (il faut aussi configurer les "fixers") ### Pour aller plus loin https://github.com/dense-analysis/ale

Usage

Workflow

  • Je code ma feature en local. Mon environnement (projet + IDE) étant configuré, je suis alerté en direct des règles de style que j'enfreins. Certaines sont mêmes corrigées automatiquement, lors de la sauvegarde du fichier.
  • Pour ignorer manuellement RuboCop sur des lignes données :
  "I want to ignore the Style/StringLiterals rule on this line only" # rubocop:disable Style/StringLiterals

  # rubocop:disable Style/StringLiterals
  "I want to ignore the Style/StringLiterals rule on this line."
  "and also on this one, because I like double quotes."
  # rubocop:enable Style/StringLiterals
  • Je commit :
    • Un hook de pre-commit lance une analyse RuboCop sur les fichiers "staged". Si l'analye renvoie des erreurs, le commit est bloqué.
    • Un hook vérifie le message de commit
    • Si je veux bypasser les hooks (déconseillé) : OVERCOMMIT_DISABLE=1 git commit ...
  • Je push (pas de hooks de pre-push paramétrés pour l'instant)

Attention :

  • si vous faites "Ctrl+C" pendant qu'un hook overcommit tourne, overcommit fait un git stash save et vous pouvez retrouver ce qui a disparu avec git stast list / show / pop
  • dans le même registre, ne faites pas de watch .git/hooks/pre-commit, si vous éditez vos fichiers dans une autre fenêtre, overcommit va régulièrement stasher vos modifs, et vous allez tourner en rond à éditer des fichiers qui changent sous vos pieds.

Commandes Rubocop

Pour de la vérification :

$ bundle exec rubocop             # checks all the repo
$ bundle exec rubocop [PATH]      # checks the path
$ bundle exec rubocop --fail-fast # inspect files in order of modification time and stop after the first file

Pour de la correction automatique :

$ bundle exec rubocop --safe              # run only safe cops.
$ bundle exec rubocop --auto-correct      # run auto-correct only when it's safe.
$ bundle exec rubocop --auto-correct-all  # run auto-correct (safe and unsafe).
$ bundle exec rubocop --lint              # run only lint cops.
$ bundle exec rubocop --fix-layout        # run only layout cops, with auto-correct on.
$ bundle exec rubocop --auto-correct-all --only "Style/AccessModifierDeclarations,Style/Alias,Style/AndOr,Style/ArrayJoin" # run autocorrect on listed cops

Liste des commandes disponibles :

$ bundle exec rubocop --help

Commandes Overcommit

$ OVERCOMMIT_DISABLE=1 git [command] # Executes the git command without running the hooks
$ bundle exec overcommit --run       # Run pre-commit hook against all git tracked files

Liste des commandes disponibles :

$ bundle exec overcommit --help

CI

Créer un flow avec la commande bundle exec overcommit --run.

Utilisation d'une version locale

Pour utiliser une version locale de la gem lifen-ruby-style :

  • Cloner le repo
    git clone [email protected]:honestica/lifen-ruby-style.git
  • Modifier le Gemfile de votre projet local (e.g. Alphonse) :
  group :development, :test do
    gem 'lifen-ruby-style', path: '../lifen-ruby-style'
  end
  • Modifier le fichier .rubocop.yml :
  inherit_from:
    - ../lifen-ruby-style/default_rubocop.yml
  • Créer le fichier .overcommit.yml et coller le contenu du fichier lifen-ruby-style/default_overcommit.yml

  • Installer les dépendances et les hooks Git :

  $ bundle install
  $ bundle exec overcommit --install
  • Vous pouvez maintenant apporter des modifications à la gem (repo lifen-ruby-style) et les visualiser sur votre projet local (e.g. alphonse).

ATTENTION : La configuration d'overcommit n'est pas liée automatiquement au projet, il faut la copier/coller dans le projet cible après avoir effectué des changements.

Contributions

Comme pour n'importe quel autre projet :

  • cloner le repo
  • créer une nouvelle branche
  • soumettre une PR

Vous allez vouloir tester localement les modifications de règle de style que vous proposez. L'idée est d'utiliser votre version locale de la gem lifen-ruby-style sur un projet local (e.g. Alphonse), suivre les instructions pour l'utilisation d'une version locale.

ATTENTION : La configuration d'overcommit n'est pas liée automatiquement au projet, il faut la copier/coller dans le projet cible après avoir effectué des changements.

Publier une nouvelle version

Suivre les instructions du guide de release.

TODO

  • [ ] Prendre ce qu'il y a de pertinent dans le style_guide pour le mettre dans le guide de contribution Rails (Notion)
  • [ ] Dans le style_guide, mettre un lien vers le guide de contribution Rails (Notion).
  • [ ] Ajouter lien vers la config rubocop-daemon pour les utilisateurs de VSCode
  • [ ] Ajouter fasterer si pertinent
  • [ ] Ajouter reek si pertinent
  • [ ] Ajouter slim_lint si pertinent
  • [ ] Ajouter scss si pertinent

Archives

Ajouter un "hook" git d'exécution de rubocop Créer le fichier `.git/hooks/pre-commit` avec : ```bash #!/bin/bash git status -s | grep -E 'A|M' | awk '$2' | xargs rubocop --display-cop-names --extra-details --parallel --force-exclusion ```
Ajouter rubocop au CircleCI Il suffit d'ajouter dans le flow un job avant les tests (ou en parallèles) avec la commande suivante : ```bash git diff-tree -r --no-commit-id --name-status 'origin/develop..HEAD' | grep -E 'A|M' | awk '$2' | xargs --no-run-if-empty bundle exec rubocop --config .rubocop.yml --force-exclusion --fail-level warn ```