Application permettant de contrôler l'accessibilité des sites Internet, et les obligations légales liés à celle-ci.
Production : https://acces-cible.beta.gouv.fr/
Staging : https://acces-cible.incubateur.net/
- Demandez la
master.key
à l'un des membres de votre équipe - Placez-la dans
config/
Pour démarrer le serveur, vous pouvez utiliser l'une des commandes suivantes :
Docker:
make up # docker compose up
# Autres commandes présentes dans le Makefile:
make cl # rails c
make sh # bash
ou, si ruby est installé sur votre poste (overmind est préconisé) :
bin/dev
Afin d'accéder à l'interface utilisateur des jobs, vous devrez aller sur http://127.0.0.1:3000/jobs
et entrer les
informations authentication présentes dans les credentials
.
- Pour lancer les seeds (
db/seeds/development.rb
)
# Docker
make sh
./bin/rails db:seed
# Local
bundle exec rails db:seed
- Dirigez-vous sur
http://localhost:3000
- Connectez-vous avec ProConnect et renseignez vos identifiants habituels
- OU
- Cliquez sur
Se connecter en mode développeur
- Renseignez:
Uid: user@example.com
Email: user@example.com
Given name: Test
Usual name: User
Siret: 12345678901234
Organizational unit: Engineering
- Framework : Ruby on Rails, ViewComponents, SolidQueue
- Tests : RSpec, Cucumber, Factory Bot
- UI : Composants DSFR (Design System de l'État Français)
- L'application est structurée en Modèle/View/Controller (MVC) avec une architecture REST, comme Rails le préconise.
- Plusieurs classes ne sont pas liées à des tables (PORO). Par exemple :
Browser
, une surcouche pour Ferrum, qui pilote Chrome.Crawler
,Page
,Link
,LinkList
,AxeViolation
,PageHeadingStatus
, ou encoreSiteUpload
. Parmi ces classes, celles dont les données n'ont pas vocation à être modifiées s'appuient sur le générateur Data.
- Les utilisateurs manipulent des sites, qui sont ensuite vérifiés (modèle Audit) selon plusieurs points de contrôle (
modèle Check). Les différents points de contrôles héritent de
Check
, ils sont placés dans le dossierchecks
. Les différents points de contrôle sont triés par priorité afin de gérer les dépendances entre les uns et les autres. - L'adresse des sites est stockée au niveau de l'audit, afin d'autoriser les sites à changer d'adresse (que ce soit en
passant au
https
, par l'ajout d'un sous-domainewww
, ou autre). Lors de la création d'un site, l'adresse saisie est donc comparée avec les adresses disponibles afin d'éviter des doublons. - Helpers : le module
ApplicationHelper
contient un certain nombre de fonctions permettant de simplifier la génération de liens avec icône, de composants DSFR internes au projet, etc. - Le titre des pages est obligatoire, il est généré automatiquement par la méthode
page_title
, soit en étant défini directement (@title
), soit viacontent_for(:title)
, soit en appelantto_title
sur la ressource affichée, soit via I18n ([contrôleur].[action].title
). - Les composants du DSFR, s'ils ne sont pas encore implémentés
dans DSFR view components, sont définis dans
app/components/dsfr/
. Une fois créés et stabilisés suite à leur usage dans le projet, les remonter dans la gemme pour que tout le monde en profite. - Pour simplifier la génération des textes,
human_attribute_name
est raccourci enhuman
et rendu disponible dans toutes les classes héritant d'ApplicationRecord
. Un helperto_percentage
est également proposé afin d'harmoniser l'affichage de ce type de chiffres.
- Le style Ruby suit les conventions Rails Omakase (style officiel de Rails)
- Utiliser des guillemets doubles pour les chaînes de caractères (
"exemple"
) - Utiliser des symboles plutôt que des chaînes quand les deux sont possibles
- La branche principale (
main
) est déployée en production - La branche de préproduction (
staging
) est déployée en staging - Les commits poussés sur la branche principale
utilisent Conventional Commits
Exemples de préfixes :
fix:
,feat:
,chore:
,ci:
,docs:
,style:
,refactor:
,perf:
,test:
, etc.
Pour améliorer l'expérience développeur, des raccourcis et des outils ont été mis en place
human
: raccourci pourhuman_attribute_name
.User.human(:full_name)
: renvoie la traduction de la cléfull_name
pour la classeUser
. Accepte des options supplémentaires, comme la méthode originale. Il est également disponible au niveau des instances (some_user.human(:foo)
).human_count
: raccourci pour compter des objets. Par défaut, compte le nombre d'éléments de la classe :User.human_count
renvoie le nombre total d'utilisateurs. Il est possible d'indiquer un attribut et/ou un nombre :User.human_count(:inactive, count: User.inactive.count)
.bulk_reset_counter(association, counter: nil)
fait ce qu'on attend dereset_counters
: prendre un nom d'association, le nom du compteur s'il diffère du nom par défaut, et met à jour toute la table en une seule requête SQL. TODO : proposer de l'upstreamer dans Rails.page_title
: récupère ou génère le titre de page. Cherche successivement dans@title
,content_for(:title)
, la méthodeto_title
de la ressource courante si on est dans une action de type:show
, ou dans la configuration I18n du contrôleur courant.head_title
: concatène le titre de page et le nom du site, et l'insère dans le layout principal.time_ago
: affiche "il y a X minutes/heures/jours…" ou "dans X minutes/heures/jours…". Bien plus court à taper quedistance_of_time_in_words_to_now
.page_actions
permet de regrouper les boutons et actions, avec les même styles d'une page à l'autre.
order_by
etfilter_by
. Ces méthodes sont injectées dansActiveRecord
, et gérées dansapp/queries/[model]_query.rb
. Grâce à cela, il est possible d'appelerUser.preloaded.filter_by(params[:filter]).order_by(params[:sort])
pour filtrer et trier les résultats.to_csv
etto_csv_filename
sont injectées dansActiveRecord
, pour permettre d'exporter une requête en CSV avec un minimum de configuration.
Les composants DSFR qui ne sont pas encore implémentés dans dsfr-view-components sont implémentés dans le dossier
app/components/dsfr/
. Des helpers sont également inclus pour les appeler avec une syntaxe concise et des valeurs par défaut logiques.
make sh # bash
./bin/rails db:setup RAILS_ENV=test
bundle exec rspec
bundle exec rspec spec/path/to/file_spec.rb:NUMÉRO_DE_LIGNE
bundle exec cucumber features/fonctionnalité_spécifique.feature
make lint
ou
bundle exec rubocop
bundle exec rubocop -a
Dans l'environnement Docker, vous pouvez utiliser debug
pour
arrêter et explorer votre code à un endroit précis :
- rajoutez un breakpoint avec l'appel
debugger
:
def some_method
+ debugger
a = "foobar"
end
- une fois le code arrêté :
web-1 | DEBUGGER: wait for debugger connection...
ouvrez un terminal et lancez make debug
qui se connecte
automatiquement au debugger.