From ed85512b5a110cc62193ff52c6eac28b662b04fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 19 Dec 2023 20:07:24 +0100 Subject: [PATCH 01/45] pkg: update publicodes to 1.0.0-rfc.2 --- yarn.lock | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/yarn.lock b/yarn.lock index 9b2fd9fa4..ac9c1b422 100644 --- a/yarn.lock +++ b/yarn.lock @@ -803,6 +803,11 @@ publicodes@1.0.0-beta.77: resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-beta.77.tgz#45e3c4d2a46bfadcc932e1405ea037e659c28134" integrity sha512-F8U3WGUWMo3/rxhWYS1gWIiG20g1Yy/+PpXdHM99d6ZHKWnnyh/4txVEuyVE75glgDs+mTjwZPnmoKWsTMXluA== +publicodes@^1.0.0-rfc.2: + version "1.0.0-rfc.2" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rfc.2.tgz#f2ed8f3144af175b5deb893a28f3756230d4c322" + integrity sha512-5fpBHLnD24Jl8/CE+ScJvsNz1JwoVi13UAZODCW2/CsIAS997Tkz2FK5E/JpW7PjsSyGdfoTkZX/kDlgyWRfUg== + qs@^6.4.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" From b014ffa2e5edcd9ab7cd86bf3eeee6f33808d9f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 19 Dec 2023 20:07:40 +0100 Subject: [PATCH 02/45] feat: migrate "alimentation" --- data/alimentation/alimentation.publicodes | 1 - data/alimentation/repas.publicodes | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/data/alimentation/alimentation.publicodes b/data/alimentation/alimentation.publicodes index f84de3990..b0dfb6a6b 100644 --- a/data/alimentation/alimentation.publicodes +++ b/data/alimentation/alimentation.publicodes @@ -16,4 +16,3 @@ alimentation: - repas - boisson - déchets - diff --git a/data/alimentation/repas.publicodes b/data/alimentation/repas.publicodes index 439d16682..1b01b3061 100644 --- a/data/alimentation/repas.publicodes +++ b/data/alimentation/repas.publicodes @@ -636,7 +636,7 @@ alimentation . local . part locale: - alimentation . plats . poisson 1 * 5% - alimentation . plats . poisson 2 * 6% - alimentation . petit déjeuner . par semaine * 8% - unité: kgCO2e / semaine + unité: kgCO2e/semaine description: | Dans une première approche, nous avons choisi de travailler sur les menus proposés dans le simulateur en considérant les facteurs d'émission d'Agribalyse, actualisés en divisant la part de transport par 2. From 24c9b20f728ef0fdb8960f8ffead4f67c2d251d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 19 Dec 2023 20:11:31 +0100 Subject: [PATCH 03/45] feat: migrate "divers" --- data/divers/animaux domestiques.publicodes | 27 ++++++++++------------ "data/divers/num\303\251rique.publicodes" | 13 +++-------- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/data/divers/animaux domestiques.publicodes b/data/divers/animaux domestiques.publicodes index b51ee3305..08622e3c9 100644 --- a/data/divers/animaux domestiques.publicodes +++ b/data/divers/animaux domestiques.publicodes @@ -164,10 +164,10 @@ divers . animaux domestiques . empreinte . chats . alimentation . besoins énerg divers . animaux domestiques . empreinte . chats . alimentation . besoins énergétiques journaliers . facteur énergie . activité: titre: Niveau d'activité du chat + par défaut: "'actif'" avec: actif: peu actif: - par défaut: "'actif'" divers . animaux domestiques . empreinte . chats . litière: titre: Empreinte de la litière pour un chat @@ -216,10 +216,9 @@ divers . animaux domestiques . empreinte . petit chien . empreinte: divers . animaux domestiques . empreinte . petit chien . alimentation: formule: - recalcul: - règle: chiens . alimentation - avec: - chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'petit chien'" + valeur: chiens . alimentation + contexte: + chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'petit chien'" divers . animaux domestiques . empreinte . chien moyen: icônes: 🐶 @@ -243,10 +242,9 @@ divers . animaux domestiques . empreinte . chien moyen . empreinte: divers . animaux domestiques . empreinte . chien moyen . alimentation: formule: - recalcul: - règle: chiens . alimentation - avec: - chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'chien moyen'" + valeur: chiens . alimentation + contexte: + chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'chien moyen'" divers . animaux domestiques . empreinte . gros chien: icônes: 🐶 @@ -270,10 +268,9 @@ divers . animaux domestiques . empreinte . gros chien . empreinte: divers . animaux domestiques . empreinte . gros chien . alimentation: formule: - recalcul: - règle: chiens . alimentation - avec: - chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'gros chien'" + valeur: chiens . alimentation + contexte: + chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'gros chien'" divers . animaux domestiques . empreinte . chiens . alimentation: formule: besoin journalier nourriture * commun . jours par an * empreinte nourriture @@ -371,11 +368,11 @@ divers . animaux domestiques . empreinte . chiens . alimentation . besoins éner divers . animaux domestiques . empreinte . chiens . alimentation . besoins énergétiques journaliers . facteur énergie . activité: titre: Niveau d'activité du chien + par défaut: "'actif'" avec: - très actif: actif: peu actif: - par défaut: "'actif'" + très actif: divers . animaux domestiques . empreinte . apport énergétique nourriture: formule: 4610 diff --git "a/data/divers/num\303\251rique.publicodes" "b/data/divers/num\303\251rique.publicodes" index f8c563ba4..ab8f9f757 100644 --- "a/data/divers/num\303\251rique.publicodes" +++ "b/data/divers/num\303\251rique.publicodes" @@ -164,18 +164,11 @@ divers . numérique . appareils: divers . numérique . appareils . téléphone: icônes: 📱 formule: empreinte * nombre / (durée * coefficient préservation) - note: > - Les téléphones, et particulièrement les smartphones récents, sont le symbole - par excellence de la *high-tech*, qui est réputée consommer beaucoup de - ressources. - + note: | + Les téléphones, et particulièrement les smartphones récents, sont le symbole par excellence de la *high-tech*, qui est réputée consommer beaucoup de ressources. La question est d'autant plus importante qu'ils sont souvent renouvelés régulièrement, par exemple à chaque sortie annuelle du nouvel iPhone. - En réalité, notamment en comparaison du nombre d'heures que nous passons sur ces petits objets, leur empreinte climat pourrait être compatible avec un style de vie durable. Illustration : - - Un téléphone haut de gamme (iPhone X) c'est < 100kgCO2e. En supposant qu'on achète ce smartphone dernier cri tous les 2 ans, on a < 50kgCO2e/an. - Cela représente un demi-pourcent de l'empreinte moyenne d'un français (11 tonnes). Et 2.5% d'une empreinte durable de 2 tonnes / an. - + Un téléphone haut de gamme (iPhone X) c'est < 100kgCO2e. En supposant qu'on achète ce smartphone dernier cri tous les 2 ans, on a < 50kgCO2e/an. Cela représente un demi-pourcent de l'empreinte moyenne d'un français (11 tonnes). Et 2.5% d'une empreinte durable de 2 tonnes / an. Si vous n'avez pas de téléphone mobile, il y a de grandes chances pour que vous ayez un fixe. divers . numérique . appareils . téléphone . nombre: titre: Nombre de téléphones From 3ad20bb910611b4c7ce8dbac5bcf03de48332f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 19 Dec 2023 20:13:48 +0100 Subject: [PATCH 04/45] feat: migrate "logement" --- data/logement/vacances.publicodes | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/data/logement/vacances.publicodes b/data/logement/vacances.publicodes index b967f6795..3a9d72cbd 100644 --- a/data/logement/vacances.publicodes +++ b/data/logement/vacances.publicodes @@ -287,7 +287,7 @@ logement . vacances . auberge de jeunesse . présent: logement . vacances . auberge de jeunesse . empreinte par nuit: formule: empreinte hotel par nuit / nombre de personnes dans le dortoir - unité: kgCO2e / nuit + unité: kgCO2e/nuit note: | Pour une première approximation d'une nuit en auberge de jeunesse, l'idée est ici de diviser l'impact d'une nuitée classique en hôtel par le nombre de personnes dans un dortoir moyen. @@ -483,13 +483,12 @@ logement . vacances . résidence secondaire . pourcentage population propriétai logement . vacances . résidence secondaire . empreinte moyenne énergie: formule: - recalcul: - règle: résidence secondaire . énergie - avec: - résidence secondaire . surface: parc français . surface moyenne - résidence secondaire . durée: résidence secondaire . nombre de nuitées . moyenne - résidence secondaire . localisation: "'littoral nord ouest'" - résidence secondaire . saison: "'surtout été'" + valeur: résidence secondaire . énergie + contexte: + résidence secondaire . surface: parc français . surface moyenne + résidence secondaire . durée: résidence secondaire . nombre de nuitées . moyenne + résidence secondaire . localisation: "'littoral nord ouest'" + résidence secondaire . saison: "'surtout été'" unité: kgCO2e logement . vacances . résidence secondaire . construction: @@ -711,12 +710,13 @@ logement . vacances . résidence secondaire . localisation . littoral nord ouest - si: saison = 'surtout été' alors: facteur surtout été -logement . vacances . résidence secondaire . localisation . campagne . facteur saison: avec: - facteur hiver: 2.26 - facteur surtout hiver: 1.71 facteur été: 0.06 + facteur hiver: 2.26 facteur surtout été: 0.46 + facteur surtout hiver: 1.71 + +logement . vacances . résidence secondaire . localisation . campagne . facteur saison: formule: variations: - si: saison = 'hiver' From e843bf5b71fbbe6084972f499708e39eed6b000a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 19 Dec 2023 20:15:07 +0100 Subject: [PATCH 05/45] feat: migrate "transport" --- data/transport/avion.publicodes | 13 ++++---- data/transport/deux roues.publicodes | 11 +++---- data/transport/ferry.publicodes | 9 +++--- data/transport/voiture.publicodes | 47 +++++++++++++--------------- 4 files changed, 37 insertions(+), 43 deletions(-) diff --git a/data/transport/avion.publicodes b/data/transport/avion.publicodes index f0cd27025..311c454cd 100644 --- a/data/transport/avion.publicodes +++ b/data/transport/avion.publicodes @@ -34,13 +34,12 @@ transport . avion: transport . avion . empreinte moyenne: formule: - recalcul: - règle: transport . avion . empreinte - avec: - transport . avion . usager: oui - transport . avion . court courrier . heures de vol: transport . avion . court courrier . durée moyenne - transport . avion . moyen courrier . heures de vol: transport . avion . moyen courrier . durée moyenne - transport . avion . long courrier . heures de vol: transport . avion . long courrier . durée moyenne + valeur: transport . avion . empreinte + contexte: + transport . avion . usager: oui + transport . avion . court courrier . heures de vol: transport . avion . court courrier . durée moyenne + transport . avion . moyen courrier . heures de vol: transport . avion . moyen courrier . durée moyenne + transport . avion . long courrier . heures de vol: transport . avion . long courrier . durée moyenne transport . avion . empreinte: applicable si: usager diff --git a/data/transport/deux roues.publicodes b/data/transport/deux roues.publicodes index b9612549d..57240d87b 100644 --- a/data/transport/deux roues.publicodes +++ b/data/transport/deux roues.publicodes @@ -21,12 +21,11 @@ transport . deux roues . empreinte: transport . deux roues . empreinte moyenne: formule: - recalcul: - règle: deux roues . empreinte - avec: - deux roues . usager: oui - deux roues . type: "'moto sup 250'" - deux roues . km: km annuels moyen * pourcentage motards + valeur: deux roues . empreinte + contexte: + deux roues . usager: oui + deux roues . type: "'moto sup 250'" + deux roues . km: km annuels moyen * pourcentage motards transport . deux roues . km: question: Combien de km faites-vous à l'année avec votre scooter ou moto ? diff --git a/data/transport/ferry.publicodes b/data/transport/ferry.publicodes index c236b79d3..fd8e822b3 100644 --- a/data/transport/ferry.publicodes +++ b/data/transport/ferry.publicodes @@ -71,11 +71,10 @@ transport . ferry . usager: transport . ferry . empreinte moyenne: formule: - recalcul: - règle: ferry . empreinte - avec: - usager: oui - heures: durée moyenne par français + valeur: ferry . empreinte + contexte: + usager: oui + heures: durée moyenne par français transport . ferry . empreinte moyenne . durée moyenne par français: formule: (10000000 / population) * 8 h diff --git a/data/transport/voiture.publicodes b/data/transport/voiture.publicodes index 49ddc37bf..86a34ab7c 100644 --- a/data/transport/voiture.publicodes +++ b/data/transport/voiture.publicodes @@ -78,37 +78,34 @@ transport . voiture . empreinte utilisateur irrégulier: transport . voiture . empreinte utilisateur irrégulier . construction: formule: - recalcul: - règle: voiture . construction - avec: - voiture . utilisateur régulier: oui - voiture . gabarit: "'berline'" - voiture . motorisation: "'thermique'" - voiture . véhicule récent: oui + valeur: voiture . construction + contexte: + voiture . utilisateur régulier: oui + voiture . gabarit: "'berline'" + voiture . motorisation: "'thermique'" + voiture . véhicule récent: oui transport . voiture . empreinte utilisateur irrégulier . usage: formule: - recalcul: - règle: voiture . usage - avec: - voiture . utilisateur régulier: oui - voiture . gabarit: "'berline'" - voiture . motorisation: "'thermique'" - voiture . thermique . carburant: "'essence E5 ou E10'" - voiture . thermique . consommation aux 100: voiture . consommation estimée - voiture . véhicule récent: oui + valeur: voiture . usage + contexte: + voiture . utilisateur régulier: oui + voiture . gabarit: "'berline'" + voiture . motorisation: "'thermique'" + voiture . thermique . carburant: "'essence E5 ou E10'" + voiture . thermique . consommation aux 100: voiture . consommation estimée + voiture . véhicule récent: oui transport . voiture . empreinte moyenne: formule: - recalcul: - règle: voiture . empreinte calculée - avec: - voiture . utilisateur régulier: oui - voiture . gabarit: "'berline'" - voiture . motorisation: "'thermique'" - voiture . thermique . carburant: "'essence E5 ou E10'" - voiture . thermique . consommation aux 100: voiture . consommation estimée - voiture . véhicule récent: oui + valeur: voiture . empreinte calculée + contexte: + voiture . utilisateur régulier: oui + voiture . gabarit: "'berline'" + voiture . motorisation: "'thermique'" + voiture . thermique . carburant: "'essence E5 ou E10'" + voiture . thermique . consommation aux 100: voiture . consommation estimée + voiture . véhicule récent: oui transport . voiture . empreinte calculée: formule: (usage + construction amortie) / voyageurs From cb2d22629a56c972e82a9d7c5c51633757f1bbaf Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Thu, 18 Jan 2024 16:29:40 +0100 Subject: [PATCH 06/45] refactor(data): recalcul -> contexte --- data/actions/alimentation.publicodes | 28 +- data/actions/divers.publicodes | 21 +- data/actions/transport.publicodes | 616 +++++++++++++++++++++++++++ 3 files changed, 637 insertions(+), 28 deletions(-) create mode 100644 data/actions/transport.publicodes diff --git a/data/actions/alimentation.publicodes b/data/actions/alimentation.publicodes index 62bd5d520..f0b77a792 100644 --- a/data/actions/alimentation.publicodes +++ b/data/actions/alimentation.publicodes @@ -282,17 +282,15 @@ alimentation . devenir végétalien . différence par semaine chocolat chaud: alimentation . une semaine petit déjeuner végétalien: formule: - recalcul: - règle: petit déjeuner . par semaine - avec: - alimentation . petit déjeuner . type: "'végétalien'" + valeur: petit déjeuner . par semaine + contexte: + alimentation . petit déjeuner . type: "'végétalien'" alimentation . une semaine chocolat chaud végétalien: formule: - recalcul: - règle: boisson . chaude . chocolat chaud - avec: - alimentation . type de lait: "'lait d'avoine'" + valeur: boisson . chaude . chocolat chaud + contexte: + alimentation . type de lait: "'lait d'avoine'" alimentation . réduire café: @@ -429,10 +427,9 @@ alimentation . manger local: alimentation . manger local . recalcul: formule: - recalcul: - règle: alimentation . local . empreinte - avec: - alimentation . local . consommation: "'oui toujours'" + valeur: alimentation . local . empreinte + contexte: + alimentation . local . consommation: "'oui toujours'" alimentation . manger de saison: non applicable si: de saison . consommation = 'oui toujours' @@ -452,10 +449,9 @@ alimentation . manger de saison: alimentation . manger de saison . recalcul: formule: - recalcul: - règle: alimentation . de saison . empreinte - avec: - alimentation . de saison . consommation: "'oui toujours'" + valeur: alimentation . de saison . empreinte + contexte: + alimentation . de saison . consommation: "'oui toujours'" alimentation . boisson . eau en bouteille . arrêter: applicable si: diff --git a/data/actions/divers.publicodes b/data/actions/divers.publicodes index f6ba81a40..2d1c8b7a1 100644 --- a/data/actions/divers.publicodes +++ b/data/actions/divers.publicodes @@ -55,10 +55,9 @@ divers . électroménager . allongement: Si vous souhaitez absoluement vous séparer d'un objet prématurément, pensez aux ressourceries ou recycleries, par exemple, qui sont des lieux dédiés au réemploi ! 😉 divers . électroménager . appareils préservation allongée: - recalcul: - règle: divers . électroménager . appareils - avec: - coefficient préservation: 4 / 3 + valeur: divers . électroménager . appareils + contexte: + coefficient préservation: 4 / 3 divers . ameublement . allongement: titre: Allonger la vie de mes meubles @@ -74,10 +73,9 @@ divers . ameublement . allongement: Si vous souhaitez absoluement vous séparer d'un objet prématurément, pensez aux ressourceries ou recycleries, par exemple, qui sont des lieux dédiés au réemploi ! 😉 divers . ameublement . meubles préservation allongée: - recalcul: - règle: divers . ameublement . meubles - avec: - coefficient préservation: 4 / 3 + valeur: divers . ameublement . meubles + contexte: + coefficient préservation: 4 / 3 divers . tabac . arrêter: titre: Arrêter de fumer @@ -122,10 +120,9 @@ divers . numérique . appareils . allongement: Si vous souhaitez absoluement vous séparer d'un objet prématurément, pensez aux ressourceries ou recycleries, par exemple, qui sont des lieux dédiés au réemploi ! 😉 divers . numérique . appareils préservation allongée: - recalcul: - règle: divers . numérique . appareils - avec: - coefficient préservation: 4 / 3 + valeur: divers . numérique . appareils + contexte: + coefficient préservation: 4 / 3 divers . textile . réduire neuf: diff --git a/data/actions/transport.publicodes b/data/actions/transport.publicodes new file mode 100644 index 000000000..697c62e1e --- /dev/null +++ b/data/actions/transport.publicodes @@ -0,0 +1,616 @@ +transport . arrêter l'avion: + icônes: 🛬🧳 + applicable si: + toutes ces conditions: + - est défini: avion . usager + - avion . usager + action: + dépasse: + - transport . arrêter l'avion court + - transport . prendre moins l'avion + formule: transport . avion + description: | + L'avion a une empreinte importante sur le climat. + + Elle ne se limite pas aux seules émissions de CO₂, qui n'est qu'un gaz à effet de serre parmi d'autres. + + L'empreinte totale de l'avion est estimée à environ 2x celle du CO₂. + + Voir le [calculateur transport](https://monimpacttransport.fr) pour visualiser cette empreinte et la comparer aux autres moyens de transport. + + aller plus loin: | + ## Forçage radiatif total + + L'avion a un impact important sur le climat à la fois à cause de ses émissions de CO₂ et d'autres effets (dit forçage radiatif additionnel). + + Du fait que les avions volent en haute altitude, la combustion du kérosène crée des traînées et perturbe les cycles d’autres gaz à effet de serre que le CO₂ (vapeur d'eau, eau condensée sous diverses formes, NOx et méthane qui, ensemble, produisent de l'ozone, etc.). + + Ce graphique montre la complexité des effects en jeu (et encore, tout n'y est pas). + + ![](https://www.uecna.eu/wp-content/uploads/2017/12/ilusion-diagram1.jpg) + + ## Avion vs voiture + + On entend souvent que ramenée au passager, elle est du même ordre que celle d'une voiture. C'est vrai, mais ce n'est qu'une partie de l'histoire. + + Premièrement, l'empreinte de la voiture elle-même est élevée. Comparer l'avion à la voiture ne rend pas ce premier vertueux. + + Deuxièmement, on ne peut comparer la voiture et l'avion simplement parce qu'un trajet en avion est en général bien plus long. Quand il s'agit de choisir la destination des vacances par exemple, un trajet en voiture a donc toutes les chances d'être beaucoup moins polluant. Cela dit, notons aussi que nos kilométrages en voiture sont tels que le match est relancé quand on regarde l'empreinte à l'année. + +transport . arrêter l'avion court: + titre: Privilégier le train au lieu de l'avion + icônes: 🛬🚆 + applicable si: + toutes ces conditions: + - est défini: avion . usager + - avion . usager + formule: transport . avion . court courrier + compensation train + # Mettre histogramme GES qui compare les trajets train vs avion. + description: | + L’avion a bouleversé nos modes de vies et nos façons de voyager. Nous pouvons maintenant aller plus loin, plus vite, plus fréquemment, mais ce n'est malheureusement pas sans contrepartie pour le climat. + + En effet, il existe notamment un rapport de 100 entre les facteurs d’émissions (quantité de CO₂ émise par km parcouru) d’un avion et d’un train. + + > À titre d’exemple, un aller-retour Paris-Marseille émet environ 300 kgCO2eq en avion contre seulement 2 kgCO2eq en train. + + C’est pourquoi adapter nos week-ends et nos vacances + en nous tournant vers des offres de mobilités bas carbone et/ou en repensant notre manière de voyager est essentiel si l’on souhaite tant à + l’échelle individuelle qu’à l’échelle de la société réduire notre impact sur le climat + + [Comparez les modes de transport ici](https://monimpacttransport.fr) + #chiffres clefs + #Un aller-retour Paris-Marseille émet environ 250 kgCO2eq en avion contre seulement 3 kgCO2eq en train (source Base Carbone) + #Choisir de se rendre, depuis Paris, à Barcelone (en train) plutôt qu’à Marrakech (en avion) permettra d’éviter d’émettre 781 kg de CO2eq (source Base Carbone) + +transport . arrêter l'avion court . compensation train: + formule: avion . court courrier . heures de vol * avion . court courrier . vitesse moyenne * ratio distance supplémentaire train * transport . train . impact par km + +transport . arrêter l'avion court . ratio distance supplémentaire train: + formule: 1.2 + note: On fait l'hypothèse qu'un trajet en train est 50% plus long (en distance) qu'un trajet en avion. + +transport . prendre moins l'avion: + titre: Prendre deux fois moins l'avion + icônes: 📉🛬 + applicable si: + toutes ces conditions: + - est défini: avion . usager + - avion . usager + action: + dépasse: + - transport . arrêter l'avion court + formule: transport . avion / 2 + description: | + > 💡 Essayez de faire au moins l'un des trajets vers votre destination en train ! + + L'avion a une empreinte importante sur le climat. + + Elle ne se limite pas aux seules émissions de CO₂, qui n'est qu'un gaz à effet de serre parmi d'autres. + + Voir le [calculateur transport](https://monimpacttransport.fr) pour visualiser cette empreinte et la comparer aux autres moyens de transport. + + aller plus loin: | + ## Forçage radiatif total + + L'avion a un impact important sur le climat à la fois à cause de ses émissions de CO₂ et d'autres effets (dit forçage radiatif additionnel). + + Du fait que les avions volent en haute altitude, la combustion du kérosène crée des traînées et perturbe les cycles d’autres gaz à effet de serre que le CO₂ (vapeur d'eau, eau condensée sous diverses formes, NOx et méthane qui, ensemble, produisent de l'ozone, etc.). + + Ce graphique montre la complexité des effects en jeu (et encore, tout n'y est pas). + + ![](https://www.uecna.eu/wp-content/uploads/2017/12/ilusion-diagram1.jpg) + + ## Avion vs voiture + + On entend souvent que ramenée au passager, elle est du même ordre que celle d'une voiture. C'est vrai, mais ce n'est qu'une partie de l'histoire. + + Premièrement, l'empreinte de la voiture elle-même est élevée. Comparer l'avion à la voiture ne rend pas ce premier vertueux. + + Deuxièmement, on ne peut comparer la voiture et l'avion simplement parce qu'un trajet en avion est en général bien plus long. Quand il s'agit de choisir la destination des vacances par exemple, un trajet en voiture a donc toutes les chances d'être beaucoup moins polluant. Cela dit, notons aussi que nos kilométrages en voiture sont tels que le match est relancé quand on regarde l'empreinte à l'année. + +transport . éco-conduite: + titre: Adopter une éco-conduite + applicable si: + toutes ces conditions: + - est défini: voiture . utilisateur régulier + - voiture . utilisateur régulier + icônes: 🚗☮ + formule: transport . voiture . empreinte calculée - transport . éco-conduite . recalcul + description: | + L’éco-conduite est une action simple et efficace qui se tient à la portée de tous. + + Elle permet notamment d'économiser en moyenne 15 % de carburant, + de réduire les coûts d’entretien du véhicule, de réduire le risque d’accident de 10 à 15 % en moyenne et de réaliser des économies substantielles pouvant + s’élever à plusieurs centaines d’euros. + + L’application de l’éco-conduite est d’autant plus pertinente en ville et en zone urbaine ou les arrêts et + le redémarrage sont fréquents. + note: | + Voir le [Guide de formation à l'éco-conduite ADEME-LaPoste](https://expertises.ademe.fr/air-mobilites/mobilite-transports/passer-a-laction/solutions-technologiques/dossier/optimiser-lutilisation-lentretien-vehicule/lecoconduite-attitude-a-adopter) + +transport . éco-conduite . recalcul: + note: Un recalcul est nécessaire ici, car l'utilisateur peut avoir utilisé l'outil d'aide à la saisie qui proratise alors la variable km au nombre de voyageurs. Sinon ce n'est pas le cas. + formule: + valeur: transport . voiture . empreinte calculée + contexte: + transport . voiture . usage: transport . éco-conduite . usage réduit +transport . éco-conduite . usage réduit: + formule: (transport . voiture . km * transport . voiture . empreinte au kilomètre) * 0.85 + unité: kgCO2e + note: réduction de 15% (cf info règle éco-conduite) + +transport . covoiturage: + titre: Privilégier le covoiturage + applicable si: + toutes ces conditions: + - est défini: voiture . utilisateur régulier + - voiture . utilisateur régulier + action: + dépasse: + - transport . boulot . covoiturage + icônes: 🚗👥 + formule: voiture . km * voiture . empreinte au kilomètre * réduction covoiturage + description: | + Cette action concerne l'ensemble de ses trajets en voiture. + + Si le covoiturage longue distance est bien connu en France, celui des courtes distances est presque inexistant : aujourd’hui seuls 3 % des déplacements domicile-travail sont réalisés en covoiturage. + + Dans tous les cas, pensez à adapter votre mode de transport à la distance et à privilégier les modes doux ou transports en commun (bus, métro, vélo, marche, etc.) le plus possible. Le calculateur [Mon Impact Transport](https://monimpacttransport.fr/) vous permet de visualiser et comparer l'impact des différents modes de déplacement. + note: | + Voir l'article The Conversation [À quelles conditions le covoiturage sera-t-il un mode de transport durable ?](https://theconversation.com/a-quelles-conditions-le-covoiturage-sera-t-il-un-mode-de-transport-durable-124122) + +transport . boulot: + icônes: 🏢 +transport . boulot . covoiturage: + titre: Aller au travail en covoiturage + applicable si: + toutes ces conditions: + - est défini: voiture . utilisateur régulier + - voiture . utilisateur régulier + - voiture . km > seuil d'activation boulot + icônes: 🚗👥 + formule: distance * voiture . empreinte au kilomètre * réduction covoiturage + description: | + Si le covoiturage longue distance est bien connu en France, celui des courtes distances est presque inexistant : aujourd’hui seuls 3 % des déplacements domicile-travail sont réalisés en covoiturage. + + Sachez que depuis 2020, vous pouvez demander à votre employeur le [forfait mobilité durable](https://www.service-public.fr/particuliers/actualites/A14046), pour que votre covoiturage soit rémunéré jusqu'à 400€/an, exonérés d'impôt et de cotisations sociales ! + + Dans tous les cas, pensez à adapter votre mode de transport à la distance et à privilégier les modes doux ou transports en commun (bus, métro, vélo, marche, etc.) le plus possible. Le calculateur [Mon Impact Transport](https://monimpacttransport.fr/) vous permet de visualiser et comparer l'impact des différents modes de déplacement. + note: | + Voir l'article The Conversation [À quelles conditions le covoiturage sera-t-il un mode de transport durable ?](https://theconversation.com/a-quelles-conditions-le-covoiturage-sera-t-il-un-mode-de-transport-durable-124122) + +transport . réduction covoiturage: + formule: 20% + description: | + On pourrait naïvement penser que le covoiturage divise par 2 l'empreinte par personne. Mais en réalité, [une étude menée en Île-de-France](https://www.sciencedirect.com/science/article/pii/S1361920918303201) montre que les réductions sont plutôt de l'ordre de 20%... avant les effets rebonds, qui réduisent le gain final du covoiturage à seulement 6%. + + ![](https://images.theconversation.com/files/297327/original/file-20191016-98644-c9y1zz.png?ixlib=rb-1.1.0&q=30&auto=format&w=754&h=588&fit=crop&dpr=2) + note: | + Voir l'article The Conversation [À quelles conditions le covoiturage sera-t-il un mode de transport durable ?](https://theconversation.com/a-quelles-conditions-le-covoiturage-sera-t-il-un-mode-de-transport-durable-124122). + +transport . boulot . distance: + formule: semaines * hebdomadaire + unité: km + +transport . boulot . semaines: + formule: 47 + unité: semaine + description: 47 semaines, plutôt que 52 pour prendre en compte les 5 semaines de congés. + +transport . boulot . distance . hebdomadaire: + formule: km par jour * jours travaillés en voiture + unité: km/semaine + +transport . boulot . jours travaillés en voiture: + question: Combien de jours par semaine prenez-vous votre voiture pour aller au travail ? + par défaut: 4 + unité: jour/semaine + suggestions: + 0: 0 + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + +transport . boulot . distance . km par jour: + titre: Distance aller-retour trajet domicile travail + formule: 2 trajet/jour * km aller + unité: km/jour + +transport . boulot . distance . km aller: + titre: Distance aller trajet domicile travail + question: A quelle distance de chez vous se situe votre travail ? + unité: km/trajet + description: | + Nous parlons ici de la distance *aller*, avec le mode de transport que vous privilégiez. + + 70% des travailleurs en France travaillent à moins de 15km de chez eux. + + 57% travaillent à moins de 10km et 78% à moins de 20km. + + Source : études INSEE 2004 et 2013, chiffres stables. + note: Mettre un lien vers l'étude et mettre à jour avec les statistiques de l'enquête déplacement 2020 si disponible. + par défaut: 10 + +transport . empreinte au km covoiturage: 0.2 kgCO2e/km + +transport . boulot . commun: + action: + dépasse: + - transport . boulot . covoiturage + - transport . boulot . télétravail + titre: Aller au travail autrement qu'en voiture + icônes: 🚌🚲 + description: | + Quand c'est possible, prendre les transports en commun ou des véhicules légers (marche à pied, vélo, trottinette personnelle, ...) pour aller au travail réduit notre empreinte climat, mais améliore aussi notre qualité de vie. + + [70%](https://www.ecologie-solidaire.gouv.fr/covoiturage-en-france-avantages-et-reglementationen-vigueur) des déplacements domicile-travail sont réalisés avec des véhicules individuels, la plupart seul dans sa voiture. C'est ce qu'on appelle l'auto-solisme. + + En plus d'émettre beaucoup de gaz à effet de serre cet auto-solisme déteriore la qualité de l'air de nos villes et donc notre santé, et encombre les voies urbaines. + + > A titre d'exemple les bouchons représentent en Île-de-France par an et par personne [163 heures perdues](https://www.tomtom.com/en_gb/traffic-index/paris-traffic) soit environ 6 jours. + + >💡 Le saviez-vous ? L'État et beaucoup de régions ou villes subventionnent les vélos mécaniques, électriques, cargo, pliants, etc. [Calculez votre aide 🚲️ en 3 clics](https://mesaidesvelo.fr). + + applicable si: voiture . km > seuil d'activation boulot + formule: + variations: + - si: + une de ces conditions: + - type = 'bus' + - type = 'TER' + - type = 'métro ou tramway' + alors: boulot . distance * gain empreinte au km + - si: type = 'vélo classique' + alors: recalcul vélo + - si: type = 'vélo électrique' + alors: recalcul vae + - si: type = 'trotinette électrique' + alors: recalcul autres véhicules à moteur + +transport . seuil d'activation boulot: + titre: Seuil d'activation actions liées aux trajets "Boulot" + description: | + Distance minimale pour déclencher cette action. + + > Si quelqu'un nous dit qu'il ne fait que 500km de voiture dans l'année, il y a peu de chances + > qu'il aille en voiture au boulot. + + Nous définitions la distance du seuil à 2km (trajet aller), pour 5 jours par semaine. + + formule: transport . boulot . distance + unité: km + +transport . boulot . commun . gain empreinte au km: + formule: voiture . empreinte au kilomètre - empreinte + +transport . boulot . commun . empreinte: + titre: Empreinte transport en commun choisi + formule: + variations: + - si: type = 'bus' + alors: bus . impact par km + - si: type = 'TER' + alors: train . TER + - si: type = 'métro ou tramway' + alors: métro ou tram . impact par km + unité: kgCO2e/km + note: | + On considère qu'un déplacement domicile travail effectué en voiture peut-être remplacé par un train régional et non par un TGV. + +transport . boulot . commun . type: + avec: + bus: + métro ou tramway: + TER: + vélo classique: + vélo électrique: + trotinette électrique: + question: Si vous deviez ne plus prendre votre voiture pour vous rendre au travail quel autre moyen de transport pourriez-vous utiliser ? + par défaut: "'bus'" + formule: + une possibilité: + choix obligatoire: oui + possibilités: + - bus + - métro ou tramway + - TER + - vélo classique + - vélo électrique + - trotinette électrique + +transport . boulot . recalcul vélo: + formule: + valeur: transport . mobilité douce . vélo + contexte: + transport . mobilité douce . vélo . présent: oui + +transport . boulot . recalcul vae: + formule: + valeur: transport . mobilité douce . vae + contexte: + transport . mobilité douce . vae . présent: oui + transport . mobilité douce . vae . km: transport . boulot . distance + +transport . boulot . recalcul autres véhicules à moteur: + formule: + valeur: transport . mobilité douce . autres véhicules à moteur + contexte: + transport . mobilité douce . autres véhicules à moteur . présent: oui + transport . mobilité douce . autres véhicules à moteur . km: transport . boulot . distance + +transport . boulot . télétravail: + titre: Faire du télétravail + icônes: 🏠💻 + description: | + Le télétravail permet d'éviter des déplacements journaliers pour se rendre au boulot. + + Il n'est évidemment pas possible pour de nombreux salariés, mais la crise sanitaire de 2020 a montré que beaucoup de métiers sont effectivement télétravaillables. + + Dans ce calcul, nous ne prenons en compte que les jours télétravaillés qui évitent un déplacement en voiture individuelle. + applicable si: + toutes ces conditions: + - compatible + - voiture . km > seuil d'activation boulot + - jours travaillés en voiture > 0 + formule: empreinte jour voiture * jours gagnés * transport . boulot . semaines + +transport . boulot . jours gagnés: + valeur: jours télétravaillés + plafond: jours travaillés en voiture + +transport . boulot . empreinte jour voiture: + formule: distance . km par jour * voiture . empreinte au kilomètre + unité: kgCO2e/jour + +transport . boulot . jours télétravaillés: + question: Combien de jours de télétravail par semaine pourriez-vous faire ? + par défaut: 1 + unité: jour/semaine + suggestions: + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 +# TODO introduire des contrôles (mise à jour de publicodes nécessaire) ici : pas de jours de télétravail supplémentaires à + +transport . boulot . télétravail . compatible: + question: Votre travail est-il totalement ou en partie compatible avec le télétravail ? + par défaut: oui + +transport . voiture 5km: + titre: Se passer de voiture pour moins de 5 km + icônes: 🚗🚲 + formule: transport . voiture . empreinte calculée - transport . voiture 5km . recalcul + applicable si: + toutes ces conditions: + - est défini: voiture . utilisateur régulier + - voiture . utilisateur régulier + non applicable si: voiture . km < seuil d'activation 5km + note: | + On fait l'hypothèse qu'une personne qui n'est pas propriétaire de voiture se passe *déjà* d'une voiture pour de courts trajets. + description: | + En France, 4 trajets en voiture sur 10 font moins de 3 km et ce n’est pas moins de 177 millions de trajets de moins de 5km qui sont réalisés seuls en voiture chaque semaine (hors trajets domicile-travail). + + L’ensemble de ces trajets « courts » mis bout à bout présentent, à l’échelle de la France, près de 10% de la distance totale parcourue en voiture chaque année. + + Ainsi, se tourner vers les mobilités actives (vélo, trottinette...) pour ces trajets « courts » permet de réduire de manière significative, nos émissions de GES + tout en décongestionnant les voies urbaines et en améliorant la qualité de l’air de nos villes polluées. + + > 💡 Le saviez-vous ? L'État et beaucoup de régions ou villes subventionnent les vélos mécaniques, électriques, cargo, pliants, etc. [Calculez votre aide 🚲️ en 3 clics](https://mesaidesvelo.fr). + # 4 trajets en voiture sur 10 font moins de 3 km + 10% de la distance totale parcourue = Transflash, N°398, Juin 2015, Cerema + # 177 millions de trajets de moins de 5km = consolidation depuis Enquête Nationale Transport et Déplacements (ENTD), MTES, 2008. + +transport . seuil d'activation 5km: + titre: Seuil d'activation actions liées aux courts trajets + description: | + Distance minimale pour déclencher cette action. + + > Si quelqu'un nous dit qu'il ne fait que 200km de voiture dans l'année, il y a peu de chances + > qu'il s'agisse de trajets de 5km. + + On définit cette valeur comme étant équivalente à 2 trajets de 5 km A/R par semaine. + formule: commun . semaines par an * 2 trajet/semaine * distance moyenne aller-retour trajet court + unité: km + +transport . distance moyenne aller-retour trajet court: + formule: distance moyenne trajet court + unité: km/trajet + +transport . distance moyenne trajet court: + formule: 2.5 + unité: km/trajet + description: Nous estimons simplement à 2,5km la moyenne de distance des trajets inférieurs à 5km. + +transport . voiture 5km . recalcul: + formule: + valeur: transport . voiture . empreinte calculée + contexte: + transport . voiture . usage: transport . voiture 5km . usage réduit + +transport . voiture 5km . usage réduit: + formule: (transport . voiture . km - distance totale) * transport . voiture . empreinte au kilomètre + unité: kgCO2e + +transport . voiture 5km . distance totale: + formule: + variations: + - si: distance totale renseignée > transport . voiture . km + alors: transport . voiture . km + - sinon: distance totale renseignée + +transport . voiture 5km . distance totale renseignée: + formule: fréquence * distance moyenne aller-retour trajet court * commun . semaines par an + +transport . voiture 5km . fréquence: + question: Combien de fois par semaine prenez-vous la voiture pour moins de 5km ? + description: | + Je vais chercher mon pain à 2km en voiture, cela représente un trajet. + Je vais au travail tous les jours du lundi au vendredi à 4km, c'est 5 trajets. + par défaut: 14 + unité: trajet/semaine + suggestions: + jamais: 0 + seulement le weekend: 2 + dans la semaine: 5 + chaque jour: 7 + deux trajets par jour: 14 + +transport . super ethanol: + inactive: oui + titre: Passer du sans-plomb au super éthanol + icônes: ⛽️🚗 + applicable si: transport . voiture . thermique . carburant = 'essence E5 et E10' + formule: transport . voiture . empreinte calculée - transport . super ethanol . recalcul avec surconsommation + description: | + Le Superéthanol E85 est le carburant essence sans plomb pouvant contenir entre 65% et 85% de bioéthanol, le complément étant de l’essence Sans Plomb 95. + Il est produit à partir de cultures de canne à sucre, de céréales (blé, maïs) et de betterave sucrière. + + L’E85 est un carburant compétitif : même en tenant compte de la surconsommation qu’il engendre, il permet une économie de 30 à 40 centimes par litre de SP95 remplacé. + Pour l'utliser, il est possible de faire modifier votre véhicule essence en faisant poser un boîtier de conversion homologué, pour environ 1000€, amortis après 20 000 à 25 000 kilomètres. + ![](https://www.francetvinfo.fr/pictures/KlhzqieXAJSG5N_Reou0UdhPLKM/0x667:800x2147/fit-in/720x/filters:format(webp)/2018/10/12/php6RnMqG.png) + note: Cette action est inactive. Au vu des problématiques liées au changement d'affectation des sols et autres impacts environnementaux liés à la culture du maïs par exemple, les **biocarburants** ne sont pas pris en compte (le facteur d'émission de la base carbone étant particulièrement incertain). Voir discussions [ici](https://github.com/datagir/nosgestesclimat/pull/1324) + +transport . super ethanol . recalcul: + formule: + valeur: transport . voiture . empreinte calculée + contexte: + transport . voiture . thermique . carburant: "'essence E85'" + +transport . super ethanol . taux surconsommation: + formule: 125% + note: Le superéthanol E85 est moins énergétique, donc fait grimper les litres consommés [de 15 à 25%](https://www.ledauphine.com/magazine-lifestyle/2020/02/02/ce-que-vous-devez-savoir-sur-le-superethanol-e85-avant-de-vous-lancer). + +transport . super ethanol . recalcul avec surconsommation: + formule: recalcul * taux surconsommation + +transport . scooter électrique: + titre: Changer pour un scooter électrique + icônes: 🔌🛵 + applicable si: + toutes ces conditions: + - est défini: transport . deux roues . usager + - transport . deux roues . usager + - transport . deux roues . type = 'scooter thermique' + formule: transport . deux roues - transport . scooter électrique . recalcul + description: | + Le scooter électrique n'est pas la solution miracle mais pour certains usages il peut s'avérer (très) utile pour réduire notre empreinte. + + Attention toutefois à ne pas arriver à la conclusion simpliste qu'il suffirait de passer à un parc de véhicules électriques pour décarboner les déplacements des français. + + La priorité doit être, quand c'est possible (55% de nos trajets [font moins de 5km](https://twitter.com/GlmMrt/status/1481986507179274248)), l'essor des mobilités actives (telles que le vélo) et des transports en commun. + + Néanmoins le chiffre que l'on vous présente correspond bien à la différence d'émissions de gaz à effet de serre qui aurait eu lieu si vous aviez parcouru vos km avec + un véhicule électrique et non thermique. + + Il faut également avoir en tête que l'idée ici n'est pas de pousser vers l'achat d'un scooter électrique neuf, il vaut mieux faire durer son matériel et privilégier l'occasion ! + +transport . scooter électrique . recalcul: + formule: + valeur: transport . deux roues + contexte: + transport . deux roues . type: "'scooter électrique'" + +transport . voiture électrique: + titre: Rouler en voiture électrique + icônes: 🔌🚗 + applicable si: + toutes ces conditions: + - est défini: voiture . utilisateur régulier + - voiture . utilisateur régulier + non applicable si: transport . voiture . motorisation = 'électrique' + formule: transport . voiture . empreinte calculée - transport . voiture électrique . recalcul + description: | + La voiture électrique n'est pas la solution miracle mais pour certains usages elle peut s'avérer (très) utile pour réduire notre empreinte. + + Attention toutefois à ne pas arriver à la conclusion simpliste qu'il suffirait de passer à un parc automobile électrique pour décarboner les déplacements des français. + + La priorité doit être, quand c'est possible (55% de nos trajets [font moins de 5km](https://twitter.com/GlmMrt/status/1481986507179274248)), l'essor des mobilités actives (telles que le vélo) et des transports en commun. + + Néanmoins le chiffre que l'on vous présente correspond bien à la différence d'émissions de gaz à effet de serre qui aurait eu lieu si vous aviez parcouru vos km avec + un véhicule électrique et non thermique. + note: | + Envisager de ne proposer cette action que si elle > 0 voire > à plusieurs centaines de kgCO2eq + +transport . voiture électrique . recalcul: + formule: +# transport . âge nouvelle voiture électrique: +# formule: +# variations: +# - si: occasion +# alors: 5 +# - sinon: 1 +# note: on considère que l'âge d'une voiture d'occasion est 5 ans. + +# transport . âge nouvelle voiture électrique . occasion: +# question: Envisagez-vous d'acheter une voiture électrique d'occasion plutôt que neuve ? +# description: | +# Une voiture électrique d'occasion coûte moins cher, évidemment. Elle vous permet ausi d'obtenir une [aide à l'achat](https://www.service-public.fr/particuliers/vosdroits/F34014). + +# L'autonomie de la batterie peut avoir baissé légèrement, mais rappelez-vous que l'immense majorité de nos trajets [font moins de 50km](https://twitter.com/GlmMrt/status/1481986507179274248) ! + +# par défaut: oui +# # L'action disparait quand l'impact climat devient positif + valeur: transport . voiture . empreinte calculée + contexte: + transport . voiture . motorisation: "'électrique'" + # transport . voiture . âge: transport . âge nouvelle voiture électrique + +transport . voiture . limitation autoroute: + titre: Passer de 130 à 110km/h + icônes: 🚗🛣️ + applicable si: + toutes ces conditions: + - est défini: voiture . utilisateur régulier + - voiture . utilisateur régulier + formule: réduction * empreinte autoroute + description: | + La convention citoyenne pour le climat a proposé en 2020 une réduction de la limitation de vitesse sur les autoroutes de 130km/h à 110km/h. + La proposition est détaillée [ici](https://propositions.conventioncitoyennepourleclimat.fr/objectif/reduire-les-emissions-des-gaz-a-effet-de-serre-sur-les-autoroutes-et-les-voies-rapides/#elementor-tab-title-1681). + + Suite à l'invasion de l'Ukraine par la Russie, l'Agence Internationale de l'Énergie en a fait [sa 1ère recommandation](https://www.iea.org/reports/a-10-point-plan-to-cut-oil-use) pour réduire nos achats de pétrole russe. + + Nous proposons ici une évalution de cette mesure basée sur votre situation précise. + +transport . voiture . limitation autoroute . réduction: + titre: Gain de consommation 130 -> 110 + formule: 25% + description: | + ![](https://imgur.com/NB9CUUt.jpg) + D'après ce graphique, par déduction graphique (nous n'avons pas encore remonté aux données [de l'étude](http://theses.univ-lyon2.fr/documents/getpart.php?id=1026&action=pdf), page 151 figure 26), on trouve les données ci-dessous. + + Diesel : 6.5 l/100 à 130km/h -> 4.75 à 110km/h + + Essence : 11.75 l/100 à 130km/h -> 8.65 à 110km/h + + Donc -27% en diesel et - 26% en essence en passant de 130 à 110. Nous retenons l'ordre de grandeur de 25%. + note: | + Il faudrait affiner ce calcul. + Quelques sources à investiguer pour le calcul. + - un citoyen qui fait son test pour une clio. Il trouve une réduction entre -20% et -50% ! + https://twitter.com/CptQwark_/status/1289499582871658499 + Un autre citoyen trouve plutôt -10% avec une plus grosse voiture. + - [Rapport du CGDD](), où nous n'avons pas trouvé pour l'instant l'explication du calcul de l'économie de CO₂ + - Aurélien Bigo qui critique le rapport du CGDD https://twitter.com/AurelienBigo/status/1276459283291439114, mais qui ne nous donne pas d'infos sur le calcul du CO₂ lui même. + - une autre évaluation, qui elle nous donne le calcul :) : https://twitter.com/Tomsawy22670318/status/1274257122373570565 + Attention, pour être rigoureux, comme évoqué dans ce dernier fil, il faut prendre en compte la distribution de la vitesse et la catégorie de voiture (présence d'une 6ème vitesse par exemple). On ne roule évidement pas tout le temps à 130. + +transport . voiture . empreinte autoroute: + formule: par km personne * km autoroute + unité: kgCO2e + +transport . km autoroute: + question: Combien de km à l'année faites-vous sur autoroute (à peu près) ? + unité: km + description: | + On parcourt environ 80 milliards de km / an sur autoroute (voiture). + suggestions: + Paris ⇄ Athènes: 6000 + Brest ⇄ Nice: 3000 + Paris ⇄ Marseille: 1600 + Bordeaux ⇄ Lyon: 1100 + par défaut: 1200 + note: | + Fil twitter intéressant sur le sujet: https://twitter.com/Tomsawy22670318/status/1274257124701462528. From e695a63103665366dfede35cb479a4aef34066df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 19 Dec 2023 20:19:59 +0100 Subject: [PATCH 07/45] Revert "feat: migrate "logement"" This reverts commit 12c414905d5727326383ccb0e953c153fe34e2af. --- data/logement/vacances.publicodes | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/data/logement/vacances.publicodes b/data/logement/vacances.publicodes index 3a9d72cbd..b967f6795 100644 --- a/data/logement/vacances.publicodes +++ b/data/logement/vacances.publicodes @@ -287,7 +287,7 @@ logement . vacances . auberge de jeunesse . présent: logement . vacances . auberge de jeunesse . empreinte par nuit: formule: empreinte hotel par nuit / nombre de personnes dans le dortoir - unité: kgCO2e/nuit + unité: kgCO2e / nuit note: | Pour une première approximation d'une nuit en auberge de jeunesse, l'idée est ici de diviser l'impact d'une nuitée classique en hôtel par le nombre de personnes dans un dortoir moyen. @@ -483,12 +483,13 @@ logement . vacances . résidence secondaire . pourcentage population propriétai logement . vacances . résidence secondaire . empreinte moyenne énergie: formule: - valeur: résidence secondaire . énergie - contexte: - résidence secondaire . surface: parc français . surface moyenne - résidence secondaire . durée: résidence secondaire . nombre de nuitées . moyenne - résidence secondaire . localisation: "'littoral nord ouest'" - résidence secondaire . saison: "'surtout été'" + recalcul: + règle: résidence secondaire . énergie + avec: + résidence secondaire . surface: parc français . surface moyenne + résidence secondaire . durée: résidence secondaire . nombre de nuitées . moyenne + résidence secondaire . localisation: "'littoral nord ouest'" + résidence secondaire . saison: "'surtout été'" unité: kgCO2e logement . vacances . résidence secondaire . construction: @@ -710,13 +711,12 @@ logement . vacances . résidence secondaire . localisation . littoral nord ouest - si: saison = 'surtout été' alors: facteur surtout été +logement . vacances . résidence secondaire . localisation . campagne . facteur saison: avec: - facteur été: 0.06 facteur hiver: 2.26 - facteur surtout été: 0.46 facteur surtout hiver: 1.71 - -logement . vacances . résidence secondaire . localisation . campagne . facteur saison: + facteur été: 0.06 + facteur surtout été: 0.46 formule: variations: - si: saison = 'hiver' From 12b552e373cbdd8765fc9c7574f3285c6d036445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 19 Dec 2023 20:20:35 +0100 Subject: [PATCH 08/45] feat: migrate "logement --- data/logement/vacances.publicodes | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/data/logement/vacances.publicodes b/data/logement/vacances.publicodes index b967f6795..ec6dcffd7 100644 --- a/data/logement/vacances.publicodes +++ b/data/logement/vacances.publicodes @@ -287,7 +287,7 @@ logement . vacances . auberge de jeunesse . présent: logement . vacances . auberge de jeunesse . empreinte par nuit: formule: empreinte hotel par nuit / nombre de personnes dans le dortoir - unité: kgCO2e / nuit + unité: kgCO2e/nuit note: | Pour une première approximation d'une nuit en auberge de jeunesse, l'idée est ici de diviser l'impact d'une nuitée classique en hôtel par le nombre de personnes dans un dortoir moyen. @@ -483,13 +483,12 @@ logement . vacances . résidence secondaire . pourcentage population propriétai logement . vacances . résidence secondaire . empreinte moyenne énergie: formule: - recalcul: - règle: résidence secondaire . énergie - avec: - résidence secondaire . surface: parc français . surface moyenne - résidence secondaire . durée: résidence secondaire . nombre de nuitées . moyenne - résidence secondaire . localisation: "'littoral nord ouest'" - résidence secondaire . saison: "'surtout été'" + valeur: résidence secondaire . énergie + contexte: + résidence secondaire . surface: parc français . surface moyenne + résidence secondaire . durée: résidence secondaire . nombre de nuitées . moyenne + résidence secondaire . localisation: "'littoral nord ouest'" + résidence secondaire . saison: "'surtout été'" unité: kgCO2e logement . vacances . résidence secondaire . construction: From d83a6ac66ea7ed2c7e6b68c0e93fca3d8e9c1b7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 19 Dec 2023 20:31:41 +0100 Subject: [PATCH 09/45] fix: recalcul for CH model --- data/i18n/models/CH-en.publicodes | 11 +++++------ data/i18n/models/CH-fr.publicodes | 11 +++++------ 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/data/i18n/models/CH-en.publicodes b/data/i18n/models/CH-en.publicodes index f7c75bd26..1e71e30a6 100644 --- a/data/i18n/models/CH-en.publicodes +++ b/data/i18n/models/CH-en.publicodes @@ -41,12 +41,11 @@ transport . voiture . thermique . carburant . essence E85: titre: E85 petrol transport . deux roues . empreinte moyenne: formule: - recalcul: - règle: deux roues . empreinte - avec: - deux roues . usager: oui - deux roues . type: "'moto sup 250'" - deux roues . km: 400 + valeur: deux roues . empreinte + contexte: + deux roues . usager: oui + deux roues . type: "'moto sup 250'" + deux roues . km: 400 transport . avion . usager: description: | We have chosen to offer you a way of counting the impact of your air travel over several years. diff --git a/data/i18n/models/CH-fr.publicodes b/data/i18n/models/CH-fr.publicodes index 365a4d2c4..455c11c25 100644 --- a/data/i18n/models/CH-fr.publicodes +++ b/data/i18n/models/CH-fr.publicodes @@ -43,12 +43,11 @@ transport . voiture . thermique . carburant . essence E85: transport . deux roues . empreinte moyenne: formule: - recalcul: - règle: deux roues . empreinte - avec: - deux roues . usager: oui - deux roues . type: "'moto sup 250'" - deux roues . km: 400 + valeur: deux roues . empreinte + contexte: + deux roues . usager: oui + deux roues . type: "'moto sup 250'" + deux roues . km: 400 # @Clement: note: Source manquante ? transport . avion . usager: From 590ac86c89bcd6577fde56fa79e52a8cef93f4c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 2 Jan 2024 15:30:03 +0100 Subject: [PATCH 10/45] pkg: update publicodes to 1.0.0-rc.5 --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index ac9c1b422..86679c4ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -803,10 +803,10 @@ publicodes@1.0.0-beta.77: resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-beta.77.tgz#45e3c4d2a46bfadcc932e1405ea037e659c28134" integrity sha512-F8U3WGUWMo3/rxhWYS1gWIiG20g1Yy/+PpXdHM99d6ZHKWnnyh/4txVEuyVE75glgDs+mTjwZPnmoKWsTMXluA== -publicodes@^1.0.0-rfc.2: - version "1.0.0-rfc.2" - resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rfc.2.tgz#f2ed8f3144af175b5deb893a28f3756230d4c322" - integrity sha512-5fpBHLnD24Jl8/CE+ScJvsNz1JwoVi13UAZODCW2/CsIAS997Tkz2FK5E/JpW7PjsSyGdfoTkZX/kDlgyWRfUg== +publicodes@^1.0.0-rc.5: + version "1.0.0-rc.5" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.5.tgz#714a600ccaa78ad89da878973999402e29996130" + integrity sha512-y5ZxhiBDf/GjSPE9iwoSlcwFNogqhxwl45LrVrGuWeIORgdALTdtHQaPgItQpaKVRSdsZei2GoCnsAIfqLCTJw== qs@^6.4.0: version "6.11.2" From 3421296b5a450b3bd716fabd10325f79a750bdf1 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Thu, 18 Jan 2024 16:55:28 +0100 Subject: [PATCH 11/45] fix: recalcul -> contexte in actions/alimentation --- data/actions/alimentation.publicodes | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/data/actions/alimentation.publicodes b/data/actions/alimentation.publicodes index f0b77a792..56fdb6d2b 100644 --- a/data/actions/alimentation.publicodes +++ b/data/actions/alimentation.publicodes @@ -492,11 +492,15 @@ alimentation . déchets . devenir zéro déchet: alimentation . déchets . devenir zéro déchet . recalcul: formule: - recalcul: - règle: alimentation . déchets - avec: + valeur: alimentation . déchets + contexte: alimentation . déchets . quantité jetée: "'zéro déchet'" +alimentation . boisson . sucrées . facteur sirops: + formule: 0.100 + unité: kgCO2e/l + note: Facteur d'émission issu d'[Agribalyse, boisson préparée à partir de sirop](https://agribalyse.ademe.fr/app/aliments/18058#Boisson_pr%C3%A9par%C3%A9e_%C3%A0_partir_de_sirop_%C3%A0_diluer_type_menthe,_fraise,_etc,_sucr%C3%A9,_dilu%C3%A9_dans_l'eau), 0.10 kgCO2e/kg. On considère que la masse volumique est de 1kg/l. + alimentation . déchets . réduire gaspillage: titre: Réduire le gaspillage alimentaire icônes: 🚯 From 9a959558693f5eba5e1adbe1ea513e8587d875a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 2 Jan 2024 16:22:51 +0100 Subject: [PATCH 12/45] fix: syntaxe `contexte` --- data/actions/alimentation.publicodes | 28 +++---- data/actions/transport.publicodes | 97 ++++++++++------------ data/divers/animaux domestiques.publicodes | 21 ++--- data/i18n/models/CH-fr.publicodes | 11 ++- data/logement/vacances.publicodes | 13 ++- data/transport/avion.publicodes | 15 ++-- data/transport/deux roues.publicodes | 11 ++- data/transport/ferry.publicodes | 9 +- data/transport/voiture.publicodes | 47 +++++------ 9 files changed, 115 insertions(+), 137 deletions(-) diff --git a/data/actions/alimentation.publicodes b/data/actions/alimentation.publicodes index 56fdb6d2b..a721b3c96 100644 --- a/data/actions/alimentation.publicodes +++ b/data/actions/alimentation.publicodes @@ -281,16 +281,14 @@ alimentation . devenir végétalien . différence par semaine chocolat chaud: unité: kgCO2e/semaine alimentation . une semaine petit déjeuner végétalien: - formule: - valeur: petit déjeuner . par semaine - contexte: - alimentation . petit déjeuner . type: "'végétalien'" + valeur: petit déjeuner . par semaine + contexte: + alimentation . petit déjeuner . type: "'végétalien'" alimentation . une semaine chocolat chaud végétalien: - formule: - valeur: boisson . chaude . chocolat chaud - contexte: - alimentation . type de lait: "'lait d'avoine'" + valeur: boisson . chaude . chocolat chaud + contexte: + alimentation . type de lait: "'lait d'avoine'" alimentation . réduire café: @@ -426,10 +424,9 @@ alimentation . manger local: plus importante pour les régimes végétalisés, ce qui n'est pas pris en compte ici. alimentation . manger local . recalcul: - formule: - valeur: alimentation . local . empreinte - contexte: - alimentation . local . consommation: "'oui toujours'" + valeur: alimentation . local . empreinte + contexte: + alimentation . local . consommation: "'oui toujours'" alimentation . manger de saison: non applicable si: de saison . consommation = 'oui toujours' @@ -448,10 +445,9 @@ alimentation . manger de saison: Pour en savoir plus sur la méthode de calcul, parcourez sa formule, les variables seront expliquées. alimentation . manger de saison . recalcul: - formule: - valeur: alimentation . de saison . empreinte - contexte: - alimentation . de saison . consommation: "'oui toujours'" + valeur: alimentation . de saison . empreinte + contexte: + alimentation . de saison . consommation: "'oui toujours'" alimentation . boisson . eau en bouteille . arrêter: applicable si: diff --git a/data/actions/transport.publicodes b/data/actions/transport.publicodes index 697c62e1e..166ccff01 100644 --- a/data/actions/transport.publicodes +++ b/data/actions/transport.publicodes @@ -130,10 +130,10 @@ transport . éco-conduite: transport . éco-conduite . recalcul: note: Un recalcul est nécessaire ici, car l'utilisateur peut avoir utilisé l'outil d'aide à la saisie qui proratise alors la variable km au nombre de voyageurs. Sinon ce n'est pas le cas. - formule: - valeur: transport . voiture . empreinte calculée - contexte: - transport . voiture . usage: transport . éco-conduite . usage réduit + valeur: transport . voiture . empreinte calculée + contexte: + transport . voiture . usage: transport . éco-conduite . usage réduit + transport . éco-conduite . usage réduit: formule: (transport . voiture . km * transport . voiture . empreinte au kilomètre) * 0.85 unité: kgCO2e @@ -321,24 +321,21 @@ transport . boulot . commun . type: - trotinette électrique transport . boulot . recalcul vélo: - formule: - valeur: transport . mobilité douce . vélo - contexte: - transport . mobilité douce . vélo . présent: oui + valeur: transport . mobilité douce . vélo + contexte: + transport . mobilité douce . vélo . présent: oui transport . boulot . recalcul vae: - formule: - valeur: transport . mobilité douce . vae - contexte: - transport . mobilité douce . vae . présent: oui - transport . mobilité douce . vae . km: transport . boulot . distance + valeur: transport . mobilité douce . vae + contexte: + transport . mobilité douce . vae . présent: oui + transport . mobilité douce . vae . km: transport . boulot . distance transport . boulot . recalcul autres véhicules à moteur: - formule: - valeur: transport . mobilité douce . autres véhicules à moteur - contexte: - transport . mobilité douce . autres véhicules à moteur . présent: oui - transport . mobilité douce . autres véhicules à moteur . km: transport . boulot . distance + valeur: transport . mobilité douce . autres véhicules à moteur + contexte: + transport . mobilité douce . autres véhicules à moteur . présent: oui + transport . mobilité douce . autres véhicules à moteur . km: transport . boulot . distance transport . boulot . télétravail: titre: Faire du télétravail @@ -425,10 +422,9 @@ transport . distance moyenne trajet court: description: Nous estimons simplement à 2,5km la moyenne de distance des trajets inférieurs à 5km. transport . voiture 5km . recalcul: - formule: - valeur: transport . voiture . empreinte calculée - contexte: - transport . voiture . usage: transport . voiture 5km . usage réduit + valeur: transport . voiture . empreinte calculée + contexte: + transport . voiture . usage: transport . voiture 5km . usage réduit transport . voiture 5km . usage réduit: formule: (transport . voiture . km - distance totale) * transport . voiture . empreinte au kilomètre @@ -474,10 +470,9 @@ transport . super ethanol: note: Cette action est inactive. Au vu des problématiques liées au changement d'affectation des sols et autres impacts environnementaux liés à la culture du maïs par exemple, les **biocarburants** ne sont pas pris en compte (le facteur d'émission de la base carbone étant particulièrement incertain). Voir discussions [ici](https://github.com/datagir/nosgestesclimat/pull/1324) transport . super ethanol . recalcul: - formule: - valeur: transport . voiture . empreinte calculée - contexte: - transport . voiture . thermique . carburant: "'essence E85'" + valeur: transport . voiture . empreinte calculée + contexte: + transport . voiture . thermique . carburant: "'essence E85'" transport . super ethanol . taux surconsommation: formule: 125% @@ -508,10 +503,9 @@ transport . scooter électrique: Il faut également avoir en tête que l'idée ici n'est pas de pousser vers l'achat d'un scooter électrique neuf, il vaut mieux faire durer son matériel et privilégier l'occasion ! transport . scooter électrique . recalcul: - formule: - valeur: transport . deux roues - contexte: - transport . deux roues . type: "'scooter électrique'" + valeur: transport . deux roues + contexte: + transport . deux roues . type: "'scooter électrique'" transport . voiture électrique: titre: Rouler en voiture électrique @@ -535,28 +529,27 @@ transport . voiture électrique: Envisager de ne proposer cette action que si elle > 0 voire > à plusieurs centaines de kgCO2eq transport . voiture électrique . recalcul: - formule: -# transport . âge nouvelle voiture électrique: -# formule: -# variations: -# - si: occasion -# alors: 5 -# - sinon: 1 -# note: on considère que l'âge d'une voiture d'occasion est 5 ans. - -# transport . âge nouvelle voiture électrique . occasion: -# question: Envisagez-vous d'acheter une voiture électrique d'occasion plutôt que neuve ? -# description: | -# Une voiture électrique d'occasion coûte moins cher, évidemment. Elle vous permet ausi d'obtenir une [aide à l'achat](https://www.service-public.fr/particuliers/vosdroits/F34014). - -# L'autonomie de la batterie peut avoir baissé légèrement, mais rappelez-vous que l'immense majorité de nos trajets [font moins de 50km](https://twitter.com/GlmMrt/status/1481986507179274248) ! - -# par défaut: oui -# # L'action disparait quand l'impact climat devient positif - valeur: transport . voiture . empreinte calculée - contexte: - transport . voiture . motorisation: "'électrique'" - # transport . voiture . âge: transport . âge nouvelle voiture électrique + # transport . âge nouvelle voiture électrique: + # formule: + # variations: + # - si: occasion + # alors: 5 + # - sinon: 1 + # note: on considère que l'âge d'une voiture d'occasion est 5 ans. + + # transport . âge nouvelle voiture électrique . occasion: + # question: Envisagez-vous d'acheter une voiture électrique d'occasion plutôt que neuve ? + # description: | + # Une voiture électrique d'occasion coûte moins cher, évidemment. Elle vous permet ausi d'obtenir une [aide à l'achat](https://www.service-public.fr/particuliers/vosdroits/F34014). + + # L'autonomie de la batterie peut avoir baissé légèrement, mais rappelez-vous que l'immense majorité de nos trajets [font moins de 50km](https://twitter.com/GlmMrt/status/1481986507179274248) ! + + # par défaut: oui + # # L'action disparait quand l'impact climat devient positif + valeur: transport . voiture . empreinte calculée + contexte: + transport . voiture . motorisation: "'électrique'" + # transport . voiture . âge: transport . âge nouvelle voiture électrique transport . voiture . limitation autoroute: titre: Passer de 130 à 110km/h diff --git a/data/divers/animaux domestiques.publicodes b/data/divers/animaux domestiques.publicodes index 08622e3c9..641afb3a3 100644 --- a/data/divers/animaux domestiques.publicodes +++ b/data/divers/animaux domestiques.publicodes @@ -215,10 +215,9 @@ divers . animaux domestiques . empreinte . petit chien . empreinte: - soins vétérinaires par animal divers . animaux domestiques . empreinte . petit chien . alimentation: - formule: - valeur: chiens . alimentation - contexte: - chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'petit chien'" + valeur: chiens . alimentation + contexte: + chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'petit chien'" divers . animaux domestiques . empreinte . chien moyen: icônes: 🐶 @@ -241,10 +240,9 @@ divers . animaux domestiques . empreinte . chien moyen . empreinte: - soins vétérinaires par animal divers . animaux domestiques . empreinte . chien moyen . alimentation: - formule: - valeur: chiens . alimentation - contexte: - chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'chien moyen'" + valeur: chiens . alimentation + contexte: + chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'chien moyen'" divers . animaux domestiques . empreinte . gros chien: icônes: 🐶 @@ -267,10 +265,9 @@ divers . animaux domestiques . empreinte . gros chien . empreinte: - soins vétérinaires par animal divers . animaux domestiques . empreinte . gros chien . alimentation: - formule: - valeur: chiens . alimentation - contexte: - chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'gros chien'" + valeur: chiens . alimentation + contexte: + chiens . alimentation . besoins énergétiques journaliers . facteur poids . taille chien: "'gros chien'" divers . animaux domestiques . empreinte . chiens . alimentation: formule: besoin journalier nourriture * commun . jours par an * empreinte nourriture diff --git a/data/i18n/models/CH-fr.publicodes b/data/i18n/models/CH-fr.publicodes index 455c11c25..ee437013b 100644 --- a/data/i18n/models/CH-fr.publicodes +++ b/data/i18n/models/CH-fr.publicodes @@ -42,12 +42,11 @@ transport . voiture . thermique . carburant . essence E85: titre: Essence E85 transport . deux roues . empreinte moyenne: - formule: - valeur: deux roues . empreinte - contexte: - deux roues . usager: oui - deux roues . type: "'moto sup 250'" - deux roues . km: 400 + valeur: deux roues . empreinte + contexte: + deux roues . usager: oui + deux roues . type: "'moto sup 250'" + deux roues . km: 400 # @Clement: note: Source manquante ? transport . avion . usager: diff --git a/data/logement/vacances.publicodes b/data/logement/vacances.publicodes index ec6dcffd7..3ae07d540 100644 --- a/data/logement/vacances.publicodes +++ b/data/logement/vacances.publicodes @@ -482,13 +482,12 @@ logement . vacances . résidence secondaire . pourcentage population propriétai [Source](https://www.data.gouv.fr/fr/reuses/classement-des-25-communes-avec-le-plus-fort-taux-de-residences-secondaires/) logement . vacances . résidence secondaire . empreinte moyenne énergie: - formule: - valeur: résidence secondaire . énergie - contexte: - résidence secondaire . surface: parc français . surface moyenne - résidence secondaire . durée: résidence secondaire . nombre de nuitées . moyenne - résidence secondaire . localisation: "'littoral nord ouest'" - résidence secondaire . saison: "'surtout été'" + valeur: résidence secondaire . énergie + contexte: + résidence secondaire . surface: parc français . surface moyenne + résidence secondaire . durée: résidence secondaire . nombre de nuitées . moyenne + résidence secondaire . localisation: "'littoral nord ouest'" + résidence secondaire . saison: "'surtout été'" unité: kgCO2e logement . vacances . résidence secondaire . construction: diff --git a/data/transport/avion.publicodes b/data/transport/avion.publicodes index 311c454cd..b79c018a7 100644 --- a/data/transport/avion.publicodes +++ b/data/transport/avion.publicodes @@ -33,16 +33,15 @@ transport . avion: - sinon: empreinte moyenne transport . avion . empreinte moyenne: - formule: - valeur: transport . avion . empreinte - contexte: - transport . avion . usager: oui - transport . avion . court courrier . heures de vol: transport . avion . court courrier . durée moyenne - transport . avion . moyen courrier . heures de vol: transport . avion . moyen courrier . durée moyenne - transport . avion . long courrier . heures de vol: transport . avion . long courrier . durée moyenne + valeur: transport . avion . empreinte + contexte: + transport . avion . usager: oui + transport . avion . court courrier . heures de vol: transport . avion . court courrier . durée moyenne + transport . avion . moyen courrier . heures de vol: transport . avion . moyen courrier . durée moyenne + transport . avion . long courrier . heures de vol: transport . avion . long courrier . durée moyenne transport . avion . empreinte: - applicable si: usager + applicable si: avion . usager formule: somme: - court courrier diff --git a/data/transport/deux roues.publicodes b/data/transport/deux roues.publicodes index 57240d87b..044aba7c8 100644 --- a/data/transport/deux roues.publicodes +++ b/data/transport/deux roues.publicodes @@ -20,12 +20,11 @@ transport . deux roues . empreinte: unité: kgCO2e transport . deux roues . empreinte moyenne: - formule: - valeur: deux roues . empreinte - contexte: - deux roues . usager: oui - deux roues . type: "'moto sup 250'" - deux roues . km: km annuels moyen * pourcentage motards + valeur: deux roues . empreinte + contexte: + deux roues . usager: oui + deux roues . type: "'moto sup 250'" + deux roues . km: km annuels moyen * pourcentage motards transport . deux roues . km: question: Combien de km faites-vous à l'année avec votre scooter ou moto ? diff --git a/data/transport/ferry.publicodes b/data/transport/ferry.publicodes index fd8e822b3..8a2ab9f1f 100644 --- a/data/transport/ferry.publicodes +++ b/data/transport/ferry.publicodes @@ -70,11 +70,10 @@ transport . ferry . usager: Par exemple pour une traversée de 9h (une nuit) tous les 3 ans, répondez `3`. transport . ferry . empreinte moyenne: - formule: - valeur: ferry . empreinte - contexte: - usager: oui - heures: durée moyenne par français + valeur: ferry . empreinte + contexte: + usager: oui + heures: durée moyenne par français transport . ferry . empreinte moyenne . durée moyenne par français: formule: (10000000 / population) * 8 h diff --git a/data/transport/voiture.publicodes b/data/transport/voiture.publicodes index 86a34ab7c..a38772728 100644 --- a/data/transport/voiture.publicodes +++ b/data/transport/voiture.publicodes @@ -77,35 +77,32 @@ transport . voiture . empreinte utilisateur irrégulier: unité: kgCO2e transport . voiture . empreinte utilisateur irrégulier . construction: - formule: - valeur: voiture . construction - contexte: - voiture . utilisateur régulier: oui - voiture . gabarit: "'berline'" - voiture . motorisation: "'thermique'" - voiture . véhicule récent: oui + valeur: voiture . construction + contexte: + voiture . utilisateur régulier: oui + voiture . gabarit: "'berline'" + voiture . motorisation: "'thermique'" + voiture . véhicule récent: oui transport . voiture . empreinte utilisateur irrégulier . usage: - formule: - valeur: voiture . usage - contexte: - voiture . utilisateur régulier: oui - voiture . gabarit: "'berline'" - voiture . motorisation: "'thermique'" - voiture . thermique . carburant: "'essence E5 ou E10'" - voiture . thermique . consommation aux 100: voiture . consommation estimée - voiture . véhicule récent: oui + valeur: voiture . usage + contexte: + voiture . utilisateur régulier: oui + voiture . gabarit: "'berline'" + voiture . motorisation: "'thermique'" + voiture . thermique . carburant: "'essence E5 ou E10'" + voiture . thermique . consommation aux 100: voiture . consommation estimée + voiture . véhicule récent: oui transport . voiture . empreinte moyenne: - formule: - valeur: voiture . empreinte calculée - contexte: - voiture . utilisateur régulier: oui - voiture . gabarit: "'berline'" - voiture . motorisation: "'thermique'" - voiture . thermique . carburant: "'essence E5 ou E10'" - voiture . thermique . consommation aux 100: voiture . consommation estimée - voiture . véhicule récent: oui + valeur: voiture . empreinte calculée + contexte: + voiture . utilisateur régulier: oui + voiture . gabarit: "'berline'" + voiture . motorisation: "'thermique'" + voiture . thermique . carburant: "'essence E5 ou E10'" + voiture . thermique . consommation aux 100: voiture . consommation estimée + voiture . véhicule récent: oui transport . voiture . empreinte calculée: formule: (usage + construction amortie) / voyageurs From ee61d98d739216862ded79b7a598a83fe4cdcf46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Tue, 2 Jan 2024 16:29:37 +0100 Subject: [PATCH 13/45] =?UTF-8?q?pkg:=20ajoute=20la=20d=C3=A9pendance=20pu?= =?UTF-8?q?blicodes=20pour=20la=20doc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- quick-doc/package.json | 1 + quick-doc/yarn.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/quick-doc/package.json b/quick-doc/package.json index ef2382145..2fd39214a 100644 --- a/quick-doc/package.json +++ b/quick-doc/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "publicodes": "^1.0.0-rc.5", "publicodes-react": "^1.0.0-beta.77", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/quick-doc/yarn.lock b/quick-doc/yarn.lock index a7558df20..502a6b85e 100644 --- a/quick-doc/yarn.lock +++ b/quick-doc/yarn.lock @@ -1964,6 +1964,11 @@ publicodes-react@^1.0.0-beta.77: dependencies: styled-components "^6.0.8" +publicodes@^1.0.0-rc.5: + version "1.0.0-rc.5" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.5.tgz#714a600ccaa78ad89da878973999402e29996130" + integrity sha512-y5ZxhiBDf/GjSPE9iwoSlcwFNogqhxwl45LrVrGuWeIORgdALTdtHQaPgItQpaKVRSdsZei2GoCnsAIfqLCTJw== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" From 5c85b1f512b042a0952977bd7d578f74fb84f4d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment?= Date: Fri, 5 Jan 2024 17:41:04 +0100 Subject: [PATCH 14/45] pkg: use new @publicodes/react-ui package --- quick-doc/package.json | 2 +- quick-doc/src/App.tsx | 2 +- quick-doc/yarn.lock | 102 +++++++++++++++++++++++------------------ 3 files changed, 60 insertions(+), 46 deletions(-) diff --git a/quick-doc/package.json b/quick-doc/package.json index 2fd39214a..6897a3333 100644 --- a/quick-doc/package.json +++ b/quick-doc/package.json @@ -10,8 +10,8 @@ "preview": "vite preview" }, "dependencies": { + "@publicodes/react-ui": "^1.0.0-rc.5", "publicodes": "^1.0.0-rc.5", - "publicodes-react": "^1.0.0-beta.77", "react": "^18.2.0", "react-dom": "^18.2.0", "react-markdown": "^9.0.1", diff --git a/quick-doc/src/App.tsx b/quick-doc/src/App.tsx index f334f5934..6187168ac 100644 --- a/quick-doc/src/App.tsx +++ b/quick-doc/src/App.tsx @@ -1,6 +1,6 @@ import Engine from 'publicodes' import './App.css' -import { RulePage } from 'publicodes-react' +import { RulePage } from '@publicodes/react-ui' import { Link, Route, diff --git a/quick-doc/yarn.lock b/quick-doc/yarn.lock index 502a6b85e..fd4c3fece 100644 --- a/quick-doc/yarn.lock +++ b/quick-doc/yarn.lock @@ -213,7 +213,7 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@emotion/is-prop-valid@^1.2.1": +"@emotion/is-prop-valid@1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== @@ -225,10 +225,10 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== -"@emotion/unitless@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== +"@emotion/unitless@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== "@esbuild/android-arm64@0.19.9": version "0.19.9" @@ -444,6 +444,13 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@publicodes/react-ui@^1.0.0-rc.5": + version "1.0.0-rc.5" + resolved "https://registry.yarnpkg.com/@publicodes/react-ui/-/react-ui-1.0.0-rc.5.tgz#b37a5e533dce66b49e2878b7bfb07996b8477c79" + integrity sha512-J8duvgVyStZkZHR5zfRz0Lxoc62KFTMMk+aoMcKaF2uGz/VHxy1+oaz1qhwJv5VYPezDt2GrmY6D3lIwG8cuuA== + dependencies: + styled-components "^6.1.1" + "@remix-run/router@1.14.0": version "1.14.0" resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.14.0.tgz#9bc39a5a3a71b81bdb310eba6def5bc3966695b7" @@ -621,10 +628,10 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.6.tgz#c65b2bfce1bec346582c07724e3f8c1017a20339" integrity sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A== -"@types/stylis@^4.0.2": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.4.tgz#14b61f022e832d87d442ae1795e0f0f0b7daa879" - integrity sha512-36ZrGJ8fgtBr6nwNnuJ9jXIj+bn/pF6UoqmrQT7+Y99+tFFeHHsoR54+194dHdyhPjgbeoNz3Qru0oRt0l6ASQ== +"@types/stylis@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" + integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== "@types/unist@*", "@types/unist@^3.0.0": version "3.0.2" @@ -931,7 +938,7 @@ css-color-keywords@^1.0.0: resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== -css-to-react-native@^3.2.0: +css-to-react-native@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== @@ -940,7 +947,12 @@ css-to-react-native@^3.2.0: css-color-keywords "^1.0.0" postcss-value-parser "^4.0.2" -csstype@^3.0.2, csstype@^3.1.2: +csstype@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +csstype@^3.0.2: version "3.1.3" resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -1834,7 +1846,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nanoid@^3.3.7: +nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -1938,7 +1950,16 @@ postcss-value-parser@^4.0.2: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.31, postcss@^8.4.32: +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.4.32: version "8.4.32" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== @@ -1957,13 +1978,6 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== -publicodes-react@^1.0.0-beta.77: - version "1.0.0-beta.77" - resolved "https://registry.yarnpkg.com/publicodes-react/-/publicodes-react-1.0.0-beta.77.tgz#da9550b4fd8cbebc330336a11e6831317ece7db1" - integrity sha512-6DigDTzhiSDWG3MPuHe022ef7Vs1JLxezeH41bbjHT91I7xh2x2zTAFVlanyFSMm8QO0GhA9micCHkBUzfAIsw== - dependencies: - styled-components "^6.0.8" - publicodes@^1.0.0-rc.5: version "1.0.0-rc.5" resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.5.tgz#714a600ccaa78ad89da878973999402e29996130" @@ -2114,7 +2128,7 @@ semver@^7.5.4: dependencies: lru-cache "^6.0.0" -shallowequal@^1.1.0: +shallowequal@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== @@ -2173,25 +2187,25 @@ style-to-object@^1.0.0: dependencies: inline-style-parser "0.2.2" -styled-components@^6.0.8: - version "6.1.1" - resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.1.tgz#a5414ada07fb1c17b96a26a05369daa4e2ad55e5" - integrity sha512-cpZZP5RrKRIClBW5Eby4JM1wElLVP4NQrJbJ0h10TidTyJf4SIIwa3zLXOoPb4gJi8MsJ8mjq5mu2IrEhZIAcQ== - dependencies: - "@emotion/is-prop-valid" "^1.2.1" - "@emotion/unitless" "^0.8.0" - "@types/stylis" "^4.0.2" - css-to-react-native "^3.2.0" - csstype "^3.1.2" - postcss "^8.4.31" - shallowequal "^1.1.0" - stylis "^4.3.0" - tslib "^2.5.0" - -stylis@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.0.tgz#abe305a669fc3d8777e10eefcfc73ad861c5588c" - integrity sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ== +styled-components@^6.1.1: + version "6.1.6" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.6.tgz#c75c4f994136545b3bcc11608db5363710b78c0e" + integrity sha512-DgTLULSC29xpabJ24bbn1+hulU6vvGFQf4RPwBOJrm8WJFnN42yXpo5voBt3jDSJBa5tBd1L6PqswJjQ0wRKdg== + dependencies: + "@emotion/is-prop-valid" "1.2.1" + "@emotion/unitless" "0.8.0" + "@types/stylis" "4.2.0" + css-to-react-native "3.2.0" + csstype "3.1.2" + postcss "8.4.31" + shallowequal "1.1.0" + stylis "4.3.1" + tslib "2.5.0" + +stylis@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" + integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== supports-color@^5.3.0: version "5.5.0" @@ -2239,10 +2253,10 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== -tslib@^2.5.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" From 21fb5bad3119e42e4439f7070410ac3b054b0b5c Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 8 Jan 2024 16:52:50 +0100 Subject: [PATCH 15/45] pkg: upgrade to publicodes rc.6 --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 86679c4ba..224a69ada 100644 --- a/yarn.lock +++ b/yarn.lock @@ -803,10 +803,10 @@ publicodes@1.0.0-beta.77: resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-beta.77.tgz#45e3c4d2a46bfadcc932e1405ea037e659c28134" integrity sha512-F8U3WGUWMo3/rxhWYS1gWIiG20g1Yy/+PpXdHM99d6ZHKWnnyh/4txVEuyVE75glgDs+mTjwZPnmoKWsTMXluA== -publicodes@^1.0.0-rc.5: - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.5.tgz#714a600ccaa78ad89da878973999402e29996130" - integrity sha512-y5ZxhiBDf/GjSPE9iwoSlcwFNogqhxwl45LrVrGuWeIORgdALTdtHQaPgItQpaKVRSdsZei2GoCnsAIfqLCTJw== +publicodes@^1.0.0-rc.6: + version "1.0.0-rc.6" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.6.tgz#c102984a8c9dad599c56a8b9a00ccaf599b6a581" + integrity sha512-fT5KB+zSEUE0PfO76zpId4w1BVSEhAM27zZ1c5MPz9wwkRjDWLijHwyt90C9lkzRQ2OvatEkMXbAmRegQ/gKVA== qs@^6.4.0: version "6.11.2" From 99773dd5de562eceaac89cf175942fd23667c60c Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Tue, 9 Jan 2024 16:54:07 +0100 Subject: [PATCH 16/45] fix(build): use publicodes rc.7 --- data/actions/alimentation.publicodes | 9 +++------ data/actions/divers.publicodes | 21 +++++++++------------ tests/commons.mjs | 5 ++++- yarn.lock | 8 ++++---- 4 files changed, 20 insertions(+), 23 deletions(-) diff --git a/data/actions/alimentation.publicodes b/data/actions/alimentation.publicodes index a721b3c96..649e61bea 100644 --- a/data/actions/alimentation.publicodes +++ b/data/actions/alimentation.publicodes @@ -103,6 +103,8 @@ alimentation . viande faible empreinte . par semaine . nouveau régime . compens unité: kgCO2e/semaine note: On compense la suppression des plat viande 2 en plat viande 1. +alimentation . réduire poisson: + alimentation . réduire poisson . max 2 par semaine: applicable si: nombre de plats poisson > 2 repas/semaine action: @@ -490,12 +492,7 @@ alimentation . déchets . devenir zéro déchet . recalcul: formule: valeur: alimentation . déchets contexte: - alimentation . déchets . quantité jetée: "'zéro déchet'" - -alimentation . boisson . sucrées . facteur sirops: - formule: 0.100 - unité: kgCO2e/l - note: Facteur d'émission issu d'[Agribalyse, boisson préparée à partir de sirop](https://agribalyse.ademe.fr/app/aliments/18058#Boisson_pr%C3%A9par%C3%A9e_%C3%A0_partir_de_sirop_%C3%A0_diluer_type_menthe,_fraise,_etc,_sucr%C3%A9,_dilu%C3%A9_dans_l'eau), 0.10 kgCO2e/kg. On considère que la masse volumique est de 1kg/l. + alimentation . déchets . quantité jetée: "'zéro déchet'" alimentation . déchets . réduire gaspillage: titre: Réduire le gaspillage alimentaire diff --git a/data/actions/divers.publicodes b/data/actions/divers.publicodes index 2d1c8b7a1..567bf0c60 100644 --- a/data/actions/divers.publicodes +++ b/data/actions/divers.publicodes @@ -157,10 +157,9 @@ divers . produits consommables . réduire: divers . produits consommables . réduire . recalcul: formule: - recalcul: - règle: produits consommables - avec: - produits consommables . consommation: "'faible'" + valeur: produits consommables + contexte: + produits consommables . consommation: "'faible'" divers . autres produits . réduire: non applicable si: autres produits . niveau de dépenses = "'faible'" @@ -173,10 +172,9 @@ divers . autres produits . réduire: divers . autres produits . réduire . recalcul: formule: - recalcul: - règle: autres produits - avec: - autres produits . niveau de dépenses: "'faible'" + valeur: autres produits + contexte: + autres produits . niveau de dépenses: "'faible'" divers . arrêter sport motorisé: inactive: oui @@ -190,7 +188,6 @@ divers . arrêter sport motorisé: divers . arrêter sport motorisé . recalcul: formule: - recalcul: - règle: divers . loisirs . sports - avec: - divers . loisirs . sports . sports énergivores . présent: non + valeur: divers . loisirs . sports + contexte: + divers . loisirs . sports . sports énergivores . présent: non diff --git a/tests/commons.mjs b/tests/commons.mjs index ab3f9d568..9411b3e5c 100644 --- a/tests/commons.mjs +++ b/tests/commons.mjs @@ -95,7 +95,10 @@ export function getPersonasFromAPI(version, region, lang) { } export function testPersonas(rules, personas) { - const engine = new Engine(rules, { logger: disabledLogger }) + const engine = new Engine(rules, { + logger: disabledLogger, + allowOrphanRules: true + }) const personasRules = Object.values(personas) const results = {} diff --git a/yarn.lock b/yarn.lock index 224a69ada..690644e33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -803,10 +803,10 @@ publicodes@1.0.0-beta.77: resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-beta.77.tgz#45e3c4d2a46bfadcc932e1405ea037e659c28134" integrity sha512-F8U3WGUWMo3/rxhWYS1gWIiG20g1Yy/+PpXdHM99d6ZHKWnnyh/4txVEuyVE75glgDs+mTjwZPnmoKWsTMXluA== -publicodes@^1.0.0-rc.6: - version "1.0.0-rc.6" - resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.6.tgz#c102984a8c9dad599c56a8b9a00ccaf599b6a581" - integrity sha512-fT5KB+zSEUE0PfO76zpId4w1BVSEhAM27zZ1c5MPz9wwkRjDWLijHwyt90C9lkzRQ2OvatEkMXbAmRegQ/gKVA== +publicodes@^1.0.0-rc.7: + version "1.0.0-rc.7" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.7.tgz#2ed0ce1d091674646477d5fd4d6411daaa283a0c" + integrity sha512-Y5WZ1t9BCRJxGFDsOflq0sFyryp7gFe05A9txHfvsW+DMjejnAgvC9O4enaU4+/4fI7+N62jxCWNsmStwqy/ZQ== qs@^6.4.0: version "6.11.2" From 80ce9f065147b5cc315e146b445eca073f9a4f05 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 22 Jan 2024 17:00:35 +0100 Subject: [PATCH 17/45] fix: use the new @publicodes/tools API --- scripts/modelOptim.mjs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/modelOptim.mjs b/scripts/modelOptim.mjs index c31350ef6..cbe695d76 100644 --- a/scripts/modelOptim.mjs +++ b/scripts/modelOptim.mjs @@ -6,7 +6,7 @@ import Engine from 'publicodes' import path from 'path' import { readFileSync, writeFileSync } from 'fs' -import { disabledLogger, getRawNodes } from '@publicodes/tools' +import { disabledLogger, serializeParsedRules } from '@publicodes/tools' import { constantFolding } from '@publicodes/tools/optims' // Rule names which should be kept in the optimized model. @@ -38,7 +38,7 @@ export function compressRules(engine, jsonPathWithoutExtension) { ruleNode.rawNode.type === 'notification' ) } - const foldedRules = getRawNodes(constantFolding(engine, toKeep)) + const foldedRules = serializeParsedRules(constantFolding(engine, toKeep)) writeFileSync(destPath, JSON.stringify(foldedRules, null, 2)) return Object.keys(foldedRules).length @@ -67,7 +67,7 @@ export function constantFoldingFromJSONFile( const engine = new Engine(rules, { logger: disabledLogger }) log('Constant folding pass...') - const foldedRules = getRawNodes(constantFolding(engine, toKeep)) + const foldedRules = serializeParsedRules(constantFolding(engine, toKeep)) log(`Writing in '${jsonDestPath}'...`) writeFileSync(jsonDestPath, JSON.stringify(foldedRules, null, 2)) From 2a802f0c7f36f67067282b00df747eafa817189a Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Wed, 24 Jan 2024 09:57:10 +0100 Subject: [PATCH 18/45] pkg(quick-doc): upgrade publicodes --- quick-doc/package.json | 2 +- quick-doc/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/quick-doc/package.json b/quick-doc/package.json index 6897a3333..8fe4064c2 100644 --- a/quick-doc/package.json +++ b/quick-doc/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@publicodes/react-ui": "^1.0.0-rc.5", - "publicodes": "^1.0.0-rc.5", + "publicodes": "^1.0.0-rc.7", "react": "^18.2.0", "react-dom": "^18.2.0", "react-markdown": "^9.0.1", diff --git a/quick-doc/yarn.lock b/quick-doc/yarn.lock index fd4c3fece..246e7e3ee 100644 --- a/quick-doc/yarn.lock +++ b/quick-doc/yarn.lock @@ -1978,10 +1978,10 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== -publicodes@^1.0.0-rc.5: - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.5.tgz#714a600ccaa78ad89da878973999402e29996130" - integrity sha512-y5ZxhiBDf/GjSPE9iwoSlcwFNogqhxwl45LrVrGuWeIORgdALTdtHQaPgItQpaKVRSdsZei2GoCnsAIfqLCTJw== +publicodes@^1.0.0-rc.7: + version "1.0.0-rc.7" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.7.tgz#2ed0ce1d091674646477d5fd4d6411daaa283a0c" + integrity sha512-Y5WZ1t9BCRJxGFDsOflq0sFyryp7gFe05A9txHfvsW+DMjejnAgvC9O4enaU4+/4fI7+N62jxCWNsmStwqy/ZQ== punycode@^2.1.0: version "2.3.1" From 5ec341da1a4559707e3dc2323b3e47f8735ab705 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Thu, 25 Jan 2024 16:01:49 +0100 Subject: [PATCH 19/45] =?UTF-8?q?fix(personas):=20nuit=C3=A9s=20->=20nuit?= =?UTF-8?q?=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- personas/personas-fr.yaml | 36 ++++++++++++++++++------------------ test.ts | 9 +++++++++ 2 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 test.ts diff --git a/personas/personas-fr.yaml b/personas/personas-fr.yaml index d3c8a3b7e..25c27341d 100644 --- a/personas/personas-fr.yaml +++ b/personas/personas-fr.yaml @@ -110,8 +110,8 @@ personas . yoram: logement . vacances . résidence secondaire . présent: non # logement . vacances . résidence secondaire . localisation # logement . vacances . résidence secondaire . surface - # logement . vacances . résidence secondaire . durée . nuités week end . nombre - # logement . vacances . résidence secondaire . durée . nuités semaine . nombre + # logement . vacances . résidence secondaire . durée . nuitées week end . nombre + # logement . vacances . résidence secondaire . durée . nuiténes semaine . nombre # logement . vacances . résidence secondaire . saison # logement . baisse température . nombre degrés # logement . chauffage . biogaz . part @@ -384,8 +384,8 @@ personas . corentin: # logement . vacances . résidence secondaire . présent # logement . vacances . résidence secondaire . localisation # logement . vacances . résidence secondaire . surface - # logement . vacances . résidence secondaire . durée . nuités week end . nombre - # logement . vacances . résidence secondaire . durée . nuités semaine . nombre + # logement . vacances . résidence secondaire . durée . nuitées week end . nombre + # logement . vacances . résidence secondaire . durée . nuitées semaine . nombre # logement . vacances . résidence secondaire . saison transport . avion . usager: non transport . mobilité douce . vélo . présent: oui @@ -498,8 +498,8 @@ personas . sandy: logement . vacances . résidence secondaire . présent: non # logement . vacances . résidence secondaire . localisation # logement . vacances . résidence secondaire . surface - # logement . vacances . résidence secondaire . durée . nuités week end . nombre - # logement . vacances . résidence secondaire . durée . nuités semaine . nombre + # logement . vacances . résidence secondaire . durée . nuitées week end . nombre + # logement . vacances . résidence secondaire . durée . nuitées semaine . nombre # logement . vacances . résidence secondaire . saison # logement . baisse température . nombre degrés # logement . température @@ -737,8 +737,8 @@ personas . mehdi: logement . vacances . résidence secondaire . présent: oui logement . vacances . résidence secondaire . localisation: "'montagne'" logement . vacances . résidence secondaire . surface: 60 - logement . vacances . résidence secondaire . durée . nuités week end . nombre: 0 - logement . vacances . résidence secondaire . durée . nuités semaine . nombre: 3 + logement . vacances . résidence secondaire . durée . nuitées week end . nombre: 0 + logement . vacances . résidence secondaire . durée . nuitées semaine . nombre: 3 logement . vacances . résidence secondaire . saison: "'surtout hiver'" logement . piscine . présent: oui logement . piscine . surface: 40 @@ -989,8 +989,8 @@ personas . sylviane: # logement . vacances . résidence secondaire . présent # logement . vacances . résidence secondaire . localisation # logement . vacances . résidence secondaire . surface - # logement . vacances . résidence secondaire . durée . nuités week end . nombre - # logement . vacances . résidence secondaire . durée . nuités semaine . nombre + # logement . vacances . résidence secondaire . durée . nuitées week end . nombre + # logement . vacances . résidence secondaire . durée . nuitées semaine . nombre # logement . vacances . résidence secondaire . saison divers . électroménager . préservation: "'moyen'" divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 @@ -1206,8 +1206,8 @@ personas . jessica: # logement . vacances . résidence secondaire . présent # logement . vacances . résidence secondaire . localisation # logement . vacances . résidence secondaire . surface - # logement . vacances . résidence secondaire . durée . nuités week end . nombre - # logement . vacances . résidence secondaire . durée . nuités semaine . nombre + # logement . vacances . résidence secondaire . durée . nuitées week end . nombre + # logement . vacances . résidence secondaire . durée . nuitées semaine . nombre # logement . vacances . résidence secondaire . saison divers . électroménager . préservation: "'moyen'" divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 @@ -1419,8 +1419,8 @@ personas . nolan: logement . vacances . résidence secondaire . présent: oui logement . vacances . résidence secondaire . localisation: "'littoral nord-ouest'" logement . vacances . résidence secondaire . surface: 55 - logement . vacances . résidence secondaire . durée . nuités week end . nombre: 7 - logement . vacances . résidence secondaire . durée . nuités semaine . nombre: 4 + logement . vacances . résidence secondaire . durée . nuitées week end . nombre: 7 + logement . vacances . résidence secondaire . durée . nuitées semaine . nombre: 4 logement . vacances . résidence secondaire . saison: "'surtout été'" divers . électroménager . préservation: "'faible'" divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 @@ -1549,8 +1549,8 @@ personas . anne claire: logement . vacances . résidence secondaire . présent: non # logement . vacances . résidence secondaire . localisation # logement . vacances . résidence secondaire . surface - # logement . vacances . résidence secondaire . durée . nuités week end . nombre - # logement . vacances . résidence secondaire . durée . nuités semaine . nombre + # logement . vacances . résidence secondaire . durée . nuitées week end . nombre + # logement . vacances . résidence secondaire . durée . nuitées semaine . nombre # logement . vacances . résidence secondaire . saison logement . climatisation . présent: oui logement . climatisation . nombre: 1 @@ -1825,8 +1825,8 @@ personas . gerard: logement . vacances . résidence secondaire . présent: non # logement . vacances . résidence secondaire . localisation # logement . vacances . résidence secondaire . surface - # logement . vacances . résidence secondaire . durée . nuités week end . nombre - # logement . vacances . résidence secondaire . durée . nuités semaine . nombre + # logement . vacances . résidence secondaire . durée . nuitées week end . nombre + # logement . vacances . résidence secondaire . durée . nuitées semaine . nombre # logement . vacances . résidence secondaire . saison # logement . baisse température . nombre degrés # logement . température diff --git a/test.ts b/test.ts new file mode 100644 index 000000000..1808cb460 --- /dev/null +++ b/test.ts @@ -0,0 +1,9 @@ +import base from './public/co2-model.FR-lang.fr.json' +import opti from './public/co2-model.FR-lang.fr-opti.json' +import Engine from 'publicodes' + +const baseEngine = new Engine(base) +const optiEngine = new Engine(opti, { allowOrphanRules: true }) + +console.log(baseEngine.evaluate('alimentation . déchets . composter').nodeValue) +console.log(optiEngine.evaluate('alimentation . déchets . composter').nodeValue) From feef9d1403e2a91602373a460f2f5b4e35df3cca Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Thu, 25 Jan 2024 16:02:29 +0100 Subject: [PATCH 20/45] test: tests all rules of all personas for the optim --- tests/commons.mjs | 12 +++++- tests/testOptim.mjs | 89 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 84 insertions(+), 17 deletions(-) diff --git a/tests/commons.mjs b/tests/commons.mjs index 9411b3e5c..a37b10a95 100644 --- a/tests/commons.mjs +++ b/tests/commons.mjs @@ -38,6 +38,11 @@ export function getArgs() { description: 'The version of the model to test agains (default: nightly)', default: 'nightly' }) + .option('persona', { + alias: 'p', + type: 'string', + description: 'Test only one persona' + }) .help('h') .alias('h', 'help').argv @@ -110,7 +115,10 @@ export function testPersonas(rules, personas) { } } engine.setSituation(personaData) - results[persona.nom] = engine.evaluate('bilan').nodeValue + results[persona.nom] = {} + for (const rule in rules) { + results[persona.nom][rule] = engine.evaluate(rule).nodeValue + } } return results @@ -137,7 +145,7 @@ export function printResults( console.log('|-----:|:------:|:------:|:----:|') } else { const title = withOptim - ? 'Test model optimisation' + ? "Test model optimisation (only evaluating 'bilan')" : `Test personas regression against ${c.green(version)}` console.log(`[ ${title} ]\n`) } diff --git a/tests/testOptim.mjs b/tests/testOptim.mjs index 9493b1500..0d7bce9f6 100644 --- a/tests/testOptim.mjs +++ b/tests/testOptim.mjs @@ -1,20 +1,79 @@ -import { - testPersonas, - printResults, - getArgs, - getLocalRules, - getLocalPersonas -} from './commons.mjs' +import { disabledLogger } from '@publicodes/tools' +import c from 'ansi-colors' +import Engine from 'publicodes' -const { country, language, markdown, version } = getArgs() +import { getArgs, getLocalRules, getLocalPersonas } from './commons.mjs' -const localRules = getLocalRules(country, language) -const localPersonas = getLocalPersonas(country, language) +const { country, language, markdown, persona: personaOpt } = getArgs() -const optimLocalRules = getLocalRules(country, language, true) +const baseRules = await getLocalRules(country, language) +let localPersonas = await getLocalPersonas(country, language) -Promise.all([optimLocalRules, localPersonas, localRules]).then((res) => { - const optimResults = testPersonas(res[0], res[1]) - const baseResults = testPersonas(res[2], res[1]) - printResults(optimResults, baseResults, markdown, version, true) +if (personaOpt && personaOpt in localPersonas) { + localPersonas = { [personaOpt]: localPersonas[personaOpt] } +} + +const optimRules = await getLocalRules(country, language, true) + +const baseEngine = new Engine(baseRules, { logger: disabledLogger }) +const optimEngine = new Engine(optimRules, { + logger: disabledLogger, + allowOrphanRules: true }) + +const nbRules = Object.keys(optimRules).length + +for (const personaName in localPersonas) { + const persona = localPersonas[personaName] + const errors = [] + + if (markdown) { + console.log(`**${personaName}**`) + } else { + console.log(`[ Test model optimisation (${personaName}) ]`) + } + + try { + baseEngine.setSituation(persona.situation || {}) + optimEngine.setSituation(persona.situation || {}) + } catch (e) { + if (markdown) { + console.log(`\`\`\`${e.message}\`\`\`\n`) + } else { + console.log(`${c.red('ERR')}`) + console.log(`${e.message}\n`) + } + continue + } + for (const rule in optimRules) { + try { + const base = baseEngine.evaluate(rule).nodeValue + const optim = optimEngine.evaluate(rule).nodeValue + if (base !== optim) { + errors.push({ rule, base, optim }) + } + } catch (e) { + errors.push({ rule, base: e.message, optim: null }) + } + } + + if (markdown) { + console.log(`| Règle | base | optim |`) + console.log(`| :-- | :-- | :-- |`) + for (const error of errors) { + console.log(`| ${error.rule} | ${error.base} | ${error.optim} |`) + } + } else { + for (const error of errors) { + console.log( + `${c.magenta(error.rule)}: ${error.base} !== ${error.optim}\n` + ) + } + + console.log( + `${errors.length > 0 ? c.red('FAIL') : c.green('OK')} ${ + nbRules - errors.length + }/${nbRules}\n` + ) + } +} From 5aca0f4526cd720b36d7276068a0d04f94644549 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Fri, 2 Feb 2024 12:39:15 +0100 Subject: [PATCH 21/45] feat(scripts): don't serialize JSON files with whitespaces to save memory --- scripts/modelOptim.mjs | 4 ++-- scripts/rulesToJSON.worker.mjs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/modelOptim.mjs b/scripts/modelOptim.mjs index cbe695d76..39e897198 100644 --- a/scripts/modelOptim.mjs +++ b/scripts/modelOptim.mjs @@ -40,8 +40,6 @@ export function compressRules(engine, jsonPathWithoutExtension) { } const foldedRules = serializeParsedRules(constantFolding(engine, toKeep)) - writeFileSync(destPath, JSON.stringify(foldedRules, null, 2)) - return Object.keys(foldedRules).length } /** @@ -75,4 +73,6 @@ export function constantFoldingFromJSONFile( } catch (error) { return { err } } + writeFileSync(destPath, JSON.stringify(foldedRules)) + return Object.keys(foldedRules).length } diff --git a/scripts/rulesToJSON.worker.mjs b/scripts/rulesToJSON.worker.mjs index af07f617f..28fb4efec 100644 --- a/scripts/rulesToJSON.worker.mjs +++ b/scripts/rulesToJSON.worker.mjs @@ -18,7 +18,7 @@ function getStyledReportString(name, verb, nbRules, duration) { function writeRules(rules, path, destLang, regionCode, markdown) { try { const start = Date.now() - fs.writeFileSync(path, JSON.stringify(rules, null, 2)) + fs.writeFileSync(path, JSON.stringify(rules)) const timeElapsed = Date.now() - start if (!markdown) { console.log( From d2ffca5d54e772857c75e38321fb84ba199f4d4e Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 12:32:11 +0100 Subject: [PATCH 22/45] refactor(rules)!: recalcul -> contexte --- data/actions/logement.publicodes | 50 +- data/actions/transport.publicodes | 609 ------------------- data/actions/transport/boulot.publicodes | 48 +- data/actions/transport/deux roues.publicodes | 8 +- data/actions/transport/voiture.publicodes | 62 +- 5 files changed, 66 insertions(+), 711 deletions(-) delete mode 100644 data/actions/transport.publicodes diff --git a/data/actions/logement.publicodes b/data/actions/logement.publicodes index 7e6347099..da2dc1139 100644 --- a/data/actions/logement.publicodes +++ b/data/actions/logement.publicodes @@ -173,13 +173,11 @@ logement . se chauffer au bois: Nous pourrons par la suite l'adapter en fonction du rendement des installations résidentielles. logement . se chauffer au bois . recalcul: - formule: - recalcul: - règle: logement . chauffage . bois . empreinte - avec: - logement . chauffage . bois . présent: oui - logement . chauffage . bois . type: "'granulés'" - logement . chauffage . bois . type . granulés . consommation: recalcul . consommation + valeur: logement . chauffage . bois . empreinte + contexte: + logement . chauffage . bois . présent: oui + logement . chauffage . bois . type: "'granulés'" + logement . chauffage . bois . type . granulés . consommation: recalcul . consommation note: On considère un chauffage via granulés. logement . se chauffer au bois . recalcul . consommation: @@ -527,34 +525,26 @@ logement . mutualiser son logement . empreinte partagée: - divers . ameublement logement . mutualiser son logement . empreinte partagée . logement: - formule: - recalcul: - règle: logement - avec: - logement . habitants: logement . habitants + nombre colocataires - logement . vacances: 0 + valeur: logement + contexte: + logement . saisie habitants: logement . habitants + nombre colocataires + logement . vacances: 0 note: On fait l'hypothèse que les vacances ne seront pas partagées avec le nouveau colocataire. logement . mutualiser son logement . empreinte partagée . divers: logement . mutualiser son logement . empreinte partagée . divers . numérique: - formule: - recalcul: - règle: divers . numérique . appareils - avec: - logement . habitants: logement . habitants + nombre colocataires + valeur: divers . numérique . appareils + contexte: + logement . saisie habitants: logement . habitants + nombre colocataires logement . mutualiser son logement . empreinte partagée . divers . électroménager: - formule: - recalcul: - règle: divers . électroménager . appareils - avec: - logement . habitants: logement . habitants + nombre colocataires + valeur: divers . électroménager . appareils + contexte: + logement . saisie habitants: logement . habitants + nombre colocataires logement . mutualiser son logement . empreinte partagée . divers . ameublement: - formule: - recalcul: - règle: divers . ameublement - avec: - logement . habitants: logement . habitants + nombre colocataires - divers . ameublement . meubles . matelas: 0 - divers . ameublement . meubles . lit: 0 + valeur: divers . ameublement + contexte: + logement . saisie habitants: logement . habitants + nombre colocataires + divers . ameublement . meubles . matelas: 0 + divers . ameublement . meubles . lit: 0 diff --git a/data/actions/transport.publicodes b/data/actions/transport.publicodes deleted file mode 100644 index 166ccff01..000000000 --- a/data/actions/transport.publicodes +++ /dev/null @@ -1,609 +0,0 @@ -transport . arrêter l'avion: - icônes: 🛬🧳 - applicable si: - toutes ces conditions: - - est défini: avion . usager - - avion . usager - action: - dépasse: - - transport . arrêter l'avion court - - transport . prendre moins l'avion - formule: transport . avion - description: | - L'avion a une empreinte importante sur le climat. - - Elle ne se limite pas aux seules émissions de CO₂, qui n'est qu'un gaz à effet de serre parmi d'autres. - - L'empreinte totale de l'avion est estimée à environ 2x celle du CO₂. - - Voir le [calculateur transport](https://monimpacttransport.fr) pour visualiser cette empreinte et la comparer aux autres moyens de transport. - - aller plus loin: | - ## Forçage radiatif total - - L'avion a un impact important sur le climat à la fois à cause de ses émissions de CO₂ et d'autres effets (dit forçage radiatif additionnel). - - Du fait que les avions volent en haute altitude, la combustion du kérosène crée des traînées et perturbe les cycles d’autres gaz à effet de serre que le CO₂ (vapeur d'eau, eau condensée sous diverses formes, NOx et méthane qui, ensemble, produisent de l'ozone, etc.). - - Ce graphique montre la complexité des effects en jeu (et encore, tout n'y est pas). - - ![](https://www.uecna.eu/wp-content/uploads/2017/12/ilusion-diagram1.jpg) - - ## Avion vs voiture - - On entend souvent que ramenée au passager, elle est du même ordre que celle d'une voiture. C'est vrai, mais ce n'est qu'une partie de l'histoire. - - Premièrement, l'empreinte de la voiture elle-même est élevée. Comparer l'avion à la voiture ne rend pas ce premier vertueux. - - Deuxièmement, on ne peut comparer la voiture et l'avion simplement parce qu'un trajet en avion est en général bien plus long. Quand il s'agit de choisir la destination des vacances par exemple, un trajet en voiture a donc toutes les chances d'être beaucoup moins polluant. Cela dit, notons aussi que nos kilométrages en voiture sont tels que le match est relancé quand on regarde l'empreinte à l'année. - -transport . arrêter l'avion court: - titre: Privilégier le train au lieu de l'avion - icônes: 🛬🚆 - applicable si: - toutes ces conditions: - - est défini: avion . usager - - avion . usager - formule: transport . avion . court courrier + compensation train - # Mettre histogramme GES qui compare les trajets train vs avion. - description: | - L’avion a bouleversé nos modes de vies et nos façons de voyager. Nous pouvons maintenant aller plus loin, plus vite, plus fréquemment, mais ce n'est malheureusement pas sans contrepartie pour le climat. - - En effet, il existe notamment un rapport de 100 entre les facteurs d’émissions (quantité de CO₂ émise par km parcouru) d’un avion et d’un train. - - > À titre d’exemple, un aller-retour Paris-Marseille émet environ 300 kgCO2eq en avion contre seulement 2 kgCO2eq en train. - - C’est pourquoi adapter nos week-ends et nos vacances - en nous tournant vers des offres de mobilités bas carbone et/ou en repensant notre manière de voyager est essentiel si l’on souhaite tant à - l’échelle individuelle qu’à l’échelle de la société réduire notre impact sur le climat - - [Comparez les modes de transport ici](https://monimpacttransport.fr) - #chiffres clefs - #Un aller-retour Paris-Marseille émet environ 250 kgCO2eq en avion contre seulement 3 kgCO2eq en train (source Base Carbone) - #Choisir de se rendre, depuis Paris, à Barcelone (en train) plutôt qu’à Marrakech (en avion) permettra d’éviter d’émettre 781 kg de CO2eq (source Base Carbone) - -transport . arrêter l'avion court . compensation train: - formule: avion . court courrier . heures de vol * avion . court courrier . vitesse moyenne * ratio distance supplémentaire train * transport . train . impact par km - -transport . arrêter l'avion court . ratio distance supplémentaire train: - formule: 1.2 - note: On fait l'hypothèse qu'un trajet en train est 50% plus long (en distance) qu'un trajet en avion. - -transport . prendre moins l'avion: - titre: Prendre deux fois moins l'avion - icônes: 📉🛬 - applicable si: - toutes ces conditions: - - est défini: avion . usager - - avion . usager - action: - dépasse: - - transport . arrêter l'avion court - formule: transport . avion / 2 - description: | - > 💡 Essayez de faire au moins l'un des trajets vers votre destination en train ! - - L'avion a une empreinte importante sur le climat. - - Elle ne se limite pas aux seules émissions de CO₂, qui n'est qu'un gaz à effet de serre parmi d'autres. - - Voir le [calculateur transport](https://monimpacttransport.fr) pour visualiser cette empreinte et la comparer aux autres moyens de transport. - - aller plus loin: | - ## Forçage radiatif total - - L'avion a un impact important sur le climat à la fois à cause de ses émissions de CO₂ et d'autres effets (dit forçage radiatif additionnel). - - Du fait que les avions volent en haute altitude, la combustion du kérosène crée des traînées et perturbe les cycles d’autres gaz à effet de serre que le CO₂ (vapeur d'eau, eau condensée sous diverses formes, NOx et méthane qui, ensemble, produisent de l'ozone, etc.). - - Ce graphique montre la complexité des effects en jeu (et encore, tout n'y est pas). - - ![](https://www.uecna.eu/wp-content/uploads/2017/12/ilusion-diagram1.jpg) - - ## Avion vs voiture - - On entend souvent que ramenée au passager, elle est du même ordre que celle d'une voiture. C'est vrai, mais ce n'est qu'une partie de l'histoire. - - Premièrement, l'empreinte de la voiture elle-même est élevée. Comparer l'avion à la voiture ne rend pas ce premier vertueux. - - Deuxièmement, on ne peut comparer la voiture et l'avion simplement parce qu'un trajet en avion est en général bien plus long. Quand il s'agit de choisir la destination des vacances par exemple, un trajet en voiture a donc toutes les chances d'être beaucoup moins polluant. Cela dit, notons aussi que nos kilométrages en voiture sont tels que le match est relancé quand on regarde l'empreinte à l'année. - -transport . éco-conduite: - titre: Adopter une éco-conduite - applicable si: - toutes ces conditions: - - est défini: voiture . utilisateur régulier - - voiture . utilisateur régulier - icônes: 🚗☮ - formule: transport . voiture . empreinte calculée - transport . éco-conduite . recalcul - description: | - L’éco-conduite est une action simple et efficace qui se tient à la portée de tous. - - Elle permet notamment d'économiser en moyenne 15 % de carburant, - de réduire les coûts d’entretien du véhicule, de réduire le risque d’accident de 10 à 15 % en moyenne et de réaliser des économies substantielles pouvant - s’élever à plusieurs centaines d’euros. - - L’application de l’éco-conduite est d’autant plus pertinente en ville et en zone urbaine ou les arrêts et - le redémarrage sont fréquents. - note: | - Voir le [Guide de formation à l'éco-conduite ADEME-LaPoste](https://expertises.ademe.fr/air-mobilites/mobilite-transports/passer-a-laction/solutions-technologiques/dossier/optimiser-lutilisation-lentretien-vehicule/lecoconduite-attitude-a-adopter) - -transport . éco-conduite . recalcul: - note: Un recalcul est nécessaire ici, car l'utilisateur peut avoir utilisé l'outil d'aide à la saisie qui proratise alors la variable km au nombre de voyageurs. Sinon ce n'est pas le cas. - valeur: transport . voiture . empreinte calculée - contexte: - transport . voiture . usage: transport . éco-conduite . usage réduit - -transport . éco-conduite . usage réduit: - formule: (transport . voiture . km * transport . voiture . empreinte au kilomètre) * 0.85 - unité: kgCO2e - note: réduction de 15% (cf info règle éco-conduite) - -transport . covoiturage: - titre: Privilégier le covoiturage - applicable si: - toutes ces conditions: - - est défini: voiture . utilisateur régulier - - voiture . utilisateur régulier - action: - dépasse: - - transport . boulot . covoiturage - icônes: 🚗👥 - formule: voiture . km * voiture . empreinte au kilomètre * réduction covoiturage - description: | - Cette action concerne l'ensemble de ses trajets en voiture. - - Si le covoiturage longue distance est bien connu en France, celui des courtes distances est presque inexistant : aujourd’hui seuls 3 % des déplacements domicile-travail sont réalisés en covoiturage. - - Dans tous les cas, pensez à adapter votre mode de transport à la distance et à privilégier les modes doux ou transports en commun (bus, métro, vélo, marche, etc.) le plus possible. Le calculateur [Mon Impact Transport](https://monimpacttransport.fr/) vous permet de visualiser et comparer l'impact des différents modes de déplacement. - note: | - Voir l'article The Conversation [À quelles conditions le covoiturage sera-t-il un mode de transport durable ?](https://theconversation.com/a-quelles-conditions-le-covoiturage-sera-t-il-un-mode-de-transport-durable-124122) - -transport . boulot: - icônes: 🏢 -transport . boulot . covoiturage: - titre: Aller au travail en covoiturage - applicable si: - toutes ces conditions: - - est défini: voiture . utilisateur régulier - - voiture . utilisateur régulier - - voiture . km > seuil d'activation boulot - icônes: 🚗👥 - formule: distance * voiture . empreinte au kilomètre * réduction covoiturage - description: | - Si le covoiturage longue distance est bien connu en France, celui des courtes distances est presque inexistant : aujourd’hui seuls 3 % des déplacements domicile-travail sont réalisés en covoiturage. - - Sachez que depuis 2020, vous pouvez demander à votre employeur le [forfait mobilité durable](https://www.service-public.fr/particuliers/actualites/A14046), pour que votre covoiturage soit rémunéré jusqu'à 400€/an, exonérés d'impôt et de cotisations sociales ! - - Dans tous les cas, pensez à adapter votre mode de transport à la distance et à privilégier les modes doux ou transports en commun (bus, métro, vélo, marche, etc.) le plus possible. Le calculateur [Mon Impact Transport](https://monimpacttransport.fr/) vous permet de visualiser et comparer l'impact des différents modes de déplacement. - note: | - Voir l'article The Conversation [À quelles conditions le covoiturage sera-t-il un mode de transport durable ?](https://theconversation.com/a-quelles-conditions-le-covoiturage-sera-t-il-un-mode-de-transport-durable-124122) - -transport . réduction covoiturage: - formule: 20% - description: | - On pourrait naïvement penser que le covoiturage divise par 2 l'empreinte par personne. Mais en réalité, [une étude menée en Île-de-France](https://www.sciencedirect.com/science/article/pii/S1361920918303201) montre que les réductions sont plutôt de l'ordre de 20%... avant les effets rebonds, qui réduisent le gain final du covoiturage à seulement 6%. - - ![](https://images.theconversation.com/files/297327/original/file-20191016-98644-c9y1zz.png?ixlib=rb-1.1.0&q=30&auto=format&w=754&h=588&fit=crop&dpr=2) - note: | - Voir l'article The Conversation [À quelles conditions le covoiturage sera-t-il un mode de transport durable ?](https://theconversation.com/a-quelles-conditions-le-covoiturage-sera-t-il-un-mode-de-transport-durable-124122). - -transport . boulot . distance: - formule: semaines * hebdomadaire - unité: km - -transport . boulot . semaines: - formule: 47 - unité: semaine - description: 47 semaines, plutôt que 52 pour prendre en compte les 5 semaines de congés. - -transport . boulot . distance . hebdomadaire: - formule: km par jour * jours travaillés en voiture - unité: km/semaine - -transport . boulot . jours travaillés en voiture: - question: Combien de jours par semaine prenez-vous votre voiture pour aller au travail ? - par défaut: 4 - unité: jour/semaine - suggestions: - 0: 0 - 1: 1 - 2: 2 - 3: 3 - 4: 4 - 5: 5 - -transport . boulot . distance . km par jour: - titre: Distance aller-retour trajet domicile travail - formule: 2 trajet/jour * km aller - unité: km/jour - -transport . boulot . distance . km aller: - titre: Distance aller trajet domicile travail - question: A quelle distance de chez vous se situe votre travail ? - unité: km/trajet - description: | - Nous parlons ici de la distance *aller*, avec le mode de transport que vous privilégiez. - - 70% des travailleurs en France travaillent à moins de 15km de chez eux. - - 57% travaillent à moins de 10km et 78% à moins de 20km. - - Source : études INSEE 2004 et 2013, chiffres stables. - note: Mettre un lien vers l'étude et mettre à jour avec les statistiques de l'enquête déplacement 2020 si disponible. - par défaut: 10 - -transport . empreinte au km covoiturage: 0.2 kgCO2e/km - -transport . boulot . commun: - action: - dépasse: - - transport . boulot . covoiturage - - transport . boulot . télétravail - titre: Aller au travail autrement qu'en voiture - icônes: 🚌🚲 - description: | - Quand c'est possible, prendre les transports en commun ou des véhicules légers (marche à pied, vélo, trottinette personnelle, ...) pour aller au travail réduit notre empreinte climat, mais améliore aussi notre qualité de vie. - - [70%](https://www.ecologie-solidaire.gouv.fr/covoiturage-en-france-avantages-et-reglementationen-vigueur) des déplacements domicile-travail sont réalisés avec des véhicules individuels, la plupart seul dans sa voiture. C'est ce qu'on appelle l'auto-solisme. - - En plus d'émettre beaucoup de gaz à effet de serre cet auto-solisme déteriore la qualité de l'air de nos villes et donc notre santé, et encombre les voies urbaines. - - > A titre d'exemple les bouchons représentent en Île-de-France par an et par personne [163 heures perdues](https://www.tomtom.com/en_gb/traffic-index/paris-traffic) soit environ 6 jours. - - >💡 Le saviez-vous ? L'État et beaucoup de régions ou villes subventionnent les vélos mécaniques, électriques, cargo, pliants, etc. [Calculez votre aide 🚲️ en 3 clics](https://mesaidesvelo.fr). - - applicable si: voiture . km > seuil d'activation boulot - formule: - variations: - - si: - une de ces conditions: - - type = 'bus' - - type = 'TER' - - type = 'métro ou tramway' - alors: boulot . distance * gain empreinte au km - - si: type = 'vélo classique' - alors: recalcul vélo - - si: type = 'vélo électrique' - alors: recalcul vae - - si: type = 'trotinette électrique' - alors: recalcul autres véhicules à moteur - -transport . seuil d'activation boulot: - titre: Seuil d'activation actions liées aux trajets "Boulot" - description: | - Distance minimale pour déclencher cette action. - - > Si quelqu'un nous dit qu'il ne fait que 500km de voiture dans l'année, il y a peu de chances - > qu'il aille en voiture au boulot. - - Nous définitions la distance du seuil à 2km (trajet aller), pour 5 jours par semaine. - - formule: transport . boulot . distance - unité: km - -transport . boulot . commun . gain empreinte au km: - formule: voiture . empreinte au kilomètre - empreinte - -transport . boulot . commun . empreinte: - titre: Empreinte transport en commun choisi - formule: - variations: - - si: type = 'bus' - alors: bus . impact par km - - si: type = 'TER' - alors: train . TER - - si: type = 'métro ou tramway' - alors: métro ou tram . impact par km - unité: kgCO2e/km - note: | - On considère qu'un déplacement domicile travail effectué en voiture peut-être remplacé par un train régional et non par un TGV. - -transport . boulot . commun . type: - avec: - bus: - métro ou tramway: - TER: - vélo classique: - vélo électrique: - trotinette électrique: - question: Si vous deviez ne plus prendre votre voiture pour vous rendre au travail quel autre moyen de transport pourriez-vous utiliser ? - par défaut: "'bus'" - formule: - une possibilité: - choix obligatoire: oui - possibilités: - - bus - - métro ou tramway - - TER - - vélo classique - - vélo électrique - - trotinette électrique - -transport . boulot . recalcul vélo: - valeur: transport . mobilité douce . vélo - contexte: - transport . mobilité douce . vélo . présent: oui - -transport . boulot . recalcul vae: - valeur: transport . mobilité douce . vae - contexte: - transport . mobilité douce . vae . présent: oui - transport . mobilité douce . vae . km: transport . boulot . distance - -transport . boulot . recalcul autres véhicules à moteur: - valeur: transport . mobilité douce . autres véhicules à moteur - contexte: - transport . mobilité douce . autres véhicules à moteur . présent: oui - transport . mobilité douce . autres véhicules à moteur . km: transport . boulot . distance - -transport . boulot . télétravail: - titre: Faire du télétravail - icônes: 🏠💻 - description: | - Le télétravail permet d'éviter des déplacements journaliers pour se rendre au boulot. - - Il n'est évidemment pas possible pour de nombreux salariés, mais la crise sanitaire de 2020 a montré que beaucoup de métiers sont effectivement télétravaillables. - - Dans ce calcul, nous ne prenons en compte que les jours télétravaillés qui évitent un déplacement en voiture individuelle. - applicable si: - toutes ces conditions: - - compatible - - voiture . km > seuil d'activation boulot - - jours travaillés en voiture > 0 - formule: empreinte jour voiture * jours gagnés * transport . boulot . semaines - -transport . boulot . jours gagnés: - valeur: jours télétravaillés - plafond: jours travaillés en voiture - -transport . boulot . empreinte jour voiture: - formule: distance . km par jour * voiture . empreinte au kilomètre - unité: kgCO2e/jour - -transport . boulot . jours télétravaillés: - question: Combien de jours de télétravail par semaine pourriez-vous faire ? - par défaut: 1 - unité: jour/semaine - suggestions: - 1: 1 - 2: 2 - 3: 3 - 4: 4 - 5: 5 -# TODO introduire des contrôles (mise à jour de publicodes nécessaire) ici : pas de jours de télétravail supplémentaires à - -transport . boulot . télétravail . compatible: - question: Votre travail est-il totalement ou en partie compatible avec le télétravail ? - par défaut: oui - -transport . voiture 5km: - titre: Se passer de voiture pour moins de 5 km - icônes: 🚗🚲 - formule: transport . voiture . empreinte calculée - transport . voiture 5km . recalcul - applicable si: - toutes ces conditions: - - est défini: voiture . utilisateur régulier - - voiture . utilisateur régulier - non applicable si: voiture . km < seuil d'activation 5km - note: | - On fait l'hypothèse qu'une personne qui n'est pas propriétaire de voiture se passe *déjà* d'une voiture pour de courts trajets. - description: | - En France, 4 trajets en voiture sur 10 font moins de 3 km et ce n’est pas moins de 177 millions de trajets de moins de 5km qui sont réalisés seuls en voiture chaque semaine (hors trajets domicile-travail). - - L’ensemble de ces trajets « courts » mis bout à bout présentent, à l’échelle de la France, près de 10% de la distance totale parcourue en voiture chaque année. - - Ainsi, se tourner vers les mobilités actives (vélo, trottinette...) pour ces trajets « courts » permet de réduire de manière significative, nos émissions de GES - tout en décongestionnant les voies urbaines et en améliorant la qualité de l’air de nos villes polluées. - - > 💡 Le saviez-vous ? L'État et beaucoup de régions ou villes subventionnent les vélos mécaniques, électriques, cargo, pliants, etc. [Calculez votre aide 🚲️ en 3 clics](https://mesaidesvelo.fr). - # 4 trajets en voiture sur 10 font moins de 3 km + 10% de la distance totale parcourue = Transflash, N°398, Juin 2015, Cerema - # 177 millions de trajets de moins de 5km = consolidation depuis Enquête Nationale Transport et Déplacements (ENTD), MTES, 2008. - -transport . seuil d'activation 5km: - titre: Seuil d'activation actions liées aux courts trajets - description: | - Distance minimale pour déclencher cette action. - - > Si quelqu'un nous dit qu'il ne fait que 200km de voiture dans l'année, il y a peu de chances - > qu'il s'agisse de trajets de 5km. - - On définit cette valeur comme étant équivalente à 2 trajets de 5 km A/R par semaine. - formule: commun . semaines par an * 2 trajet/semaine * distance moyenne aller-retour trajet court - unité: km - -transport . distance moyenne aller-retour trajet court: - formule: distance moyenne trajet court - unité: km/trajet - -transport . distance moyenne trajet court: - formule: 2.5 - unité: km/trajet - description: Nous estimons simplement à 2,5km la moyenne de distance des trajets inférieurs à 5km. - -transport . voiture 5km . recalcul: - valeur: transport . voiture . empreinte calculée - contexte: - transport . voiture . usage: transport . voiture 5km . usage réduit - -transport . voiture 5km . usage réduit: - formule: (transport . voiture . km - distance totale) * transport . voiture . empreinte au kilomètre - unité: kgCO2e - -transport . voiture 5km . distance totale: - formule: - variations: - - si: distance totale renseignée > transport . voiture . km - alors: transport . voiture . km - - sinon: distance totale renseignée - -transport . voiture 5km . distance totale renseignée: - formule: fréquence * distance moyenne aller-retour trajet court * commun . semaines par an - -transport . voiture 5km . fréquence: - question: Combien de fois par semaine prenez-vous la voiture pour moins de 5km ? - description: | - Je vais chercher mon pain à 2km en voiture, cela représente un trajet. - Je vais au travail tous les jours du lundi au vendredi à 4km, c'est 5 trajets. - par défaut: 14 - unité: trajet/semaine - suggestions: - jamais: 0 - seulement le weekend: 2 - dans la semaine: 5 - chaque jour: 7 - deux trajets par jour: 14 - -transport . super ethanol: - inactive: oui - titre: Passer du sans-plomb au super éthanol - icônes: ⛽️🚗 - applicable si: transport . voiture . thermique . carburant = 'essence E5 et E10' - formule: transport . voiture . empreinte calculée - transport . super ethanol . recalcul avec surconsommation - description: | - Le Superéthanol E85 est le carburant essence sans plomb pouvant contenir entre 65% et 85% de bioéthanol, le complément étant de l’essence Sans Plomb 95. - Il est produit à partir de cultures de canne à sucre, de céréales (blé, maïs) et de betterave sucrière. - - L’E85 est un carburant compétitif : même en tenant compte de la surconsommation qu’il engendre, il permet une économie de 30 à 40 centimes par litre de SP95 remplacé. - Pour l'utliser, il est possible de faire modifier votre véhicule essence en faisant poser un boîtier de conversion homologué, pour environ 1000€, amortis après 20 000 à 25 000 kilomètres. - ![](https://www.francetvinfo.fr/pictures/KlhzqieXAJSG5N_Reou0UdhPLKM/0x667:800x2147/fit-in/720x/filters:format(webp)/2018/10/12/php6RnMqG.png) - note: Cette action est inactive. Au vu des problématiques liées au changement d'affectation des sols et autres impacts environnementaux liés à la culture du maïs par exemple, les **biocarburants** ne sont pas pris en compte (le facteur d'émission de la base carbone étant particulièrement incertain). Voir discussions [ici](https://github.com/datagir/nosgestesclimat/pull/1324) - -transport . super ethanol . recalcul: - valeur: transport . voiture . empreinte calculée - contexte: - transport . voiture . thermique . carburant: "'essence E85'" - -transport . super ethanol . taux surconsommation: - formule: 125% - note: Le superéthanol E85 est moins énergétique, donc fait grimper les litres consommés [de 15 à 25%](https://www.ledauphine.com/magazine-lifestyle/2020/02/02/ce-que-vous-devez-savoir-sur-le-superethanol-e85-avant-de-vous-lancer). - -transport . super ethanol . recalcul avec surconsommation: - formule: recalcul * taux surconsommation - -transport . scooter électrique: - titre: Changer pour un scooter électrique - icônes: 🔌🛵 - applicable si: - toutes ces conditions: - - est défini: transport . deux roues . usager - - transport . deux roues . usager - - transport . deux roues . type = 'scooter thermique' - formule: transport . deux roues - transport . scooter électrique . recalcul - description: | - Le scooter électrique n'est pas la solution miracle mais pour certains usages il peut s'avérer (très) utile pour réduire notre empreinte. - - Attention toutefois à ne pas arriver à la conclusion simpliste qu'il suffirait de passer à un parc de véhicules électriques pour décarboner les déplacements des français. - - La priorité doit être, quand c'est possible (55% de nos trajets [font moins de 5km](https://twitter.com/GlmMrt/status/1481986507179274248)), l'essor des mobilités actives (telles que le vélo) et des transports en commun. - - Néanmoins le chiffre que l'on vous présente correspond bien à la différence d'émissions de gaz à effet de serre qui aurait eu lieu si vous aviez parcouru vos km avec - un véhicule électrique et non thermique. - - Il faut également avoir en tête que l'idée ici n'est pas de pousser vers l'achat d'un scooter électrique neuf, il vaut mieux faire durer son matériel et privilégier l'occasion ! - -transport . scooter électrique . recalcul: - valeur: transport . deux roues - contexte: - transport . deux roues . type: "'scooter électrique'" - -transport . voiture électrique: - titre: Rouler en voiture électrique - icônes: 🔌🚗 - applicable si: - toutes ces conditions: - - est défini: voiture . utilisateur régulier - - voiture . utilisateur régulier - non applicable si: transport . voiture . motorisation = 'électrique' - formule: transport . voiture . empreinte calculée - transport . voiture électrique . recalcul - description: | - La voiture électrique n'est pas la solution miracle mais pour certains usages elle peut s'avérer (très) utile pour réduire notre empreinte. - - Attention toutefois à ne pas arriver à la conclusion simpliste qu'il suffirait de passer à un parc automobile électrique pour décarboner les déplacements des français. - - La priorité doit être, quand c'est possible (55% de nos trajets [font moins de 5km](https://twitter.com/GlmMrt/status/1481986507179274248)), l'essor des mobilités actives (telles que le vélo) et des transports en commun. - - Néanmoins le chiffre que l'on vous présente correspond bien à la différence d'émissions de gaz à effet de serre qui aurait eu lieu si vous aviez parcouru vos km avec - un véhicule électrique et non thermique. - note: | - Envisager de ne proposer cette action que si elle > 0 voire > à plusieurs centaines de kgCO2eq - -transport . voiture électrique . recalcul: - # transport . âge nouvelle voiture électrique: - # formule: - # variations: - # - si: occasion - # alors: 5 - # - sinon: 1 - # note: on considère que l'âge d'une voiture d'occasion est 5 ans. - - # transport . âge nouvelle voiture électrique . occasion: - # question: Envisagez-vous d'acheter une voiture électrique d'occasion plutôt que neuve ? - # description: | - # Une voiture électrique d'occasion coûte moins cher, évidemment. Elle vous permet ausi d'obtenir une [aide à l'achat](https://www.service-public.fr/particuliers/vosdroits/F34014). - - # L'autonomie de la batterie peut avoir baissé légèrement, mais rappelez-vous que l'immense majorité de nos trajets [font moins de 50km](https://twitter.com/GlmMrt/status/1481986507179274248) ! - - # par défaut: oui - # # L'action disparait quand l'impact climat devient positif - valeur: transport . voiture . empreinte calculée - contexte: - transport . voiture . motorisation: "'électrique'" - # transport . voiture . âge: transport . âge nouvelle voiture électrique - -transport . voiture . limitation autoroute: - titre: Passer de 130 à 110km/h - icônes: 🚗🛣️ - applicable si: - toutes ces conditions: - - est défini: voiture . utilisateur régulier - - voiture . utilisateur régulier - formule: réduction * empreinte autoroute - description: | - La convention citoyenne pour le climat a proposé en 2020 une réduction de la limitation de vitesse sur les autoroutes de 130km/h à 110km/h. - La proposition est détaillée [ici](https://propositions.conventioncitoyennepourleclimat.fr/objectif/reduire-les-emissions-des-gaz-a-effet-de-serre-sur-les-autoroutes-et-les-voies-rapides/#elementor-tab-title-1681). - - Suite à l'invasion de l'Ukraine par la Russie, l'Agence Internationale de l'Énergie en a fait [sa 1ère recommandation](https://www.iea.org/reports/a-10-point-plan-to-cut-oil-use) pour réduire nos achats de pétrole russe. - - Nous proposons ici une évalution de cette mesure basée sur votre situation précise. - -transport . voiture . limitation autoroute . réduction: - titre: Gain de consommation 130 -> 110 - formule: 25% - description: | - ![](https://imgur.com/NB9CUUt.jpg) - D'après ce graphique, par déduction graphique (nous n'avons pas encore remonté aux données [de l'étude](http://theses.univ-lyon2.fr/documents/getpart.php?id=1026&action=pdf), page 151 figure 26), on trouve les données ci-dessous. - - Diesel : 6.5 l/100 à 130km/h -> 4.75 à 110km/h - - Essence : 11.75 l/100 à 130km/h -> 8.65 à 110km/h - - Donc -27% en diesel et - 26% en essence en passant de 130 à 110. Nous retenons l'ordre de grandeur de 25%. - note: | - Il faudrait affiner ce calcul. - Quelques sources à investiguer pour le calcul. - - un citoyen qui fait son test pour une clio. Il trouve une réduction entre -20% et -50% ! - https://twitter.com/CptQwark_/status/1289499582871658499 - Un autre citoyen trouve plutôt -10% avec une plus grosse voiture. - - [Rapport du CGDD](), où nous n'avons pas trouvé pour l'instant l'explication du calcul de l'économie de CO₂ - - Aurélien Bigo qui critique le rapport du CGDD https://twitter.com/AurelienBigo/status/1276459283291439114, mais qui ne nous donne pas d'infos sur le calcul du CO₂ lui même. - - une autre évaluation, qui elle nous donne le calcul :) : https://twitter.com/Tomsawy22670318/status/1274257122373570565 - Attention, pour être rigoureux, comme évoqué dans ce dernier fil, il faut prendre en compte la distribution de la vitesse et la catégorie de voiture (présence d'une 6ème vitesse par exemple). On ne roule évidement pas tout le temps à 130. - -transport . voiture . empreinte autoroute: - formule: par km personne * km autoroute - unité: kgCO2e - -transport . km autoroute: - question: Combien de km à l'année faites-vous sur autoroute (à peu près) ? - unité: km - description: | - On parcourt environ 80 milliards de km / an sur autoroute (voiture). - suggestions: - Paris ⇄ Athènes: 6000 - Brest ⇄ Nice: 3000 - Paris ⇄ Marseille: 1600 - Bordeaux ⇄ Lyon: 1100 - par défaut: 1200 - note: | - Fil twitter intéressant sur le sujet: https://twitter.com/Tomsawy22670318/status/1274257124701462528. diff --git a/data/actions/transport/boulot.publicodes b/data/actions/transport/boulot.publicodes index 0d9b97ada..41b96067f 100644 --- a/data/actions/transport/boulot.publicodes +++ b/data/actions/transport/boulot.publicodes @@ -143,27 +143,21 @@ transport . boulot . sans voiture . type: - trotinette électrique transport . boulot . recalcul vélo: - formule: - recalcul: - règle: transport . mobilité douce . vélo - avec: - transport . mobilité douce . vélo . présent: oui + valeur: transport . mobilité douce . vélo + contexte: + transport . mobilité douce . vélo . présent: oui transport . boulot . recalcul vae: - formule: - recalcul: - règle: transport . mobilité douce . vae - avec: - transport . mobilité douce . vae . présent: oui - transport . mobilité douce . vae . km: transport . boulot . distance + valeur: transport . mobilité douce . vae + contexte: + transport . mobilité douce . vae . présent: oui + transport . mobilité douce . vae . km: transport . boulot . distance transport . boulot . recalcul autres véhicules à moteur: - formule: - recalcul: - règle: transport . mobilité douce . autres véhicules à moteur - avec: - transport . mobilité douce . autres véhicules à moteur . présent: oui - transport . mobilité douce . autres véhicules à moteur . km: transport . boulot . distance + valeur: transport . mobilité douce . autres véhicules à moteur + contexte: + transport . mobilité douce . autres véhicules à moteur . présent: oui + transport . mobilité douce . autres véhicules à moteur . km: transport . boulot . distance transport . boulot . télétravail: titre: Faire du télétravail @@ -229,17 +223,13 @@ transport . boulot . faire du covoiturage: Voir l'article The Conversation [À quelles conditions le covoiturage sera-t-il un mode de transport durable ?](https://theconversation.com/a-quelles-conditions-le-covoiturage-sera-t-il-un-mode-de-transport-durable-124122) transport . boulot . faire du covoiturage . empreinte boulot seul: - formule: - recalcul: - règle: transport . voiture - avec: - transport . voiture . voyageurs: 1 - transport . voiture . km: boulot . distance + valeur: transport . voiture + contexte: + transport . voiture . saisie voyageurs: 1 + transport . voiture . km: boulot . distance transport . boulot . faire du covoiturage . empreinte boulot covoiturage: - formule: - recalcul: - règle: transport . voiture - avec: - transport . voiture . voyageurs: boulot . covoiturage . nombre de voyageurs - transport . voiture . km: boulot . distance + valeur: transport . voiture + contexte: + transport . voiture . saisie voyageurs: boulot . covoiturage . nombre de voyageurs + transport . voiture . km: boulot . distance diff --git a/data/actions/transport/deux roues.publicodes b/data/actions/transport/deux roues.publicodes index 584a84990..a9b011b8f 100644 --- a/data/actions/transport/deux roues.publicodes +++ b/data/actions/transport/deux roues.publicodes @@ -20,8 +20,6 @@ transport . scooter électrique: Il faut également avoir en tête que l'idée ici n'est pas de pousser vers l'achat d'un scooter électrique neuf, il vaut mieux faire durer son matériel et privilégier l'occasion ! transport . scooter électrique . recalcul: - formule: - recalcul: - règle: transport . deux roues - avec: - transport . deux roues . type: "'scooter électrique'" + valeur: transport . deux roues + contexte: + transport . deux roues . type: "'scooter électrique'" diff --git a/data/actions/transport/voiture.publicodes b/data/actions/transport/voiture.publicodes index 1f8b8dffe..563c2b8cc 100644 --- a/data/actions/transport/voiture.publicodes +++ b/data/actions/transport/voiture.publicodes @@ -35,20 +35,16 @@ transport . limitation autoroute: Nous proposons ici une évalution de cette mesure basée sur votre situation précise. transport . limitation autoroute . empreinte autoroute: - formule: - recalcul: - règle: transport . voiture - avec: - transport . voiture . km: voiture . km * ratio autoroute + valeur: transport . voiture + contexte: + transport . voiture . km: voiture . km * ratio autoroute unité: kgCO2e transport . limitation autoroute . empreinte autoroute réduit: - formule: - recalcul: - règle: transport . voiture - avec: - transport . voiture . km: voiture . km * ratio autoroute - transport . voiture . usage: transport . voiture . usage * (1 - réduction) + valeur: transport . voiture + contexte: + transport . voiture . km: voiture . km * ratio autoroute + transport . voiture . usage: transport . voiture . usage * (1 - réduction) unité: kgCO2e transport . limitation autoroute . réduction: @@ -144,12 +140,10 @@ transport . autopartage . plafond activation autopartage: unité: km transport . autopartage . recalcul: - formule: - recalcul: - règle: transport . voiture - avec: - voiture . utilisateur régulier: non - voiture . km: voiture . km * (1 - 0.41) + valeur: transport . voiture + contexte: + voiture . utilisateur régulier: non + voiture . km: voiture . km * (1 - 0.41) unité: kgCO2e note: | L'auto-partage permet de réduire le nombre de km parcourus dans l'année (l'usage de la voiture est moins systématique). @@ -198,11 +192,9 @@ transport . distance moyenne trajet court: description: Nous estimons simplement à 2,5km la moyenne de distance des trajets inférieurs à 5km. transport . voiture 5km . recalcul: - formule: - recalcul: - règle: transport . voiture - avec: - transport . voiture . usage: transport . voiture 5km . usage réduit + valeur: transport . voiture + contexte: + transport . voiture . usage: transport . voiture 5km . usage réduit transport . voiture 5km . usage réduit: formule: (transport . voiture . km - distance totale) * transport . voiture . empreinte au kilomètre @@ -259,12 +251,10 @@ transport . voiture électrique: L'action peut-être négative si le véhicule initial est relativement vieux et que l'on fait peu de kilomètres. transport . voiture électrique . recalcul: - formule: - recalcul: - règle: transport . voiture - avec: - transport . voiture . motorisation: "'électrique'" - transport . voiture . véhicule récent: oui + valeur: transport . voiture + contexte: + transport . voiture . motorisation: "'électrique'" + transport . voiture . véhicule récent: oui transport . réduire taille: titre: Choisir une petite voiture @@ -280,11 +270,9 @@ transport . réduire taille: formule: transport . voiture - recalcul transport . réduire taille . recalcul: - formule: - recalcul: - règle: transport . voiture - avec: - transport . voiture . gabarit: "'petite'" + valeur: transport . voiture + contexte: + transport . voiture . gabarit: "'petite'" transport . faire durer: titre: Faire durer son véhicule @@ -304,11 +292,9 @@ transport . faire durer: formule: transport . voiture . empreinte calculée - recalcul transport . faire durer . recalcul: - formule: - recalcul: - règle: transport . voiture . empreinte calculée - avec: - transport . voiture . durée de vie: 13 + valeur: transport . voiture . empreinte calculée + contexte: + transport . voiture . durée de vie: 13 # # # Cette action est inactive. Au vu des problématiques liées au changement d'affectation des sols et autres impacts environnementaux From 9cf8d8095ea09bb095b8cdd44c7d40cd071a9fbc Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 12:32:43 +0100 Subject: [PATCH 23/45] fix(personas): remove unexisting rules from the situation --- personas/personas-fr.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/personas/personas-fr.yaml b/personas/personas-fr.yaml index 25c27341d..e2bd26372 100644 --- a/personas/personas-fr.yaml +++ b/personas/personas-fr.yaml @@ -687,11 +687,11 @@ personas . mehdi: transport . mobilité douce . autres véhicules à moteur . présent: oui transport . mobilité douce . autres véhicules à moteur . km: 200 transport . ferry . usager: non - transport . km autoroute: 8000 + # transport . km autoroute: 8000 transport . boulot . jours travaillés en voiture: 5 transport . boulot . distance . km aller: 12 # transport . boulot . sans voiture . type - transport . boulot . jours télétravaillés: 0 + # transport . boulot . jours télétravaillés: 0 transport . boulot . télétravail . compatible: 1 # transport . voiture 5km . fréquence # transport . âge nouvelle voiture électrique . occasion From fb89561a57bf31a16b171700c3e35290027bb3e0 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 12:33:00 +0100 Subject: [PATCH 24/45] pkg: upgrade to publicodes@1.0.1 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b3e32cb93..c01502f5a 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "http-server": "^14.1.1", "nodemon": "^3.0.1", "prettier": "^3.1.0", - "publicodes": "1.0.0-beta.77", + "publicodes": "^1.0.1", "yaml": "^2.2.2" }, "devDependencies": { diff --git a/yarn.lock b/yarn.lock index 690644e33..15262a426 100644 --- a/yarn.lock +++ b/yarn.lock @@ -803,10 +803,10 @@ publicodes@1.0.0-beta.77: resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-beta.77.tgz#45e3c4d2a46bfadcc932e1405ea037e659c28134" integrity sha512-F8U3WGUWMo3/rxhWYS1gWIiG20g1Yy/+PpXdHM99d6ZHKWnnyh/4txVEuyVE75glgDs+mTjwZPnmoKWsTMXluA== -publicodes@^1.0.0-rc.7: - version "1.0.0-rc.7" - resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.7.tgz#2ed0ce1d091674646477d5fd4d6411daaa283a0c" - integrity sha512-Y5WZ1t9BCRJxGFDsOflq0sFyryp7gFe05A9txHfvsW+DMjejnAgvC9O4enaU4+/4fI7+N62jxCWNsmStwqy/ZQ== +publicodes@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.1.tgz#07c1e5d94b3609a2fe09b531490969c9f4960086" + integrity sha512-vrgnLCKeu3orxmBhyjll8/rxnL3k2EYtIYa7D7GiJVYWmOE08J5S6c/1j15LnC3cQkYqYgOJR5JnX5gxooQGLA== qs@^6.4.0: version "6.11.2" From 553eb39acb0f6d39edf8968485107e8bf5f8b2d3 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 12:33:31 +0100 Subject: [PATCH 25/45] test(optim): use a precision of 14 digit for the nodevalue comparison --- tests/testOptim.mjs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/testOptim.mjs b/tests/testOptim.mjs index 0d7bce9f6..651cbc4a0 100644 --- a/tests/testOptim.mjs +++ b/tests/testOptim.mjs @@ -26,6 +26,7 @@ const nbRules = Object.keys(optimRules).length for (const personaName in localPersonas) { const persona = localPersonas[personaName] const errors = [] + const warnings = [] if (markdown) { console.log(`**${personaName}**`) @@ -45,12 +46,22 @@ for (const personaName in localPersonas) { } continue } + for (const rule in optimRules) { try { const base = baseEngine.evaluate(rule).nodeValue const optim = optimEngine.evaluate(rule).nodeValue + if (base !== optim) { - errors.push({ rule, base, optim }) + if ( + base !== null && + optim !== null && + base.toPrecision(14) === optim.toPrecision(14) + ) { + warnings.push({ rule, base, optim }) + } else { + errors.push({ rule, base, optim }) + } } } catch (e) { errors.push({ rule, base: e.message, optim: null }) @@ -66,7 +77,13 @@ for (const personaName in localPersonas) { } else { for (const error of errors) { console.log( - `${c.magenta(error.rule)}: ${error.base} !== ${error.optim}\n` + `${c.magenta(error.rule)}:\n${error.base} !== ${error.optim}\n` + ) + } + + for (const warning of warnings) { + console.log( + `${c.yellow(warning.rule)}:\n${warning.base} !== ${warning.optim} (equal with 14 digit precision)\n` ) } From 8cae2fc326ee8d32b770666a6846104e6c3535fc Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 12:56:00 +0100 Subject: [PATCH 26/45] refactor(optim): don't pretty print json file --- scripts/modelOptim.mjs | 40 ++-------------------------------------- 1 file changed, 2 insertions(+), 38 deletions(-) diff --git a/scripts/modelOptim.mjs b/scripts/modelOptim.mjs index 39e897198..48ff9c7a3 100644 --- a/scripts/modelOptim.mjs +++ b/scripts/modelOptim.mjs @@ -3,10 +3,8 @@ // // [@publicodes/tools]: https:github.com/incubateur-ademe/publicodes-tools -import Engine from 'publicodes' -import path from 'path' -import { readFileSync, writeFileSync } from 'fs' -import { disabledLogger, serializeParsedRules } from '@publicodes/tools' +import { writeFileSync } from 'fs' +import { serializeParsedRules } from '@publicodes/tools' import { constantFolding } from '@publicodes/tools/optims' // Rule names which should be kept in the optimized model. @@ -39,40 +37,6 @@ export function compressRules(engine, jsonPathWithoutExtension) { ) } const foldedRules = serializeParsedRules(constantFolding(engine, toKeep)) - -} - -/** - * Applies a constant folding optimization pass to the parsed rules from the [model] path. - * - * @param modelPath Path to the folder containing the Publicodes files or to a JSON file (the extension must be '.json' then). - * @param json Path to the JSON file target. - * @param toKeep Predicate function to determine which rule should be kept. - * @param verbose If true, the function will log the steps of the optimization pass. - * - * @returns An error message if the optimization pass failed, undefined otherwise. - */ -export function constantFoldingFromJSONFile( - modelPath, - jsonDestPath, - toKeep, - verbose = false -) { - const log = verbose ? console.log : function (_) {} - try { - log('Parsing rules from the JSON file:', modelPath) - const rules = JSON.parse(readFileSync(modelPath, 'utf8')) - const engine = new Engine(rules, { logger: disabledLogger }) - - log('Constant folding pass...') - const foldedRules = serializeParsedRules(constantFolding(engine, toKeep)) - - log(`Writing in '${jsonDestPath}'...`) - writeFileSync(jsonDestPath, JSON.stringify(foldedRules, null, 2)) - return { nbRules: Object.keys(foldedRules).length } - } catch (error) { - return { err } - } writeFileSync(destPath, JSON.stringify(foldedRules)) return Object.keys(foldedRules).length } From 1957a1aea3e7f4775931e764407297e67a3ab86e Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 16:29:19 +0100 Subject: [PATCH 27/45] quick-doc: upgrade publicodes packages --- quick-doc/package.json | 4 ++-- quick-doc/yarn.lock | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/quick-doc/package.json b/quick-doc/package.json index 8fe4064c2..58a777e9e 100644 --- a/quick-doc/package.json +++ b/quick-doc/package.json @@ -10,8 +10,8 @@ "preview": "vite preview" }, "dependencies": { - "@publicodes/react-ui": "^1.0.0-rc.5", - "publicodes": "^1.0.0-rc.7", + "@publicodes/react-ui": "^1.0.1", + "publicodes": "^1.0.1", "react": "^18.2.0", "react-dom": "^18.2.0", "react-markdown": "^9.0.1", diff --git a/quick-doc/yarn.lock b/quick-doc/yarn.lock index 246e7e3ee..1c56da124 100644 --- a/quick-doc/yarn.lock +++ b/quick-doc/yarn.lock @@ -444,10 +444,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@publicodes/react-ui@^1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@publicodes/react-ui/-/react-ui-1.0.0-rc.5.tgz#b37a5e533dce66b49e2878b7bfb07996b8477c79" - integrity sha512-J8duvgVyStZkZHR5zfRz0Lxoc62KFTMMk+aoMcKaF2uGz/VHxy1+oaz1qhwJv5VYPezDt2GrmY6D3lIwG8cuuA== +"@publicodes/react-ui@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@publicodes/react-ui/-/react-ui-1.0.1.tgz#6f86e5960a094bc4311e44b7f77a0e929cfa0f19" + integrity sha512-+fByE6jAnnn2tvhTMWjwzJRl6BUdj6YnrDCfeSvQTL3UGcaFniNf9zfMOrmlcFae5g4949Ew8MH1rB7To7YTtA== dependencies: styled-components "^6.1.1" @@ -1978,10 +1978,10 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.0.tgz#6bc4c618b0c2d68b3bb8b552cbb97f8e300a0f82" integrity sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ== -publicodes@^1.0.0-rc.7: - version "1.0.0-rc.7" - resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-rc.7.tgz#2ed0ce1d091674646477d5fd4d6411daaa283a0c" - integrity sha512-Y5WZ1t9BCRJxGFDsOflq0sFyryp7gFe05A9txHfvsW+DMjejnAgvC9O4enaU4+/4fI7+N62jxCWNsmStwqy/ZQ== +publicodes@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.1.tgz#07c1e5d94b3609a2fe09b531490969c9f4960086" + integrity sha512-vrgnLCKeu3orxmBhyjll8/rxnL3k2EYtIYa7D7GiJVYWmOE08J5S6c/1j15LnC3cQkYqYgOJR5JnX5gxooQGLA== punycode@^2.1.0: version "2.3.1" From 2de91120dfe896d4ae4d078b32e51f23a3e2cc8c Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 16:29:44 +0100 Subject: [PATCH 28/45] pkg: upgrade publicodes packages --- package.json | 6 +++--- yarn.lock | 25 ++++++++++--------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index c01502f5a..27d7b450d 100644 --- a/package.json +++ b/package.json @@ -65,9 +65,9 @@ "yaml": "^2.2.2" }, "devDependencies": { - "@incubateur-ademe/nosgestesclimat-scripts": "^0.3.6", - "@incubateur-ademe/publicodes-commun": "^0.1.5", - "@publicodes/tools": "^0.4.7", + "@incubateur-ademe/nosgestesclimat-scripts": "^0.3.2", + "@incubateur-ademe/publicodes-commun": "^1.0.0", + "@publicodes/tools": "^1.0.0-rc.0", "@types/glob": "^8.1.0", "ansi-colors": "^4.1.3", "cli-progress": "^3.11.2", diff --git a/yarn.lock b/yarn.lock index 15262a426..12a1d4daf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,20 +15,20 @@ prompt-sync "^4.2.0" yargs "^17.7.2" -"@incubateur-ademe/publicodes-commun@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@incubateur-ademe/publicodes-commun/-/publicodes-commun-0.1.5.tgz#9720644ae83bb4331d447624988a5f4c34b1a7c4" - integrity sha512-VMrbYX2tpMccGU8nnyWjeogri0PPOMbEBace40Kek7KT4SbJKFaX6+HU/RnTkGCgkYz0Mb5acfuaoUHqAcXbpA== +"@incubateur-ademe/publicodes-commun@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@incubateur-ademe/publicodes-commun/-/publicodes-commun-1.0.0.tgz#c2b947e26058733a1716ea5c51cdc4bfb3e605ea" + integrity sha512-tqT32fCizW9LbEDy8sRu9QmlM1170Ag2In2AyCZiyJXP6xlQBOAZK8UV22mMusxw/h81S8lhBPp5TW9o8ty2wA== dependencies: - publicodes "1.0.0-beta.77" + publicodes "^1.0.1" -"@publicodes/tools@^0.4.7": - version "0.4.7" - resolved "https://registry.yarnpkg.com/@publicodes/tools/-/tools-0.4.7.tgz#a9dd113d3569b180b02aae656823ff260c99aaf3" - integrity sha512-ujg4Dppcraxc0J955EEnHVk5PWhIOp9VBKMEYggdQtI1U83OQK59nofZkvjgfSK+GwELqZ1+VoQkKIeBbmeUqA== +"@publicodes/tools@^1.0.0-rc.0": + version "1.0.0-rc.0" + resolved "https://registry.yarnpkg.com/@publicodes/tools/-/tools-1.0.0-rc.0.tgz#01d36795adc3cf838154a7e97eab1ad65655163e" + integrity sha512-LV9uXDgoe8JYbASOthy5VbgDDWF9hLze7gKRC7RRyIvEo3o/FLNCpZIuZR9GBK4C40tw8h7ug36CeU5R5YaMww== dependencies: "@types/node" "^18.11.18" - publicodes "1.0.0-beta.77" + publicodes "^1.0.1" "@types/glob@^8.1.0": version "8.1.0" @@ -798,11 +798,6 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== -publicodes@1.0.0-beta.77: - version "1.0.0-beta.77" - resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-beta.77.tgz#45e3c4d2a46bfadcc932e1405ea037e659c28134" - integrity sha512-F8U3WGUWMo3/rxhWYS1gWIiG20g1Yy/+PpXdHM99d6ZHKWnnyh/4txVEuyVE75glgDs+mTjwZPnmoKWsTMXluA== - publicodes@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.1.tgz#07c1e5d94b3609a2fe09b531490969c9f4960086" From 4d66a4aa97c81248861c38cd04eb5a619cd0f912 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 16:30:13 +0100 Subject: [PATCH 29/45] feat(optim): remove 'optimized' and 'note' attributes from optimized json file to reduce size --- scripts/modelOptim.mjs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/modelOptim.mjs b/scripts/modelOptim.mjs index 48ff9c7a3..4ed91a3d0 100644 --- a/scripts/modelOptim.mjs +++ b/scripts/modelOptim.mjs @@ -27,6 +27,8 @@ const rulesToKeep = [ 'transport . ferry . surface' ] +const attributesToRemove = ['optimized', 'note'] + export function compressRules(engine, jsonPathWithoutExtension) { const destPath = `${jsonPathWithoutExtension}-opti.json` const toKeep = ([ruleName, ruleNode]) => { @@ -37,6 +39,17 @@ export function compressRules(engine, jsonPathWithoutExtension) { ) } const foldedRules = serializeParsedRules(constantFolding(engine, toKeep)) + + for (const ruleName in foldedRules) { + const rule = foldedRules[ruleName] + if (rule) { + attributesToRemove.forEach((attribute) => { + delete foldedRules[ruleName][attribute] + }) + } + } + writeFileSync(destPath, JSON.stringify(foldedRules)) + return Object.keys(foldedRules).length } From 2a0bfb39ec9a11885168582f934daa22f7b5a6b7 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 16:32:53 +0100 Subject: [PATCH 30/45] fix(rules): recalcul -> contexte --- data/actions/alimentation.publicodes | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/data/actions/alimentation.publicodes b/data/actions/alimentation.publicodes index 649e61bea..7e0c980e1 100644 --- a/data/actions/alimentation.publicodes +++ b/data/actions/alimentation.publicodes @@ -206,15 +206,13 @@ alimentation . devenir végétarien . différence par semaine repas: unité: kgCO2e/semaine alimentation . devenir végétarien . différence par semaine repas . recalcul: - formule: - recalcul: - règle: plats - avec: - plats . végétarien . nombre: nouveau nombre plats végé - plats . viande 1: 0 - plats . viande 2: 0 - plats . poisson 1: 0 - plats . poisson 2: 0 + valeur: plats + contexte: + plats . végétarien . nombre: nouveau nombre plats végé + plats . viande 1: 0 + plats . viande 2: 0 + plats . poisson 1: 0 + plats . poisson 2: 0 alimentation . devenir végétarien . différence par semaine repas . nouveau nombre plats végé: formule: plats . végétarien . nombre + nombre plats non végé From 55fdf9376d409c50e03960c8e752afa4e521ac16 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Mon, 12 Feb 2024 16:51:17 +0100 Subject: [PATCH 31/45] nitpick: remove forgotten test file --- test.ts | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 test.ts diff --git a/test.ts b/test.ts deleted file mode 100644 index 1808cb460..000000000 --- a/test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import base from './public/co2-model.FR-lang.fr.json' -import opti from './public/co2-model.FR-lang.fr-opti.json' -import Engine from 'publicodes' - -const baseEngine = new Engine(base) -const optiEngine = new Engine(opti, { allowOrphanRules: true }) - -console.log(baseEngine.evaluate('alimentation . déchets . composter').nodeValue) -console.log(optiEngine.evaluate('alimentation . déchets . composter').nodeValue) From 2c8c02a76063933e67e849df5449dcafe1f4fe4e Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Tue, 13 Feb 2024 17:00:20 +0100 Subject: [PATCH 32/45] feat(test)!: compare all rules for testPersonas and testOptim + temporarly add publicodes-beta-77 in deps --- package.json | 1 + scripts/modelOptim.mjs | 2 +- tests/commons.mjs | 137 +++++++++++++++++++++++--------------- tests/testOptim.mjs | 80 ++++++++-------------- tests/testPersonas.mjs | 89 +++++++++++++++++++++---- tests/testTranslation.mjs | 70 +++++++++---------- yarn.lock | 5 ++ 7 files changed, 225 insertions(+), 159 deletions(-) diff --git a/package.json b/package.json index 27d7b450d..6839546a4 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "isomorphic-fetch": "^3.0.0", "piscina": "^4.1.0", "prompt-sync": "^4.2.0", + "publicodes-beta-77": "npm:publicodes@1.0.0-beta.77", "ramda": "^0.29.1", "yargs": "^17.6.0" }, diff --git a/scripts/modelOptim.mjs b/scripts/modelOptim.mjs index 4ed91a3d0..0e0e46918 100644 --- a/scripts/modelOptim.mjs +++ b/scripts/modelOptim.mjs @@ -49,7 +49,7 @@ export function compressRules(engine, jsonPathWithoutExtension) { } } - writeFileSync(destPath, JSON.stringify(foldedRules)) + writeFileSync(destPath, JSON.stringify(foldedRules, null, 2)) return Object.keys(foldedRules).length } diff --git a/tests/commons.mjs b/tests/commons.mjs index a37b10a95..559f57eda 100644 --- a/tests/commons.mjs +++ b/tests/commons.mjs @@ -4,6 +4,7 @@ import { availableLanguages } from '@incubateur-ademe/nosgestesclimat-scripts/utils' import Engine from 'publicodes' +import Engine77 from 'publicodes-beta-77' import c from 'ansi-colors' import yargs from 'yargs' import { readFile } from 'fs/promises' @@ -35,7 +36,7 @@ export function getArgs() { .option('version', { alias: 'v', type: 'string', - description: 'The version of the model to test agains (default: nightly)', + description: 'The version of the model to test agains', default: 'nightly' }) .option('persona', { @@ -43,7 +44,6 @@ export function getArgs() { type: 'string', description: 'Test only one persona' }) - .help('h') .alias('h', 'help').argv } @@ -99,11 +99,21 @@ export function getPersonasFromAPI(version, region, lang) { }) } -export function testPersonas(rules, personas) { - const engine = new Engine(rules, { - logger: disabledLogger, - allowOrphanRules: true - }) +export function testPersonas( + rules, + personas, + markdown, + rulesToTest = ['bilan'], + beta77 = false +) { + console.log(`Testing personas (engine: ${beta77 ? 'beta77' : 'v1'})`) + console.log(`(It may take a while)`) + const engine = beta77 + ? new Engine77(rules, { logger: disabledLogger }) + : new Engine(rules, { + logger: disabledLogger, + allowOrphanRules: true + }) const personasRules = Object.values(personas) const results = {} @@ -111,12 +121,15 @@ export function testPersonas(rules, personas) { let personaData = persona.situation || {} for (const ruleName in personaData) { if (!(ruleName in rules)) { + if (!markdown) { + console.log(`Rule '${ruleName}' not found in the model`) + } delete personaData[ruleName] } } engine.setSituation(personaData) results[persona.nom] = {} - for (const rule in rules) { + for (const rule of rulesToTest) { results[persona.nom][rule] = engine.evaluate(rule).nodeValue } } @@ -124,59 +137,78 @@ export function testPersonas(rules, personas) { return results } -const kgCO2Str = c.dim('(kg CO2e)') +export function printResults({ markdownHeader, results, nbTests, markdown }) { + if (results.length === 1 && results[0].type === 'error') { + // An error occured while trying to set the situation + if (markdown) { + console.log(` +An error occured while testing the model: +\`\`\`${results[0].message} +\`\`\` +`) + } else { + console.log(`${c.red('(err)')} An error occured while testing the model:`) + console.log(`${results[0].message}\n`) + } + return + } -// TODO: could be improved by using a more generic way to compare results. -export function printResults( - localResults, - prodResults, - markdown, - version, - withOptim = false -) { if (markdown) { - console.log( - `| Persona | Total PR ${ - withOptim ? 'with optim.' : '' - } (kg CO2e) | Total ${ - withOptim ? 'PR without optim.' : 'in prod.' - } (kg CO2e) | Δ (%) |` - ) - console.log('|-----:|:------:|:------:|:----:|') - } else { - const title = withOptim - ? "Test model optimisation (only evaluating 'bilan')" - : `Test personas regression against ${c.green(version)}` - console.log(`[ ${title} ]\n`) + console.log(markdownHeader) + console.log('|-----:|:------|:------:|:------:|:----:|') } + const fails = [] - const nbTests = Object.keys(localResults).length - for (let name in localResults) { - const localResult = Math.fround(localResults[name]) - const prodResult = Math.fround(prodResults[name]) - const diff = localResult - prodResult + + for (const result of results) { + if (result.type === 'warning') { + if (!markdown) { + console.log( + `${c.yellow('(warn)')} ${c.magenta(result.rule)}: ${result.msg}` + ) + } else { + console.log( + `| ${c.magenta(result.rule)} | | | | (warning) ${result.msg} |` + ) + } + + // TODO: handle warnings in markdown? + continue + } + const actualRounded = Math.fround(result.actual) + const expectedRounded = Math.fround(result.expected) + const diff = + actualRounded && expectedRounded ? actualRounded - expectedRounded : 0 + if (diff !== 0) { - const diffPercent = Math.abs(Math.round((diff / prodResult) * 100)) - const color = diffPercent <= 1 ? c.yellow : c.red + const diffPercent = Math.abs(Math.round((diff / expectedRounded) * 100)) if (markdown) { console.log( fmtGHActionErr( - localResult, - prodResult, + actualRounded, + expectedRounded, diff, diffPercent, - name, - color + result.rule, + result.message ) ) } else { fails.push( - fmtCLIErr(localResult, prodResult, diff, diffPercent, name, color) + fmtCLIErr( + actualRounded, + expectedRounded, + diff, + diffPercent, + result.rule, + result.message + ) ) } } } + if (!markdown) { const nbFails = fails.length fails.forEach((fail) => console.log(fail)) @@ -188,20 +220,17 @@ export function printResults( } function formatValueInKgCO2e(value) { - return c.yellow(Math.fround(value).toLocaleString('en-us')) + ' ' + kgCO2Str + return Math.fround(value).toLocaleString('en-us') } -function fmtCLIErr(localResult, prodResult, diff, diffPercent, name, color) { +function fmtCLIErr(actual, expected, diff, diffPercent, rule, message) { + const color = diffPercent <= 1 ? c.yellow : c.red const sign = diff > 0 ? '+' : diff < 0 ? '-' : '' - const hd = color(diffPercent <= 1 ? '[WARN]' : '[FAIL]') - return `${hd} ${name} [${color(sign + Math.abs(diff))} ${kgCO2Str}, ${color( - sign + diffPercent - )}%]: ${formatValueInKgCO2e(localResult)} != ${formatValueInKgCO2e( - prodResult - )}` + const hd = color(diffPercent <= 1 ? '(warn)' : '(err)') + return `${color(hd)} ${c.magenta(rule)}:${message ? `\n${message}` : ''} ${formatValueInKgCO2e(actual)} ${c.dim.italic('actual')} != ${formatValueInKgCO2e(expected)} ${c.dim.italic('expected')} (${color(sign + diffPercent)}%)` } -function fmtGHActionErr(localResult, prodResult, diff, diffPercent, name) { +function fmtGHActionErr(expected, actual, diff, diffPercent, name, message) { const color = diffPercent <= 1 ? 'sucess' : diffPercent > 5 ? 'critical' : 'important' const sign = diff > 0 ? '%2B' : '-' @@ -210,9 +239,9 @@ function fmtGHActionErr(localResult, prodResult, diff, diffPercent, name) { '%20' )}-${sign}${Math.round(diff).toLocaleString( 'en-us' - )}%20kgCO2e-${color}?style=flat-square) | **${localResult.toLocaleString( + )}%20kgCO2e-${color}?style=flat-square) | ${expected.toLocaleString( 'en-us' - )}** | ${prodResult.toLocaleString('en-us')} | ${ + )} | ${actual.toLocaleString('en-us')} | ${ diff > 0 ? '+' : '-' - }${diffPercent}% |` + }${diffPercent}% | ${message ?? ''} |` } diff --git a/tests/testOptim.mjs b/tests/testOptim.mjs index 651cbc4a0..916ba39d9 100644 --- a/tests/testOptim.mjs +++ b/tests/testOptim.mjs @@ -2,7 +2,19 @@ import { disabledLogger } from '@publicodes/tools' import c from 'ansi-colors' import Engine from 'publicodes' -import { getArgs, getLocalRules, getLocalPersonas } from './commons.mjs' +import { + getArgs, + getLocalRules, + getLocalPersonas, + printResults +} from './commons.mjs' + +/** + * Compares the value of all the rules between the base and the optimized rules + * with the situation of the specified persona (default: all personas). + * + * TODO: factorize the code with testPersonas.mjs + */ const { country, language, markdown, persona: personaOpt } = getArgs() @@ -25,72 +37,34 @@ const nbRules = Object.keys(optimRules).length for (const personaName in localPersonas) { const persona = localPersonas[personaName] - const errors = [] - const warnings = [] + const results = [] if (markdown) { console.log(`**${personaName}**`) } else { - console.log(`[ Test model optimisation (${personaName}) ]`) + console.log( + `[ Test model optimisation for persona ${c.magenta(personaName)} ]\n` + ) } try { baseEngine.setSituation(persona.situation || {}) optimEngine.setSituation(persona.situation || {}) } catch (e) { - if (markdown) { - console.log(`\`\`\`${e.message}\`\`\`\n`) - } else { - console.log(`${c.red('ERR')}`) - console.log(`${e.message}\n`) - } + printResults({ results: [{ type: 'error', message: e.message }], markdown }) continue } for (const rule in optimRules) { - try { - const base = baseEngine.evaluate(rule).nodeValue - const optim = optimEngine.evaluate(rule).nodeValue - - if (base !== optim) { - if ( - base !== null && - optim !== null && - base.toPrecision(14) === optim.toPrecision(14) - ) { - warnings.push({ rule, base, optim }) - } else { - errors.push({ rule, base, optim }) - } - } - } catch (e) { - errors.push({ rule, base: e.message, optim: null }) - } + const actual = baseEngine.evaluate(rule).nodeValue + const expected = optimEngine.evaluate(rule).nodeValue + results.push({ type: 'result', rule, actual, expected }) } - if (markdown) { - console.log(`| Règle | base | optim |`) - console.log(`| :-- | :-- | :-- |`) - for (const error of errors) { - console.log(`| ${error.rule} | ${error.base} | ${error.optim} |`) - } - } else { - for (const error of errors) { - console.log( - `${c.magenta(error.rule)}:\n${error.base} !== ${error.optim}\n` - ) - } - - for (const warning of warnings) { - console.log( - `${c.yellow(warning.rule)}:\n${warning.base} !== ${warning.optim} (equal with 14 digit precision)\n` - ) - } - - console.log( - `${errors.length > 0 ? c.red('FAIL') : c.green('OK')} ${ - nbRules - errors.length - }/${nbRules}\n` - ) - } + printResults({ + markdownHeader: `| Règle | Base | Optim | Δ (%) | Message |`, + results, + nbTests: nbRules, + markdown + }) } diff --git a/tests/testPersonas.mjs b/tests/testPersonas.mjs index 853d95182..f408025c5 100644 --- a/tests/testPersonas.mjs +++ b/tests/testPersonas.mjs @@ -1,25 +1,86 @@ +import c from 'ansi-colors' +import Engine from 'publicodes' +import Engine77 from 'publicodes-beta-77' +import { disabledLogger } from '@publicodes/tools' + import { - testPersonas, - printResults, getArgs, getLocalRules, getLocalPersonas, getRulesFromAPI, - getPersonasFromAPI + getPersonasFromAPI, + printResults } from './commons.mjs' -const { country, language, markdown, version } = getArgs() +/** + * Compares the value of all the rules between the local and the prod (or specified) version + * with the situation of the specified persona (default: all personas). + * + * TODO: factorize the code with testOptim.mjs + * TODO: add the possibility to test only a subset of the rules + */ + +const { country, language, markdown, version, persona } = getArgs() + +const localRules = await getLocalRules(country, language) +let localPersonas = await getLocalPersonas(country, language) + +const prodRules = await getRulesFromAPI(version, country, language) +let prodPersonas = await getPersonasFromAPI(version, country, language) + +if (persona && persona in localPersonas && persona in prodPersonas) { + localPersonas = { [persona]: localPersonas[persona] } + prodPersonas = { [persona]: prodPersonas[persona] } +} + +const localEngine = new Engine(localRules, { logger: disabledLogger }) +const prodEngine = + // TODO: remove this when the production use the latest version + // of publicodes. + new Engine77(prodRules, { logger: disabledLogger }) -const localRules = getLocalRules(country, language) -const localPersonas = getLocalPersonas(country, language) +const nbRules = Object.keys(localRules).length -const prodRules = getRulesFromAPI(version, country, language) -const prodPersonas = getPersonasFromAPI(version, country, language) +for (const personaName in localPersonas) { + const { situation: localSituation } = localPersonas[personaName] + const { situation: prodSituation } = prodPersonas[personaName] + const results = [] -Promise.all([localRules, localPersonas, prodRules, prodPersonas]).then( - (res) => { - const localResults = testPersonas(res[0], res[1]) - const prodResults = testPersonas(res[2], res[3]) - printResults(localResults, prodResults, markdown, version) + if (markdown) { + console.log(`**${personaName}**`) + } else { + console.log( + `[ Test persona ${c.magenta(personaName)} regression against ${c.green(version)} ]\n` + ) } -) + + try { + localEngine.setSituation(localSituation || {}) + prodEngine.setSituation(prodSituation || {}) + } catch (e) { + printResults({ results: [{ type: 'error', message: e.message }], markdown }) + continue + } + + for (const rule in localRules) { + if (!(rule in prodRules)) { + results.push({ + type: 'warning', + rule, + msg: `Rule not found in ${c.green(version)}` + }) + continue + } + + const local = localEngine.evaluate(rule).nodeValue + const prod = prodEngine.evaluate(rule).nodeValue + results.push({ type: 'result', rule, actual: local, expected: prod }) + } + + printResults({ + markdownHeader: '| Règle | PR | ${version} | Δ (%) | Message |', + results, + nbTests: nbRules, + markdown + }) +} diff --git a/tests/testTranslation.mjs b/tests/testTranslation.mjs index a65df8985..2c6668998 100644 --- a/tests/testTranslation.mjs +++ b/tests/testTranslation.mjs @@ -5,45 +5,41 @@ import Engine from 'publicodes' const { country, markdown } = getArgs() -const localEnRules = getLocalRules(country, 'en') -const localFrRules = getLocalRules(country, 'fr') - -const localPersonas = getLocalPersonas(country, 'fr') - -Promise.all([localFrRules, localPersonas, localEnRules]).then((res) => { - const engineFr = new Engine(res[0], { logger: disabledLogger }) - const engineEn = new Engine(res[2], { logger: disabledLogger }) - - const nbRules = Object.keys(res[0]).length - const errors = [] - - for (const rule in res[0]) { - try { - const fr = engineFr.evaluate(rule).nodeValue - const en = engineEn.evaluate(rule).nodeValue - if (fr !== en) { - errors.push({ rule, fr, en }) - } - } catch (e) { - errors.push({ rule, fr: e.message, en: null }) - } - } +const localEnRules = await getLocalRules(country, 'en') +const localFrRules = await getLocalRules(country, 'fr') - if (markdown) { - console.log(`| Règle | fr | en |`) - console.log(`| :-- | :-- | :-- |`) - for (const error of errors) { - console.log(`| ${error.rule} | ${error.fr} | ${error.en} |`) - } - } else { - console.log('[ Test model translation (fr/en)]\n') +const engineFr = new Engine(localFrRules, { logger: disabledLogger }) +const engineEn = new Engine(localEnRules, { logger: disabledLogger }) + +const nbRules = Object.keys(localFrRules).length +const errors = [] - for (const error of errors) { - console.log(`${c.magenta(error.rule)}: ${error.fr} !== ${error.en}`) +for (const rule in localFrRules) { + try { + const fr = engineFr.evaluate(rule).nodeValue + const en = engineEn.evaluate(rule).nodeValue + if (fr !== en) { + errors.push({ rule, fr, en }) } + } catch (e) { + errors.push({ rule, fr: e.message, en: null }) + } +} + +if (markdown) { + console.log(`| Règle | fr | en |`) + console.log(`| :-- | :-- | :-- |`) + for (const error of errors) { + console.log(`| ${error.rule} | ${error.fr} | ${error.en} |`) + } +} else { + console.log('[ Test model translation (fr/en)]\n') - console.log( - `\n${errors.length > 0 ? c.red('FAIL') : c.green('OK')} ${nbRules - errors.length}/${nbRules}` - ) + for (const error of errors) { + console.log(`${c.magenta(error.rule)}: ${error.fr} !== ${error.en}`) } -}) + + console.log( + `\n${errors.length > 0 ? c.red('FAIL') : c.green('OK')} ${nbRules - errors.length}/${nbRules}` + ) +} diff --git a/yarn.lock b/yarn.lock index 12a1d4daf..093452d67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -798,6 +798,11 @@ pstree.remy@^1.1.8: resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== +"publicodes-beta-77@npm:publicodes@1.0.0-beta.77": + version "1.0.0-beta.77" + resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.0-beta.77.tgz#45e3c4d2a46bfadcc932e1405ea037e659c28134" + integrity sha512-F8U3WGUWMo3/rxhWYS1gWIiG20g1Yy/+PpXdHM99d6ZHKWnnyh/4txVEuyVE75glgDs+mTjwZPnmoKWsTMXluA== + publicodes@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/publicodes/-/publicodes-1.0.1.tgz#07c1e5d94b3609a2fe09b531490969c9f4960086" From 7d13600aa6ea67af7ba489ec7f7546913eece61d Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Tue, 13 Feb 2024 17:06:42 +0100 Subject: [PATCH 33/45] pkg: upgrade @incubateur-ademe/nosgestesclimat-scripts --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6839546a4..123595200 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "yaml": "^2.2.2" }, "devDependencies": { - "@incubateur-ademe/nosgestesclimat-scripts": "^0.3.2", + "@incubateur-ademe/nosgestesclimat-scripts": "^0.3.4", "@incubateur-ademe/publicodes-commun": "^1.0.0", "@publicodes/tools": "^1.0.0-rc.0", "@types/glob": "^8.1.0", From 37421ef9780e229881961340c18cf0490f861e6c Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Tue, 13 Feb 2024 17:10:57 +0100 Subject: [PATCH 34/45] fix(data): correctly renames contexte rules --- data/actions/logement.publicodes | 8 ++++---- data/actions/transport/boulot.publicodes | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/data/actions/logement.publicodes b/data/actions/logement.publicodes index da2dc1139..dcb3d8a72 100644 --- a/data/actions/logement.publicodes +++ b/data/actions/logement.publicodes @@ -527,7 +527,7 @@ logement . mutualiser son logement . empreinte partagée: logement . mutualiser son logement . empreinte partagée . logement: valeur: logement contexte: - logement . saisie habitants: logement . habitants + nombre colocataires + logement . habitants: logement . habitants + nombre colocataires logement . vacances: 0 note: On fait l'hypothèse que les vacances ne seront pas partagées avec le nouveau colocataire. @@ -535,16 +535,16 @@ logement . mutualiser son logement . empreinte partagée . divers: logement . mutualiser son logement . empreinte partagée . divers . numérique: valeur: divers . numérique . appareils contexte: - logement . saisie habitants: logement . habitants + nombre colocataires + logement . habitants: logement . habitants + nombre colocataires logement . mutualiser son logement . empreinte partagée . divers . électroménager: valeur: divers . électroménager . appareils contexte: - logement . saisie habitants: logement . habitants + nombre colocataires + logement . habitants: logement . habitants + nombre colocataires logement . mutualiser son logement . empreinte partagée . divers . ameublement: valeur: divers . ameublement contexte: - logement . saisie habitants: logement . habitants + nombre colocataires + logement . habitants: logement . habitants + nombre colocataires divers . ameublement . meubles . matelas: 0 divers . ameublement . meubles . lit: 0 diff --git a/data/actions/transport/boulot.publicodes b/data/actions/transport/boulot.publicodes index 41b96067f..800264813 100644 --- a/data/actions/transport/boulot.publicodes +++ b/data/actions/transport/boulot.publicodes @@ -225,11 +225,11 @@ transport . boulot . faire du covoiturage: transport . boulot . faire du covoiturage . empreinte boulot seul: valeur: transport . voiture contexte: - transport . voiture . saisie voyageurs: 1 + transport . voiture . voyageurs: 1 transport . voiture . km: boulot . distance transport . boulot . faire du covoiturage . empreinte boulot covoiturage: valeur: transport . voiture contexte: - transport . voiture . saisie voyageurs: boulot . covoiturage . nombre de voyageurs + transport . voiture . voyageurs: boulot . covoiturage . nombre de voyageurs transport . voiture . km: boulot . distance From fe60e97a929b1291702e850df6b843f27e24bad3 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Tue, 13 Feb 2024 17:22:09 +0100 Subject: [PATCH 35/45] fix(test): correctly print out the markdown version --- tests/commons.mjs | 38 +++++++++++++++----------------------- tests/testOptim.mjs | 7 ++++++- tests/testPersonas.mjs | 7 ++++++- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/tests/commons.mjs b/tests/commons.mjs index 559f57eda..6c75a5c4d 100644 --- a/tests/commons.mjs +++ b/tests/commons.mjs @@ -59,7 +59,7 @@ export function getLocalRules(region, lang, optim = false) { .catch((e) => { console.error(`No local rules found for ${region} and ${lang}`) console.error(e.message) - process.exit(-1) + process.exit(1) }) } @@ -71,7 +71,7 @@ export function getLocalPersonas(region, lang) { .catch((e) => { console.error(`No local personas found for ${region} and ${lang}:`) console.error(e.message) - process.exit(-1) + process.exit(1) }) } @@ -83,7 +83,7 @@ export function getRulesFromAPI(version, region, lang) { `No prod rules found for ${region} and ${lang} (${version}):` ) console.error(e.message) - process.exit(-1) + process.exit(1) }) } @@ -95,7 +95,7 @@ export function getPersonasFromAPI(version, region, lang) { `No prod personas found for ${region} and ${lang} (${version}):` ) console.error(e.message) - process.exit(-1) + process.exit(1) }) } @@ -143,19 +143,18 @@ export function printResults({ markdownHeader, results, nbTests, markdown }) { if (markdown) { console.log(` An error occured while testing the model: -\`\`\`${results[0].message} -\`\`\` +${results[0].message} `) } else { console.log(`${c.red('(err)')} An error occured while testing the model:`) console.log(`${results[0].message}\n`) } - return + process.exit(1) } if (markdown) { console.log(markdownHeader) - console.log('|-----:|:------|:------:|:------:|:----:|') + console.log('|:-----|:------|:------|:------:|:-----|') } const fails = [] @@ -167,12 +166,12 @@ An error occured while testing the model: `${c.yellow('(warn)')} ${c.magenta(result.rule)}: ${result.msg}` ) } else { - console.log( - `| ${c.magenta(result.rule)} | | | | (warning) ${result.msg} |` - ) + // NOTE: for now we don't need to print the warning in the markdown + // console.log( + // `| ${c.magenta(result.rule)} | | | | (warning) ${result.msg} |` + // ) } - // TODO: handle warnings in markdown? continue } const actualRounded = Math.fround(result.actual) @@ -231,17 +230,10 @@ function fmtCLIErr(actual, expected, diff, diffPercent, rule, message) { } function fmtGHActionErr(expected, actual, diff, diffPercent, name, message) { - const color = - diffPercent <= 1 ? 'sucess' : diffPercent > 5 ? 'critical' : 'important' - const sign = diff > 0 ? '%2B' : '-' - return `|![](https://img.shields.io/badge/${name.replaceAll( - ' ', - '%20' - )}-${sign}${Math.round(diff).toLocaleString( - 'en-us' - )}%20kgCO2e-${color}?style=flat-square) | ${expected.toLocaleString( - 'en-us' - )} | ${actual.toLocaleString('en-us')} | ${ + // const color = + // diffPercent <= 1 ? 'sucess' : diffPercent > 5 ? 'critical' : 'important' + // const sign = diff > 0 ? '%2B' : '-' + return `| ${name} | ${actual.toLocaleString('en-us')} | ${expected.toLocaleString('en-us')} | ${ diff > 0 ? '+' : '-' }${diffPercent}% | ${message ?? ''} |` } diff --git a/tests/testOptim.mjs b/tests/testOptim.mjs index 916ba39d9..85fd1f493 100644 --- a/tests/testOptim.mjs +++ b/tests/testOptim.mjs @@ -40,7 +40,8 @@ for (const personaName in localPersonas) { const results = [] if (markdown) { - console.log(`**${personaName}**`) + console.log(`
`) + console.log(`${personaName}\n`) } else { console.log( `[ Test model optimisation for persona ${c.magenta(personaName)} ]\n` @@ -67,4 +68,8 @@ for (const personaName in localPersonas) { nbTests: nbRules, markdown }) + + if (markdown) { + console.log(`\n
`) + } } diff --git a/tests/testPersonas.mjs b/tests/testPersonas.mjs index f408025c5..0b01b1203 100644 --- a/tests/testPersonas.mjs +++ b/tests/testPersonas.mjs @@ -47,7 +47,8 @@ for (const personaName in localPersonas) { const results = [] if (markdown) { - console.log(`**${personaName}**`) + console.log(`
`) + console.log(`${personaName}\n`) } else { console.log( `[ Test persona ${c.magenta(personaName)} regression against ${c.green(version)} ]\n` @@ -83,4 +84,8 @@ for (const personaName in localPersonas) { nbTests: nbRules, markdown }) + + if (markdown) { + console.log(`\n
`) + } } From 0db974aa2bc31b79ae7845bb9955d237be10b01e Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Tue, 13 Feb 2024 17:56:49 +0100 Subject: [PATCH 36/45] fix(personas): comment deprecated rule --- personas/personas-fr.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/personas/personas-fr.yaml b/personas/personas-fr.yaml index e2bd26372..d109ad2fc 100644 --- a/personas/personas-fr.yaml +++ b/personas/personas-fr.yaml @@ -152,7 +152,7 @@ personas . yoram: divers . animaux domestiques . empreinte . gros chien . nombre: 0 divers . produits consommables . consommation: 100 divers . électroménager . préservation: "'maximum'" - divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 1 + # divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 1 divers . électroménager . appareils . réfrigérateur . nombre: 0 divers . électroménager . appareils . congélateur . nombre: 0 divers . électroménager . appareils . lave-linge . nombre: 0 @@ -266,7 +266,7 @@ personas . corentin: divers . numérique . internet . durée journalière: 8 divers . électroménager . préservation: "'moyen'" divers . électroménager . appareils . réfrigérateur . nombre: 0 - divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 1 + # divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 1 divers . électroménager . appareils . congélateur . nombre: 0 divers . électroménager . appareils . lave-linge . nombre: 0 divers . électroménager . appareils . sèche-linge . nombre: 0 @@ -577,7 +577,7 @@ personas . sandy: divers . numérique . appareils . console portable . nombre: 0 divers . numérique . internet . durée journalière: 1 divers . électroménager . appareils . réfrigérateur . nombre: 1 - divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 + # divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 divers . électroménager . appareils . congélateur . nombre: 1 divers . électroménager . appareils . lave-linge . nombre: 1 divers . électroménager . appareils . sèche-linge . nombre: 1 @@ -790,7 +790,7 @@ personas . mehdi: divers . numérique . préservation: "'achat neuf'" divers . numérique . internet . durée journalière: 4 divers . électroménager . appareils . réfrigérateur . nombre: 1 - divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 + # divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 divers . électroménager . appareils . congélateur . nombre: 1 divers . électroménager . appareils . lave-linge . nombre: 1 divers . électroménager . appareils . sèche-linge . nombre: 1 @@ -993,7 +993,7 @@ personas . sylviane: # logement . vacances . résidence secondaire . durée . nuitées semaine . nombre # logement . vacances . résidence secondaire . saison divers . électroménager . préservation: "'moyen'" - divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 + # divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 divers . électroménager . appareils . robot cuisine . nombre: 0 divers . électroménager . appareils . réfrigérateur . nombre: 1 divers . électroménager . appareils . lave-linge . nombre: 1 @@ -1210,7 +1210,7 @@ personas . jessica: # logement . vacances . résidence secondaire . durée . nuitées semaine . nombre # logement . vacances . résidence secondaire . saison divers . électroménager . préservation: "'moyen'" - divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 + # divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 divers . électroménager . appareils . robot cuisine . nombre: 0 divers . électroménager . appareils . réfrigérateur . nombre: 1 divers . électroménager . appareils . lave-linge . nombre: 1 @@ -1423,7 +1423,7 @@ personas . nolan: logement . vacances . résidence secondaire . durée . nuitées semaine . nombre: 4 logement . vacances . résidence secondaire . saison: "'surtout été'" divers . électroménager . préservation: "'faible'" - divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 + # divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 divers . électroménager . appareils . robot cuisine . nombre: 1 divers . électroménager . appareils . réfrigérateur . nombre: 1 divers . électroménager . appareils . lave-linge . nombre: 1 From 8433a82e3385f4e81a7fcd9ffa73b1269a4907cf Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Tue, 13 Feb 2024 17:57:21 +0100 Subject: [PATCH 37/45] test: don't exit with error when the situation is not to date (temp) --- personas/personas-fr.yaml | 2 +- tests/commons.mjs | 9 +++++++-- tests/testOptim.mjs | 4 ---- tests/testPersonas.mjs | 6 +----- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/personas/personas-fr.yaml b/personas/personas-fr.yaml index d109ad2fc..2d47e0187 100644 --- a/personas/personas-fr.yaml +++ b/personas/personas-fr.yaml @@ -1858,7 +1858,7 @@ personas . gerard: # logement . vacances . locations . nombre de nuitées # logement . vacances . échange . nombre de nuitées divers . électroménager . préservation: "'achat neuf'" - divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 + # divers . électroménager . appareils . réfrigérateur sous-plan . nombre: 0 divers . électroménager . appareils . robot cuisine . nombre: 1 divers . électroménager . appareils . réfrigérateur . nombre: 1 divers . électroménager . appareils . lave-linge . nombre: 1 diff --git a/tests/commons.mjs b/tests/commons.mjs index 6c75a5c4d..b545d52ae 100644 --- a/tests/commons.mjs +++ b/tests/commons.mjs @@ -145,11 +145,14 @@ export function printResults({ markdownHeader, results, nbTests, markdown }) { An error occured while testing the model: ${results[0].message} `) + console.log(`\n`) } else { console.log(`${c.red('(err)')} An error occured while testing the model:`) console.log(`${results[0].message}\n`) } - process.exit(1) + // TODO: remove this when the production use the latest version + // process.exit(1) + return } if (markdown) { @@ -208,7 +211,9 @@ ${results[0].message} } } - if (!markdown) { + if (markdown) { + console.log(`\n`) + } else { const nbFails = fails.length fails.forEach((fail) => console.log(fail)) console.log(`\n${c.green('OK')} ${nbTests - nbFails}/${nbTests}`) diff --git a/tests/testOptim.mjs b/tests/testOptim.mjs index 85fd1f493..7648e6076 100644 --- a/tests/testOptim.mjs +++ b/tests/testOptim.mjs @@ -68,8 +68,4 @@ for (const personaName in localPersonas) { nbTests: nbRules, markdown }) - - if (markdown) { - console.log(`\n`) - } } diff --git a/tests/testPersonas.mjs b/tests/testPersonas.mjs index 0b01b1203..851f5ab94 100644 --- a/tests/testPersonas.mjs +++ b/tests/testPersonas.mjs @@ -79,13 +79,9 @@ for (const personaName in localPersonas) { } printResults({ - markdownHeader: '| Règle | PR | ${version} | Δ (%) | Message |', + markdownHeader: `| Règle | PR | ${version} | Δ (%) | Message |`, results, nbTests: nbRules, markdown }) - - if (markdown) { - console.log(`\n`) - } } From 1f13bb315660d280a36ce94113c4e34593974949 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Wed, 14 Feb 2024 10:07:49 +0100 Subject: [PATCH 38/45] tmp: test without optim in the compilation step --- scripts/rulesToJSON.worker.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/rulesToJSON.worker.mjs b/scripts/rulesToJSON.worker.mjs index 28fb4efec..c399f6482 100644 --- a/scripts/rulesToJSON.worker.mjs +++ b/scripts/rulesToJSON.worker.mjs @@ -72,7 +72,7 @@ export default ({ regionCode, destLang, translatedBaseRules, opts }) => { markdown ) - if (!optimDisabled) { + if (false) { const start = Date.now() const nbRules = compressRules(engine, destPathWithoutExtension) const optimDuration = Date.now() - start From 3e114a73f84edc7087a1f01c13a62517d3dd9ac5 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Wed, 14 Feb 2024 12:26:09 +0100 Subject: [PATCH 39/45] pkg: upgrade @publicodes/tools --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 123595200..211948bc8 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "devDependencies": { "@incubateur-ademe/nosgestesclimat-scripts": "^0.3.4", "@incubateur-ademe/publicodes-commun": "^1.0.0", - "@publicodes/tools": "^1.0.0-rc.0", + "@publicodes/tools": "^1.0.0-rc.1", "@types/glob": "^8.1.0", "ansi-colors": "^4.1.3", "cli-progress": "^3.11.2", diff --git a/yarn.lock b/yarn.lock index 093452d67..0ca752110 100644 --- a/yarn.lock +++ b/yarn.lock @@ -22,10 +22,10 @@ dependencies: publicodes "^1.0.1" -"@publicodes/tools@^1.0.0-rc.0": - version "1.0.0-rc.0" - resolved "https://registry.yarnpkg.com/@publicodes/tools/-/tools-1.0.0-rc.0.tgz#01d36795adc3cf838154a7e97eab1ad65655163e" - integrity sha512-LV9uXDgoe8JYbASOthy5VbgDDWF9hLze7gKRC7RRyIvEo3o/FLNCpZIuZR9GBK4C40tw8h7ug36CeU5R5YaMww== +"@publicodes/tools@^1.0.0-rc.1": + version "1.0.0-rc.1" + resolved "https://registry.yarnpkg.com/@publicodes/tools/-/tools-1.0.0-rc.1.tgz#ee38395e4ac3756b4a44814b2ff34bd7311d3fa0" + integrity sha512-LVxwS9LV9qTcP7SsbosoKinlgyIHSKTztXI34B6easx6xts0XJF+TNwRcAoeRt04BCr3PZVViWx9wmG7kExMXw== dependencies: "@types/node" "^18.11.18" publicodes "^1.0.1" From c23450a1ea85936cb7d1716e4fae33675591fc73 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Wed, 14 Feb 2024 12:26:54 +0100 Subject: [PATCH 40/45] =?UTF-8?q?fix(optim):=20use=20the=20new=20publicode?= =?UTF-8?q?s/tools=20API=20to=20avoid=20to=20fold=20the=20'service=20soci?= =?UTF-8?q?=C3=A9taux'=20rule?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/modelOptim.mjs | 17 ++++++++++++++--- scripts/rulesToJSON.worker.mjs | 2 +- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/scripts/modelOptim.mjs b/scripts/modelOptim.mjs index 0e0e46918..36fa31ec8 100644 --- a/scripts/modelOptim.mjs +++ b/scripts/modelOptim.mjs @@ -27,18 +27,29 @@ const rulesToKeep = [ 'transport . ferry . surface' ] +// Rule names which should be avoided in the optimized model. +// We don't want to have to replace the rule refs in the sum of the rules +// by their value to be able to use them in the UI. +const rulesToAvoid = ['services sociétaux'] + const attributesToRemove = ['optimized', 'note'] export function compressRules(engine, jsonPathWithoutExtension) { const destPath = `${jsonPathWithoutExtension}-opti.json` - const toKeep = ([ruleName, ruleNode]) => { + const toKeep = (ruleNode) => { return ( - rulesToKeep.includes(ruleName) || + rulesToKeep.includes(ruleNode.dottedName) || 'icônes' in ruleNode.rawNode || ruleNode.rawNode.type === 'notification' ) } - const foldedRules = serializeParsedRules(constantFolding(engine, toKeep)) + const toAvoid = (ruleNode) => { + return rulesToAvoid.includes(ruleNode.dottedName) + } + + const foldedRules = serializeParsedRules( + constantFolding(engine, { toKeep, toAvoid }) + ) for (const ruleName in foldedRules) { const rule = foldedRules[ruleName] diff --git a/scripts/rulesToJSON.worker.mjs b/scripts/rulesToJSON.worker.mjs index c399f6482..28fb4efec 100644 --- a/scripts/rulesToJSON.worker.mjs +++ b/scripts/rulesToJSON.worker.mjs @@ -72,7 +72,7 @@ export default ({ regionCode, destLang, translatedBaseRules, opts }) => { markdown ) - if (false) { + if (!optimDisabled) { const start = Date.now() const nbRules = compressRules(engine, destPathWithoutExtension) const optimDuration = Date.now() - start From bcccbfd1c758ad8e223de45d8b3a3b842370a0b4 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Wed, 14 Feb 2024 14:11:55 +0100 Subject: [PATCH 41/45] ci: don't print compilation, translation tests and optim tests results in the report All this tests should fail and stop the CI before uploading the results, therefore, they are irrelevant. --- .../workflows/upload-compilation-result.yaml | 69 ++++++------------- 1 file changed, 22 insertions(+), 47 deletions(-) diff --git a/.github/workflows/upload-compilation-result.yaml b/.github/workflows/upload-compilation-result.yaml index ae579b805..c9f611bdf 100644 --- a/.github/workflows/upload-compilation-result.yaml +++ b/.github/workflows/upload-compilation-result.yaml @@ -1,6 +1,6 @@ # Generates an artifact containing the result of the `yarn compile` command. -name: Generate PR artifact +name: Tests & Generate PR artifact on: pull_request: @@ -13,13 +13,10 @@ jobs: compile: runs-on: ubuntu-22.04 outputs: - compilation-result: ${{ steps.compilation.outputs.result }} check-translation-result: ${{ steps.check-translation.outputs.result }} check-personas-result: ${{ steps.check-personas.outputs.result }} - test-translation-result: ${{ steps.test-translation.outputs.result }} test-personas-nightly-result: ${{ steps.test-personas-nightly.outputs.result }} test-personas-latest-result: ${{ steps.test-personas-latest.outputs.result }} - test-optim-result: ${{ steps.test-optim.outputs.result }} test-url: ${{ steps.set-test-url.outputs.fr }} steps: - uses: actions/checkout@v3 @@ -30,14 +27,8 @@ jobs: - run: yarn install --immutable - run: git log | head && git status - id: compilation - name: Compiles the model and stores the result -- with escaped special characters. - run: | - yarn compile:md > compile.res - body="$(cat compile.res | tail --lines=+3 | head --lines=-1)" - body="${body//'%'/'%25'}" - body="${body//$'\n'/'%0A'}" - body="${body//$'\r'/'%0D'}" - echo "::set-output name=result::${body}" + name: Compile + run: yarn compile - id: check-translation name: Checks the rules translation run: | @@ -56,15 +47,12 @@ jobs: body="${body//$'\n'/'%0A'}" body="${body//$'\r'/'%0D'}" echo "::set-output name=result::${body}" + - id: test-optim + name: Test the optimized rules against base rules + run: yarn test:optim - id: test-translation name: Test the translated rules against production - run: | - yarn test:translation --markdown > test-translation.res - body="$(cat test-translation.res | tail --lines=+3 | head --lines=-1)" - body="${body//'%'/'%25'}" - body="${body//$'\n'/'%0A'}" - body="${body//$'\r'/'%0D'}" - echo "::set-output name=result::${body}" + run: yarn test:translation - id: test-personas-latest name: Test the personas bilans against production run: | @@ -83,15 +71,6 @@ jobs: body="${body//$'\n'/'%0A'}" body="${body//$'\r'/'%0D'}" echo "::set-output name=result::${body}" - - id: test-optim - name: Test the optimized rules against base rules - run: | - yarn test:optim --markdown > test-optim.res - body="$(cat test-optim.res | tail --lines=+3 | head --lines=-1)" - body="${body//'%'/'%25'}" - body="${body//$'\n'/'%0A'}" - body="${body//$'\r'/'%0D'}" - echo "::set-output name=result::${body}" - id: set-test-url # Setups the NGC url with the corresponding PR number: https://nosgestesclimat.fr?PR= run: echo "::set-output name=fr::${{ steps.deploy-env.outputs.name == 'master' && 'https://preprod.nosgestesclimat.fr' || format('https://preprod.nosgestesclimat.fr?PR={0}', github.event.pull_request.number) }}" @@ -110,43 +89,39 @@ jobs: --- - ### :wrench: Model compilation status - - ${{ needs.compile.outputs.compilation-result }} - - --- - - ### :globe_with_meridians: Translation status + ## :globe_with_meridians: Translation status > _You will find more information about the translation in the [dedicated file](https:/github.com/datagir/nosgestesclimat/blob/master/docs/translation.md)._ - #### Rules + ### Rules ${{ needs.compile.outputs.check-translation-result }} - #### Personas + ### Personas ${{ needs.compile.outputs.check-personas-result }} - #### Test translation (fr -> en) + --- - ${{ needs.compile.outputs.test-translation-result }} + ## :couple: Personas changes - --- + ### Test personas bilans against [preprod](https://nosgestesclimat-api.osc-fr1.scalingo.io/nightly/fr/FR/rules) - ### :couple: Personas changes +
+ In details - #### Test personas bilans against [production](https://nosgestesclimat-api.osc-fr1.scalingo.io/latest/fr/FR/rules) + ${{ needs.compile.outputs.test-personas-nightly-result }} - ${{ needs.compile.outputs.test-personas-latest-result }} +
- #### Test personas bilans against [preprod](https://nosgestesclimat-api.osc-fr1.scalingo.io/nightly/fr/FR/rules) + ### Test personas bilans against [production](https://nosgestesclimat-api.osc-fr1.scalingo.io/latest/fr/FR/rules) - ${{ needs.compile.outputs.test-personas-nightly-result }} +
+ Show - #### Test the model [optimisation](https://publicodes.github.io/tools/modules/optims.html) + ${{ needs.compile.outputs.test-personas-latest-result }} - ${{ needs.compile.outputs.test-optim-result }} +
" > artifacts/result.md - name: Upload artifact From 321aefcd424c76bd4627623657d5e3d626ea43a3 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Wed, 14 Feb 2024 14:12:19 +0100 Subject: [PATCH 42/45] ci: better report format --- tests/commons.mjs | 49 +++++++++++++++++++++++++++------------ tests/testOptim.mjs | 4 ++-- tests/testPersonas.mjs | 9 ++++--- tests/testTranslation.mjs | 25 +++++++------------- 4 files changed, 48 insertions(+), 39 deletions(-) diff --git a/tests/commons.mjs b/tests/commons.mjs index b545d52ae..6db38d56d 100644 --- a/tests/commons.mjs +++ b/tests/commons.mjs @@ -3,7 +3,7 @@ import { defaultLang, availableLanguages } from '@incubateur-ademe/nosgestesclimat-scripts/utils' -import Engine from 'publicodes' +import Engine, { serializeUnit } from 'publicodes' import Engine77 from 'publicodes-beta-77' import c from 'ansi-colors' import yargs from 'yargs' @@ -145,7 +145,6 @@ export function printResults({ markdownHeader, results, nbTests, markdown }) { An error occured while testing the model: ${results[0].message} `) - console.log(`\n`) } else { console.log(`${c.red('(err)')} An error occured while testing the model:`) console.log(`${results[0].message}\n`) @@ -157,7 +156,7 @@ ${results[0].message} if (markdown) { console.log(markdownHeader) - console.log('|:-----|:------|:------|:------:|:-----|') + console.log('|:-----|:------|:------|:------:|') } const fails = [] @@ -177,8 +176,10 @@ ${results[0].message} continue } - const actualRounded = Math.fround(result.actual) - const expectedRounded = Math.fround(result.expected) + const actualRounded = Math.fround(result.actual.nodeValue) + const actualUnit = serializeUnit(result.actual.unit) + const expectedRounded = Math.fround(result.expected.nodeValue) + const expectedUnit = serializeUnit(result.expected.unit) const diff = actualRounded && expectedRounded ? actualRounded - expectedRounded : 0 @@ -189,18 +190,21 @@ ${results[0].message} console.log( fmtGHActionErr( actualRounded, + actualUnit, expectedRounded, + expectedUnit, diff, diffPercent, - result.rule, - result.message + result.rule ) ) } else { fails.push( fmtCLIErr( actualRounded, + actualUnit, expectedRounded, + expectedUnit, diff, diffPercent, result.rule, @@ -211,9 +215,7 @@ ${results[0].message} } } - if (markdown) { - console.log(`\n`) - } else { + if (!markdown) { const nbFails = fails.length fails.forEach((fail) => console.log(fail)) console.log(`\n${c.green('OK')} ${nbTests - nbFails}/${nbTests}`) @@ -227,18 +229,35 @@ function formatValueInKgCO2e(value) { return Math.fround(value).toLocaleString('en-us') } -function fmtCLIErr(actual, expected, diff, diffPercent, rule, message) { +function fmtCLIErr( + actual, + actualUnit, + expected, + expectedUnit, + diff, + diffPercent, + rule, + message +) { const color = diffPercent <= 1 ? c.yellow : c.red const sign = diff > 0 ? '+' : diff < 0 ? '-' : '' const hd = color(diffPercent <= 1 ? '(warn)' : '(err)') - return `${color(hd)} ${c.magenta(rule)}:${message ? `\n${message}` : ''} ${formatValueInKgCO2e(actual)} ${c.dim.italic('actual')} != ${formatValueInKgCO2e(expected)} ${c.dim.italic('expected')} (${color(sign + diffPercent)}%)` + return `${color(hd)} ${c.magenta(rule)}:${message ? `\n${message}` : ''} ${formatValueInKgCO2e(actual)} ${c.dim.italic(actualUnit ?? '')} != ${formatValueInKgCO2e(expected)} ${c.dim.italic(expectedUnit ?? '')} (${color(sign + diffPercent)}%)` } -function fmtGHActionErr(expected, actual, diff, diffPercent, name, message) { +function fmtGHActionErr( + actual, + actualUnit, + expected, + expectedUnit, + diff, + diffPercent, + name +) { // const color = // diffPercent <= 1 ? 'sucess' : diffPercent > 5 ? 'critical' : 'important' // const sign = diff > 0 ? '%2B' : '-' - return `| ${name} | ${actual.toLocaleString('en-us')} | ${expected.toLocaleString('en-us')} | ${ + return `| ${name} | ${actual.toLocaleString('en-us')} ${actualUnit ? `_${actualUnit}_` : ''} | ${expected.toLocaleString('en-us')} ${expectedUnit ? `_${expectedUnit}_` : ''} | **${ diff > 0 ? '+' : '-' - }${diffPercent}% | ${message ?? ''} |` + }${diffPercent}%** |` } diff --git a/tests/testOptim.mjs b/tests/testOptim.mjs index 7648e6076..a75f10055 100644 --- a/tests/testOptim.mjs +++ b/tests/testOptim.mjs @@ -57,8 +57,8 @@ for (const personaName in localPersonas) { } for (const rule in optimRules) { - const actual = baseEngine.evaluate(rule).nodeValue - const expected = optimEngine.evaluate(rule).nodeValue + const actual = baseEngine.evaluate(rule) + const expected = optimEngine.evaluate(rule) results.push({ type: 'result', rule, actual, expected }) } diff --git a/tests/testPersonas.mjs b/tests/testPersonas.mjs index 851f5ab94..75c85f66d 100644 --- a/tests/testPersonas.mjs +++ b/tests/testPersonas.mjs @@ -47,8 +47,7 @@ for (const personaName in localPersonas) { const results = [] if (markdown) { - console.log(`
`) - console.log(`${personaName}\n`) + console.log(`#### ${personaName}\n`) } else { console.log( `[ Test persona ${c.magenta(personaName)} regression against ${c.green(version)} ]\n` @@ -73,13 +72,13 @@ for (const personaName in localPersonas) { continue } - const local = localEngine.evaluate(rule).nodeValue - const prod = prodEngine.evaluate(rule).nodeValue + const local = localEngine.evaluate(rule) + const prod = prodEngine.evaluate(rule) results.push({ type: 'result', rule, actual: local, expected: prod }) } printResults({ - markdownHeader: `| Règle | PR | ${version} | Δ (%) | Message |`, + markdownHeader: `| Règle | PR | ${version} | Δ (%) |`, results, nbTests: nbRules, markdown diff --git a/tests/testTranslation.mjs b/tests/testTranslation.mjs index 2c6668998..e6b482260 100644 --- a/tests/testTranslation.mjs +++ b/tests/testTranslation.mjs @@ -3,7 +3,7 @@ import c from 'ansi-colors' import { disabledLogger } from '@publicodes/tools' import Engine from 'publicodes' -const { country, markdown } = getArgs() +const { country } = getArgs() const localEnRules = await getLocalRules(country, 'en') const localFrRules = await getLocalRules(country, 'fr') @@ -25,21 +25,12 @@ for (const rule in localFrRules) { errors.push({ rule, fr: e.message, en: null }) } } +console.log('[ Test model translation (fr/en)]\n') -if (markdown) { - console.log(`| Règle | fr | en |`) - console.log(`| :-- | :-- | :-- |`) - for (const error of errors) { - console.log(`| ${error.rule} | ${error.fr} | ${error.en} |`) - } -} else { - console.log('[ Test model translation (fr/en)]\n') - - for (const error of errors) { - console.log(`${c.magenta(error.rule)}: ${error.fr} !== ${error.en}`) - } - - console.log( - `\n${errors.length > 0 ? c.red('FAIL') : c.green('OK')} ${nbRules - errors.length}/${nbRules}` - ) +for (const error of errors) { + console.log(`${c.magenta(error.rule)}: ${error.fr} !== ${error.en}`) } + +console.log( + `\n${errors.length > 0 ? c.red('FAIL') : c.green('OK')} ${nbRules - errors.length}/${nbRules}` +) From 45aa5ea1256d3b1ea6e55ca063f647b046f9486d Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Wed, 14 Feb 2024 14:13:56 +0100 Subject: [PATCH 43/45] pkg: upgrade nosgestesclimat-script --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 211948bc8..b875c0d40 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "yaml": "^2.2.2" }, "devDependencies": { - "@incubateur-ademe/nosgestesclimat-scripts": "^0.3.4", + "@incubateur-ademe/nosgestesclimat-scripts": "^0.3.6", "@incubateur-ademe/publicodes-commun": "^1.0.0", "@publicodes/tools": "^1.0.0-rc.1", "@types/glob": "^8.1.0", From 557fa76724699999c84becb4cf84a9c4e933d095 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Wed, 14 Feb 2024 14:21:21 +0100 Subject: [PATCH 44/45] ci: rename the workflow to trigger the pr-updater workflow --- .github/workflows/upload-compilation-result.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upload-compilation-result.yaml b/.github/workflows/upload-compilation-result.yaml index c9f611bdf..bc85b9d5f 100644 --- a/.github/workflows/upload-compilation-result.yaml +++ b/.github/workflows/upload-compilation-result.yaml @@ -1,6 +1,6 @@ # Generates an artifact containing the result of the `yarn compile` command. -name: Tests & Generate PR artifact +name: Generate PR artifact on: pull_request: From 78d1708dbb01cb4c51f756891e0478d973317192 Mon Sep 17 00:00:00 2001 From: Emile Rolley Date: Wed, 14 Feb 2024 14:43:35 +0100 Subject: [PATCH 45/45] ci: improve the report --- .github/workflows/upload-compilation-result.yaml | 4 ---- tests/commons.mjs | 8 +++++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/upload-compilation-result.yaml b/.github/workflows/upload-compilation-result.yaml index bc85b9d5f..ff92dda3f 100644 --- a/.github/workflows/upload-compilation-result.yaml +++ b/.github/workflows/upload-compilation-result.yaml @@ -87,8 +87,6 @@ jobs:

:rocket: Test the model from the website: ${{ needs.compile.outputs.test-url }}

- --- - ## :globe_with_meridians: Translation status > _You will find more information about the translation in the [dedicated file](https:/github.com/datagir/nosgestesclimat/blob/master/docs/translation.md)._ @@ -101,8 +99,6 @@ jobs: ${{ needs.compile.outputs.check-personas-result }} - --- - ## :couple: Personas changes ### Test personas bilans against [preprod](https://nosgestesclimat-api.osc-fr1.scalingo.io/nightly/fr/FR/rules) diff --git a/tests/commons.mjs b/tests/commons.mjs index 6db38d56d..42ea448f0 100644 --- a/tests/commons.mjs +++ b/tests/commons.mjs @@ -143,7 +143,9 @@ export function printResults({ markdownHeader, results, nbTests, markdown }) { if (markdown) { console.log(` An error occured while testing the model: -${results[0].message} + +~~~${results[0].message} +~~~ `) } else { console.log(`${c.red('(err)')} An error occured while testing the model:`) @@ -156,7 +158,7 @@ ${results[0].message} if (markdown) { console.log(markdownHeader) - console.log('|:-----|:------|:------|:------:|') + console.log('|:-----|:------|:------|:-------|') } const fails = [] @@ -257,7 +259,7 @@ function fmtGHActionErr( // const color = // diffPercent <= 1 ? 'sucess' : diffPercent > 5 ? 'critical' : 'important' // const sign = diff > 0 ? '%2B' : '-' - return `| ${name} | ${actual.toLocaleString('en-us')} ${actualUnit ? `_${actualUnit}_` : ''} | ${expected.toLocaleString('en-us')} ${expectedUnit ? `_${expectedUnit}_` : ''} | **${ + return `| ${name} | ${actual.toLocaleString('en-us')} ${actualUnit ? `_${actualUnit}_` : ''} | ${expected.toLocaleString('en-us')} ${expectedUnit ? `_${expectedUnit}_` : ''} | **${ diff > 0 ? '+' : '-' }${diffPercent}%** |` }