238 lines
8.2 KiB
ReStructuredText
238 lines
8.2 KiB
ReStructuredText
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.
|