diff --git a/docs/tutorial/jinja.rst b/docs/tutorial/jinja.rst index d88142ad9..124e8aad8 100644 --- a/docs/tutorial/jinja.rst +++ b/docs/tutorial/jinja.rst @@ -35,13 +35,6 @@ Playing with Jinja .. type-along:: Why the jinja templating engine ? We are going to embed some `jinja templating code `_ in our structure file. - -.. questions:: What about a `Jinja` calculation? - -The :term:`Jinja` templating language enables some complex calculation. -We can code more complex behavior that hiding or disabling a variable depending on the value of another variable, -as we saw before. - .. glossary:: @@ -51,6 +44,13 @@ as we saw before. we are using Jinja in a classical way, that is, Jinja allows us to handle different cases, for example with the `if` statement. + +.. questions:: What about a `Jinja` calculation? + +The :term:`Jinja` templating language enables some complex calculation. +For example we can code more complex behavior for hiding or disabling a variable, that is +not only depending on the value of another variable as we saw before. + A conditional hidden family with Jinja --------------------------------------- @@ -183,7 +183,7 @@ then we have a warning: so cannot access to "HTTPS address", it will be ignored when loading from the YAML file "config/01/config.yml" -It is interesting here to launch the Rougail CLI in the :term:`read write mode`: +What is interesting here is to launch the Rougail CLI in the :term:`read write mode`: :: @@ -198,270 +198,51 @@ Then we have an error: because has property "hidden" (HTTPS is same has HTTP) -FIXME - -We can hide or disable some variables or families with other techniques than -pointing on a variable's value. - -Let's reason on the previous HTTPS proxy configuration's manual mode: - -.. code-block:: yaml - - manual: - - use_for_https: - description: Also use this proxy for HTTPS - default: true - - https_proxy: - type: family - description: HTTPS Proxy - hidden: - variable: manual.use_for_https +.. note:: Note that we can see the "HTTPS is same has HTTP" string (the one that was present in the jinja code) + as an explanation inside the error message. -This is extracted from the proxy's manual configuration we discussed before. - -We see here that there is an `https_proxy` family that is going to be hidden -depending on the value of another variable: - -.. code-block:: yaml - - https_proxy: - type: family - hidden: - variable: manual.use_for_https - -Now we could write it like that: - -.. code-block:: yaml - - manual: - - use_for_https: - description: Also use this proxy for HTTPS - default: true - - https_proxy: - description: HTTPS Proxy - type: family - hidden: - type: jinja - jinja: | - {% if rougail.manual.use_for_https %} - the HTTPS Proxy family is hidden - {% endif %} - -Yes, it's done in a more complicated (but more powerful) way. -Let's explain this a little: - -We have replaced this simple hidden property declaration: - -.. code-block:: yaml - - hidden: - variable: manual.use_for_https - -by this (more complicated) hidden property declaration: - -.. code-block:: yaml - - hidden: - type: jinja - jinja: | - {% if rougail.manual.use_for_https %} - the HTTPS Proxy family is hidden - {% endif %} - -The fact is that it has same result, but here we have more possibilities. -The hidden process is done by a calculation. - -Another jinja calculation type sample ---------------------------------------- - -We can now hide or disable some variables or families with other techniques than -pointing on a variable's value. - -Let's reason upon the proxy's manual configuration we discussed before. -We have the :file:`dict/02-proxy_manual.yml` structure file: - -.. code-block:: yaml - :caption: the :file:`structfile/02-proxy_manual.yml` file - - --- - version: '1.1' - manual: - description: Manual proxy configuration - type: family - disabled: - type: jinja - jinja: | - {% if rougail.proxy.proxy_mode != 'Manual proxy configuration' %} - the proxy mode is not manual - {% endif %} - -.. questions:: Question - - **question**: OK then. What happens when you select the "Manual proxy configuration"? - -Here if the user selects the "Manual proxy configuration" proxy mode, -the the `manual` family will be disabled. This is what the jinja code says. -Let's explain it more precisely. - - -.. note:: The "the proxy mode is not manual" output is be used in the log outputs - for example while - -What can be calculated? ---------------------------- +.. type-along:: What can be calculated? We have seen that the `disabled` or `hidden` properties could be calculated. -The default values can be calculated too. +The default values can be calculated too. We'll see a bunch of examples later on. -.. todo:: montrer un exemple de valeur par défaut calculées (type jinja) - -.. todo:: montrer aussi ici des exemples de calculs de valeurs variables, ce qui est un des usages principaux de jinja - -Using jinja in a dynamic family declaration ------------------------------------------------ - -Let's come back to the previous section's FIXME `dynamic family example ` - -In a dynamic family, as seen before, you have the possibility to name your identifier. In the classic declaration, -the identifier's variable is named "identifier" by default. Sounds logical: +Let's reason on the previous HTTPS proxy configuration's manual mode settings: .. code-block:: yaml - "{{ identifier }}_proxy": - description: "{{ identifier }} Proxy" - dynamic: - - HTTPS - - SOCKS - -Here the identifer's variable takes the value of the `dynamic` family parameter. - -.. type-along:: Using a jinja calculation with a parameter - -We have the possibility to use a given variable variable inside a jinja calculation: - -.. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/tag/v1.1_050/firefox/20-manual.yml - :language: yaml - :caption: firefox/20-proxy.yml - -.. - manual: - use_for_https: - description: Also use this proxy for HTTPS default: true - "{{ identifier }}_proxy": - description: "{{ identifier }} Proxy" - dynamic: - - HTTPS - - SOCKS + https_proxy: + type: family + description: HTTPS Proxy hidden: - jinja: | - {% if my_identifier == 'HTTPS' and manual.use_for_https %} - HTTPS is same has HTTP - {% endif %} - params: - my_identifier: - type: identifier - description: | - in HTTPS case if "manual.use_for_https" is set to True + variable: _.use_for_https - address: - description: "{{ identifier }} address" - default: - variable: manual.http_proxy.address +We see here that the `https_proxy` family is be hidden +depending on the value of another variable. This is what we saw before, +how to hide a variable. - port: - description: "{{ identifier }} port" - default: - variable: manual.http_proxy.port - - version: - description: SOCKS host version used by proxy - choices: - - v4 - - v5 - default: v5 - disabled: - type: identifier - when: 'HTTPS' - -This can be done by defining a `my_identifier` variable. - -This jinja variable comes from the `params` parameter of the `hidden` property. - -.. code-block:: yaml - - params: - my_identifier: - type: identifier - -Here the `hidden` property's value is defined by a jinja calculation. -In this jinja calculation we have a `my_identifier` jinja variable. +Now we can code the same behavior in a somehow different way: .. code-block:: yaml + https_proxy': + description: HTTPS Proxy hidden: - jinja: | - {% if my_identifier == 'HTTPS' and manual.use_for_https %} - HTTPS is same has HTTP + jinja: |- + {% if _.use_for_https %} + HTTPS is same has HTTP {% endif %} - params: - my_identifier: - type: identifier - description: | - in HTTPS case if "manual.use_for_https" is set to True -.. type-along:: The `when` and `when_not` parameter notation +This code has the same result but yes, it's done in a more complicated way. +We have replaced this simple `hidden` property variable parameter by +a jinja parameter. The hidden process is done by a calculation. -.. todo:: ça devrait être sur une autre page. déplacer cela ailleurs - -Handling the SOCKS version ----------------------------- - -Now we need to handle the SOCKS version as show in the firefox configuration screenshot: - -.. image:: images/firefox_soks_version.png - - -We'll just add a choice variable with a default value and a disabled property: - -.. code-block:: yaml - - version: - description: SOCKS host version used by proxy - choices: - - v4 - - v5 - default: v5 - disabled: - type: identifier - when: 'HTTPS' - -There is still something new about this YAML, though. It is the `when` parameter -of the `disabled` property. You have two possible notations: `when` or `when_not`. -These two notations are just a short hand of what we could express in jinja as -this code: - -.. code-block:: jinja - - {% if identifier == 'HTTPS' %} - when the identifer equals 'HTTPS' then the SOCKS version is disabled - {% endif %} - -And the `when_not` parameter is just the logical opposite. - -Here is the final version of our YAML dynamic family: - -.. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/tag/v1.1_050/firefox/20-manual.yml - :language: yaml - :caption: firefox/20-proxy.yml +The fact is that it has same result, but it wil open more possibilities. +FIXME .. keypoints:: Key points