rougail/docs/tutorial/sequence.rst

238 lines
8.2 KiB
ReStructuredText
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Homogeneous elements sequence
==================================
.. objectives:: Objectives
We are going to discuss a new Rougail type, :term:`the sequence of homogeneous elements <sequence>`
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 <installation>` 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 <src/branch/1.1>`,
this workshop page corresponds to the tag :tutorial:`1.1_190 <src/tag/1.1_190/README.md>`
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 <https://addons.mozilla.org/en-US/firefox/addon/foxyproxy-standard/>`_ 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 <sequence>`.
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 <tutorial_not_mandatory_list>`.
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 <sequence_family>`
.. 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 <sequence_family>`.
**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.