lifen-ruby-style
Ensembe des outils et bonnes pratiques Ruby chez Lifen :
Le Guide de style Lifen présente les guidelines Lifen et détaille les règles de style.
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 :
- Rubocop-performance pour la performance et l'optimisation
- Rubocop-rspec pour l'analyse des tests RSpec
- Rubocop-rails pour les vérifications spécifiques à Rails.
- Overcommit permet de gérer et paramétrer les hooks Git.
Sommaire
- Installation
- Usage
- Utilisation d'une version locale
- Contributions
- Publier une nouvelle version
- TODO
- Archives
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 fichiersRecommandations 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/aleUsage
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 saveet vous pouvez retrouver ce qui a disparu avecgit 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
Gemfilede 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.ymlet coller le contenu du fichierlifen-ruby-style/default_overcommit.ymlInstaller 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
fasterersi pertinent - [ ] Ajouter
reeksi pertinent - [ ] Ajouter
slim_lintsi pertinent - [ ] Ajouter
scsssi pertinent