Homogeneous elements sequence ================================== .. objectives:: Objectives We are going to discuss a new Rougail type, :term:`the sequence of homogeneous elements ` which we will call, more concisely, a :term:`sequence`. It's a rather unusual :term:`family`. .. prerequisites:: Prerequisites - We assume that Rougail's library is :ref:`installed ` on your computer. - It is possible to retrieve the current state of the various Rougail files manipulated in this tutorial step by checking out the corresponding tag of the `rougail-tutorials` git repository. Each tag corresponds to a stage of progress in the tutorial. Of course, you can also decide to copy/paste or download the tutorial files contents while following the tutorial steps. If you want to follow this tutorial with the help of the corresponding :tutorial:`rougail-tutorials git repository `, this workshop page corresponds to the tag :tutorial:`1.1_190 ` in the repository. :: git clone https://forge.cloud.silique.fr/stove/rougail-tutorials.git git switch --detach 1.1_190 As a reminder, we are now talking about the Firefox add-on called `Foxy Proxy `_ use case, here is the Foxy Proxy widget: .. image:: images/foxyproxy.png A family with sequence type ------------------------------ .. note:: To be precise, we should say: a :term:`family with a sequence of homogeneous elements type `. Our request here is to have a list of homogeneous objects. Indeed, if we click on "Add proxy" in our Foxy Proxy widget, we will need to specify: - a proxy type - a color (and also enter some other values). And this applies to each proxy we will define. Here is the structure file associated with this use case: .. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/tag/v1.1_190/foxyproxy/00-foxyproxy.yml :language: yaml :caption: The FoxyProxy structure file :file:`foxyproxy/00-foxyproxy.yml` with the `proxies` sequence variable .. %YAML 1.2 --- version: 1.1 proxies: description: Proxy configuration type: sequence title: description: Title or Description mandatory: false color: # Color ... Unsurprisingly, the way to assign the `sequence` type is done with the help of the `type` parameter. We see here that `proxies` is a family because it contains the variables `title` and `color`. There is nothing new to say to this two variable: - `title` is not mandatory string - `color` is just a string .. note:: The first variable of the :term:`sequence` is not mandatory. This does not mean that the variable is :ref:`tutorial_nullable` or that the :ref:`list is empty `. In this case, that means that the sequence is empty. Which we could write in JSON like this: .. code-block:: json [] Now configure the sequence: .. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/commit/v1.1_190/config/02/config.yml :language: yaml :caption: A :file:`config/02/config.yml` user data file with the `proxies` sequence .. --- foxyproxy: proxies: - title: My company color: '#66cc66' We can see in the :term:`user data` YAML file that the `proxies` value is a list of mappings. Which we could write in JSON like this: .. code-block:: json [ { "title": "My company", "color": "#66cc66" } ] So we can clearly see in the JSON that if there's a `title` key, then there will also be a `color` key. This is guaranteed by our :term:`sequence` type. Let's launch our Rougail CLI: .. raw:: html :class: terminal :url: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/commit/v1.1_190/config/02/cmd_ro.txt .. rougail -m firefox/ -s Firefox -xn FoxyProxy -xd 0 foxyproxy/ --types types/proxy --modes_level basic standard advanced -u yaml -yf config/02/config.yml And the Rougail output is: .. raw:: html :class: output :url: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/commit/v1.1_190/config/02/output_ro.html .. Variables: ┣━━ πŸ“‚ firefox (Firefox) ┃ ┣━━ πŸ““ proxy_mode (Configure Proxy Access to the Internet): No proxy ┃ ┗━━ πŸ“‚ dns_over_https (DNS over HTTPS) ┃ ┗━━ πŸ““ enable_dns_over_https (Enable DNS over HTTPS): false ┗━━ πŸ“‚ foxyproxy (FoxyProxy) ┗━━ πŸ“‚ proxies (Proxy configuration) ┗━━ πŸ“‚ title (Title or Description) ┣━━ πŸ““ title (Title or Description): My company β—€ loaded from the ┃ YAML file "config/02/config.yml" ┗━━ πŸ““ color (Color): #66cc66 β—€ loaded from the YAML file "config/02/config.yml" .. type-along:: A sequence with multiple user data We will now look at the same `proxies` sequence variable, to which multiple values ​​are assigned: .. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/commit/v1.1_190/config/03/config.yml :language: yaml :caption: A :file:`config/03/config.yml` user data file with multiple values .. --- foxyproxy: proxies: - title: My company color: '#66cc66' - title: An other company color: '#cc66cc' - title: WPAD color: '#1166cc' Which we could write in JSON like this: .. code-block:: json [ { "title": "My company", "color": "#66cc66" }, { "title": "An other company", "color": "#cc66cc" }, { "title": "WPAD", "color": "#1166cc" } ] And now we can clearly see that this `proxies` variable of type `sequence` is a container for lists of values ​​of the same shape, and which contain the same number of elements: .. raw:: html :class: output :url: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/commit/v1.1_190/config/03/output_ro.html .. Variables: ┣━━ πŸ“‚ firefox (Firefox) ┃ ┣━━ πŸ““ proxy_mode (Configure Proxy Access to the Internet): No proxy ┃ ┗━━ πŸ“‚ dns_over_https (DNS over HTTPS) ┃ ┗━━ πŸ““ enable_dns_over_https (Enable DNS over HTTPS): false ┗━━ πŸ“‚ foxyproxy (FoxyProxy) ┗━━ πŸ“‚ proxies (Proxy configuration) ┣━━ πŸ“‚ title (Title or Description) ┃ ┣━━ πŸ““ title (Title or Description): My company β—€ loaded from the ┃ ┃ YAML file "config/03/config.yml" ┃ ┗━━ πŸ““ color (Color): #66cc66 β—€ loaded from the YAML file ┃ "config/03/config.yml" ┣━━ πŸ“‚ title (Title or Description) ┃ ┣━━ πŸ““ title (Title or Description): An other company β—€ loaded from ┃ ┃ the YAML file "config/03/config.yml" ┃ ┗━━ πŸ““ color (Color): #cc66cc β—€ loaded from the YAML file ┃ "config/03/config.yml" ┗━━ πŸ“‚ title (Title or Description) ┣━━ πŸ““ title (Title or Description): WPAD β—€ loaded from the YAML ┃ file "config/03/config.yml" ┗━━ πŸ““ color (Color): #1166cc β—€ loaded from the YAML file "config/03/config.yml" .. seealso:: To go further, you can have a look at the Rougail format pages :ref:`Sequence of homogeneous elements ` .. keypoints:: let's review the key points **Keywords** Sequence. We saw a :term:`sequence` type family, which full name is :ref:`Sequence of homogeneous elements `. **Comments** What is remarkable here is that we are dealing with a new form of :term:`consistency` which focuses on variables that are similar within a family, not because they have the same type, but because, as they are lists, they must have the same number of elements.