2020-12-07 17:25:45 +00:00
|
|
|
## Installation ![béta](https://img.shields.io/badge/-beta-blue)
|
|
|
|
|
|
|
|
Publicode est distribué sous la forme d'une librairie
|
|
|
|
[Node.js](https://nodejs.org/fr/) permettant de compiler un jeu de règles
|
|
|
|
publicodes et de l'évaluer dans une situation donnée.
|
|
|
|
|
2021-02-18 11:46:40 +00:00
|
|
|
Le paquet est disponible sur npm :
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
```sh
|
|
|
|
$ npm install publicodes
|
|
|
|
```
|
|
|
|
|
2021-02-02 11:10:04 +00:00
|
|
|
## Premiers pas
|
2020-12-07 17:25:45 +00:00
|
|
|
|
2021-02-02 11:10:04 +00:00
|
|
|
La bibliothèque exporte une classe par défaut `Engine` qui permet d'instancier le moteur avec un
|
|
|
|
jeu de règles publicodes.
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
```js
|
|
|
|
import Engine from 'publicodes'
|
|
|
|
|
|
|
|
// On définit une liste de règles publicodes
|
|
|
|
const rules = `
|
2021-01-25 22:31:06 +00:00
|
|
|
prix:
|
2020-12-07 17:25:45 +00:00
|
|
|
prix . carottes: 2€/kg
|
|
|
|
prix . champignons: 5€/kg
|
|
|
|
prix . avocat: 2€/avocat
|
|
|
|
|
|
|
|
dépenses primeur:
|
|
|
|
formule:
|
|
|
|
somme:
|
|
|
|
- prix . carottes * 1.5 kg
|
|
|
|
- prix . champignons * 500g
|
|
|
|
- prix . avocat * 3 avocat
|
|
|
|
`
|
|
|
|
|
|
|
|
// On initialise un moteur en lui donnant le publicode.
|
|
|
|
// Ce publicode va être parsé
|
|
|
|
const engine = new Engine(rules)
|
|
|
|
```
|
|
|
|
|
2021-02-02 11:10:04 +00:00
|
|
|
> ### Note : importer sans bundler
|
|
|
|
>
|
|
|
|
> Voici comment importer publicodes en fonction de l'environnement.
|
|
|
|
>
|
|
|
|
> - **Node >= 15.0.0**
|
|
|
|
> ```js
|
|
|
|
> import Engine from 'publicodes'
|
|
|
|
> ```
|
|
|
|
|
|
|
|
> - **Node < 15.0.0**
|
|
|
|
>
|
|
|
|
> ```js
|
|
|
|
> const Engine = require('publicodes').default
|
|
|
|
> ```
|
|
|
|
|
|
|
|
> - **ESModule sans npm install** (`<script type="module">` et deno)
|
|
|
|
> ```js
|
2021-04-15 08:43:56 +00:00
|
|
|
> import Engine from 'https://unpkg.com/publicodes@next/esm/index.min.js'
|
2021-02-02 11:10:04 +00:00
|
|
|
> ```
|
|
|
|
> - **`<script>` dans navigateur**
|
|
|
|
> ```html
|
2021-04-15 08:43:56 +00:00
|
|
|
> <script src="https://unpkg.com/publicodes@next/dist/index.min.js"></script>
|
2021-02-02 11:10:04 +00:00
|
|
|
> <script>
|
|
|
|
> const Engine = window.publicodes.default
|
|
|
|
> </script>
|
|
|
|
> ```
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
La variable `engine` permet en ensuite de calculer la valeur d'une règle avec la
|
2021-02-18 11:46:40 +00:00
|
|
|
méthode `evaluate` :
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
```js
|
|
|
|
console.log(engine.evaluate('dépenses primeur'))
|
|
|
|
```
|
|
|
|
|
|
|
|
La valeur du nœud est disponible dans la propriété `nodeValue`, son
|
|
|
|
unité est disponible dans la propriété `unit`. Mais pour un formattage sans
|
2021-02-18 11:46:40 +00:00
|
|
|
effort, on préfèrera utiliser la fonction `formatValue` :
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
```js
|
|
|
|
import Engine, { formatValue } from 'publicodes'
|
|
|
|
// ...
|
|
|
|
const dépenses = engine.evaluate('dépenses primeur')
|
|
|
|
console.log(`J'ai dépensé ${formatValue(dépenses)} chez le primeur.`)
|
|
|
|
```
|
|
|
|
|
|
|
|
La méthode `setSituation` permet de forcer la valeur d'une liste de règles. Elle
|
2021-02-18 11:46:40 +00:00
|
|
|
est utile pour préciser les paramètres spécifiques à une simulation :
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
```js
|
|
|
|
// Ici on change le prix des avocats
|
|
|
|
engine.setSituation({
|
2020-12-15 10:14:35 +00:00
|
|
|
'prix . avocat': '3€/avocat',
|
2020-12-07 17:25:45 +00:00
|
|
|
})
|
|
|
|
```
|
|
|
|
|
|
|
|
La valeur de `dépenses primeur` se base maintenant sur un avocat à 3€ :
|
|
|
|
|
|
|
|
```js
|
|
|
|
// On ré-évalue la règle dans la nouvelle situation
|
|
|
|
console.log(
|
|
|
|
`Nouveau prix ! Dépenses mises à jour: ${formatValue(
|
|
|
|
engine.evaluate('dépenses primeur')
|
|
|
|
)}.`
|
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
### Évaluation d'expressions
|
|
|
|
|
2021-02-18 11:46:40 +00:00
|
|
|
La fonction `evaluate` permet d'évaluer des expressions publicode complètes :
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
```js
|
|
|
|
// On va au marché une fois par semaine, amortissons la dépense sur 7 jours
|
|
|
|
const depensesParJour = engine.evaluate('dépenses primeur / 7 jours')
|
|
|
|
console.log(`J'ai dépensé ${formatValue(depensesParJour)}.`)
|
|
|
|
```
|
|
|
|
|
|
|
|
### Conversion d'unité
|
|
|
|
|
|
|
|
Publicode permet de réaliser des conversions d'unités. Pour celà il faut
|
2020-12-15 10:14:35 +00:00
|
|
|
indiquer l'unité désirée via le mécanisme [`unité`](https://publi.codes/documentation/mécanismes#unité) :
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
```js
|
|
|
|
// on va au marché une fois par semaine en moyenne, combien dépense-t-on par mois ?
|
2020-12-15 10:14:35 +00:00
|
|
|
const depensesParMois = engine.evaluate({
|
|
|
|
valeur: 'dépenses primeur / 7 jours',
|
|
|
|
unité: '€/mois',
|
2020-12-07 17:25:45 +00:00
|
|
|
})
|
|
|
|
console.log(`J'ai dépensé ${formatValue(depensesParMois)}.`)
|
|
|
|
```
|
|
|
|
|
2020-12-15 10:14:35 +00:00
|
|
|
[➡ en savoir plus sur les unités](https://publi.codes/documentation/principes-de-base#unités)
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
### Variables manquantes
|
|
|
|
|
2021-02-18 11:46:40 +00:00
|
|
|
Publicode calcule automatiquement les dépendances de chaque règle. Si la
|
|
|
|
valeur d'une dépendance est manquante et ne permet pas de faire le calcul, elle
|
|
|
|
apparaîtra dans la propriété `missingVariables` :
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
```js
|
|
|
|
const missingYEngine = new Engine(`
|
|
|
|
x: y + 5
|
|
|
|
|
|
|
|
y:
|
|
|
|
`)
|
|
|
|
|
|
|
|
console.log(missingYEngine.evaluate('x').missingVariables)
|
|
|
|
```
|
|
|
|
|
|
|
|
Cette information est utile pour intégrer publicode à votre application.
|
|
|
|
|
|
|
|
Il est aussi possible d'utiliser des valeurs par défaut. Dans ce cas la règle
|
|
|
|
sera calculée avec la valeur par défaut de sa dépendance, mais cette dernière
|
|
|
|
apparaîtra tout de même dans les `missingVariables`. Cette fonctionnalité est
|
|
|
|
utile pour réaliser des simulateurs où l'on veut proposer un résultat sans
|
|
|
|
attendre que l'utilisateur ait répondu à l'intégralité des questions tout en
|
|
|
|
utilisant la liste des variables manquantes pour déterminer les questions
|
|
|
|
restant à poser.
|
|
|
|
|
|
|
|
Les variables manquantes sont calculées lors de l'évaluation. Si une variable
|
|
|
|
apparaît dans la formule de calcul d'une règle elle ne sera rapportée que si
|
|
|
|
elle est effectivement nécessaire au calcul. Si elle est présente dans une
|
|
|
|
portion non active de l'évaluation (par exemple dans un bloc condition non
|
|
|
|
actif, ou la tranche d'un barème non actif) elle sera filtrée et n'apparaîtra
|
|
|
|
pas dans les `missingVariables`.
|
|
|
|
|
|
|
|
### Documentation interactive
|
|
|
|
|
|
|
|
Publicodes génère également pour vous une documentation interactive, très
|
2020-12-16 13:52:40 +00:00
|
|
|
facilement intégrable dans une app React. Pour cela, il vous suffit d'importer
|
2020-12-07 17:25:45 +00:00
|
|
|
le composant dédié, et passer l'`engine` à afficher dans les props.
|
|
|
|
|
2020-12-16 13:52:40 +00:00
|
|
|
Il faut commencer par installer la librairie `publicodes-react` :
|
|
|
|
|
|
|
|
```sh
|
|
|
|
$ npm install publicodes-react
|
|
|
|
```
|
|
|
|
|
2020-12-07 17:25:45 +00:00
|
|
|
```jsx
|
2020-12-16 13:52:40 +00:00
|
|
|
import { Documentation } from 'publicodes-react'
|
2020-12-07 17:25:45 +00:00
|
|
|
|
|
|
|
function MonApp() {
|
|
|
|
return (
|
|
|
|
<ReactRouter>
|
|
|
|
<Documentation
|
|
|
|
engine={engine}
|
|
|
|
documentationPath={'/documentation'}
|
|
|
|
/>
|
|
|
|
{/* Composants de l'app */}
|
|
|
|
</ReactRouter>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Vous pourrez ensuite faire un lien vers la documentation avec le composant
|
|
|
|
`RuleLink`.
|
|
|
|
|
|
|
|
```jsx
|
|
|
|
import { RuleLink } from 'publicodes'
|
|
|
|
|
|
|
|
function MesDépenses() {
|
|
|
|
return (
|
|
|
|
<p>
|
|
|
|
Accéder aux{' '}
|
|
|
|
<RuleLink
|
|
|
|
dottedName={'dépenses primeur'}
|
|
|
|
engine={engine}
|
|
|
|
documentationPath={'/documentation'}
|
|
|
|
/>
|
|
|
|
</p>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
```
|