From 04f30963f495bacfbadbcba221be323324b707c1 Mon Sep 17 00:00:00 2001 From: gwen Date: Mon, 28 Oct 2024 21:08:22 +0100 Subject: [PATCH] family in turorial --- docs/tutorial/index.rst | 11 ++- docs/tutorial/preliminary.rst | 51 +++++++++++--- docs/tutorial/proxymode.rst | 125 ++++++++++++++++++---------------- 3 files changed, 114 insertions(+), 73 deletions(-) diff --git a/docs/tutorial/index.rst b/docs/tutorial/index.rst index 11ebe4d9d..26254a89a 100644 --- a/docs/tutorial/index.rst +++ b/docs/tutorial/index.rst @@ -9,20 +9,19 @@ Here's a quite well supplied tutorial, we're gonna start with a use case that co "how to set a proxy" in the `Mozilla Firefox `_ browser use case. -More precisely, this tutorial aims at reproducing :term:`variable`\ s (that is, configuration options) behind this Mozilla Firefox settings page: +More precisely, this tutorial aims at reproducing :term:`variable`\ s (in this use case we will call them configuration options) behind this Mozilla Firefox settings page: .. image:: images/firefox.png -.. attention:: We are not coding a firefox plugin here. +.. note:: We are not coding a firefox plugin here. We are just going to handle some of the firefox configuration settings with Rougail. - -Presentation of the firefox configuration variables +Presentation of the firefox option configuration variables ----------------------------------------------------------- -Let's dive into the configuration validation use case, -that is the values entered by the user that have to be validated. +Let's dive into this configuration validation use case. +The values entered by the user that have to be validated. At first glance we have a selection of five options configuration values that we need to fill in: diff --git a/docs/tutorial/preliminary.rst b/docs/tutorial/preliminary.rst index c7fcfdbee..df24abbb3 100644 --- a/docs/tutorial/preliminary.rst +++ b/docs/tutorial/preliminary.rst @@ -86,14 +86,14 @@ So, if : .. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/tag/v1.1_010/firefox/00-proxy.yml :linenos: :language: yaml - :caption: The :file:`struct/config.yaml` rougail structure file, with no default value set. + :caption: The :file:`firefox/00-proxy.yaml` rougail structure file, with no default value set. :name: RougailDictionaryNoDefault .. --- proxy_mode: -In this situation there are no default value set. The rougail CLI will output an error : +Then the rougail CLI will output an error : .. code-block:: shell :caption: A rougail Command Line Utility call with the :file:`config/01/config.yaml` rougail dictionnary file @@ -111,16 +111,21 @@ In this situation there are no default value set. The rougail CLI will output an .. important:: Once defined, an option configuration :term:`value` is :term:`mandatory`. -Rougail waits for a value to be set, that's why. +Rougail waits for the `proxy_mode` configuration option's value to be set. .. seealso:: To go further, have a look at the :tiramisu:`mandatory option ` Tiramisu's definition. -Type inference +.. glossary:: + + mandatory + + A variable is mandatory when a value is required, that is, `None` is not an option. + +Typing a variable ----------------- -By default, rougail infers a `string` type for the `proxy_mode` configuration option variable type as defined -in the structure file. -. +If the `type` attribute is not set, rougail infers a `string` type for the `proxy_mode` configuration option variable type as defined in the structure file. + If the operator sets an option value for example with the `number` type, like this: .. code-block:: yaml @@ -133,10 +138,10 @@ If the operator sets an option value for example with the `number` type, like th Then rougail will expect a `int` or a `float` as a value for the `example_var` variable. In our firefox use case, the real type of the `proxy_mode` variable is a `choice` type: -.. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/commit/v1.1_013/config/05/config.yaml +.. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/tag/v1.1_013/firefox/00-proxy.yml :linenos: :language: yaml - :caption: The :file:`config/05/config.yaml` rougail dictionnary file, with a default value set. + :caption: The :file:`firefox/00-proxy.yml` rougail dictionnary file, with a default value set. :name: RougailDictionaryChoiceTypeWitheDefault .. @@ -166,6 +171,33 @@ In our firefox use case, the real type of the `proxy_mode` variable is a `choice ┗━━ 📓 proxy_mode: No proxy +The `proxy_mode` variable here, implicitely requires a value. It is a :term:`mandatory` variable. + +It shall have a value, but what if the user *does not* specify any value? +There is a possibility of setting a default value, wich is set as `No proxy` by default. + +Container type +----------------- + +We say that the `proxy_mode` variable is *constrained* (by the `choice` type). + +We have the list of the possible (authorized) values: + +- `No proxy` +- `Auto-detect proxy settings for this network` +- `Use system proxy settings` +- `Manual proxy configuration` +- `Automatic proxy configuration URL` + +.. glossary:: + + choice type + + The `proxy_mode` setting is "choice" (`type: choice`) means that + there is a list of available values that can be selected. + +.. note:: Indeed, in the Firefox configuration, it is possible to define several configuration modes, + from no proxy at all (`no proxy`) to a kind of automatic configuration mode from a file (`set up proxy configuration from a file`). .. keypoints:: Key points progress @@ -178,6 +210,7 @@ In our firefox use case, the real type of the `proxy_mode` variable is a `choice - a variable's default value - the :term:`integrator` and :term:`operator` roles - a mandatory value + - a choice type To sum up, we have arrived at this point in writing the structure file: diff --git a/docs/tutorial/proxymode.rst b/docs/tutorial/proxymode.rst index 30f70bc4b..3737fd990 100644 --- a/docs/tutorial/proxymode.rst +++ b/docs/tutorial/proxymode.rst @@ -1,25 +1,35 @@ -Firefox tutorial: the `mode_proxy` variable ------------------------------------------------- - The `proxy` family -------------------- +==================== -Let's create our first :term:`dictionary`. -.. prerequisites:: Let's create a folder named `dict` and a dictionary file inside +.. objectives:: Objectives -We will put our dictionary files in this folder. + We will learn how to: -Then let's put our first dictionary file in this folder, named :file:`00-proxy.yml` + - create a :term:`family` + - gather variables into a family + - make a variable in a variable, which is a family too -.. code-block:: yaml - :caption: the :file:`00-proxy.yml` file + +.. type-along:: Reminders + + - As a prerequisite we have an idea of what a :term:`structure file description ` is. + - We have a :file:`firefox` folder and we are putting all the structure description files in it. + - We had at the :term:`structure description file ` + +A `manual` family +-------------------- + +.. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/tag/v1.1_020/firefox/10-manual.yml :linenos: + :language: yaml + :caption: A family structure file description named `manual` in the :file:`firefox/10-manual.yml` file + :name: RougailFirstDictionary +.. --- - version: '1.1' - proxy: - description: Proxy configuration in order to have access to the internet + manual: + description: Manual proxy configuration type: family We can see that we have defined a :term:`family` here, and this family is *empty* @@ -27,67 +37,66 @@ We can see that we have defined a :term:`family` here, and this family is *empty .. admonition:: If a family is empty - We need to specify the :term:`family` type (line 5) here because if we don't, + We need to specify the :term:`family` type here because if we don't, the Rougail's type engine will infer it by default as a :term:`variable`. -It's because we don't have set any :term:`variable` inside. +It's because we don't have set any :term:`variable` inside. If we make a YAML block +(that is, if we indent), the Rougail's type inference engine will implicitely make it a family. - -.. note:: The variables will be created in several files for educational purposes. +.. note:: The variables, families, etc. will be created in several files for educational purposes. Obviously all the variables can be put in the same file. +A family inside a family +---------------------------- -The proxy's configuration type ----------------------------------- +Creating a family hierarchy is very easy, here is an example -In the Firefox configuration, it is possible to define several configuration modes, -from no proxy at all (`no proxy`) to a kind of automatic configuration mode from a file (`set up proxy configuration from a file`). +.. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/tag/v1.1_021/firefox/10-manual.yml + :linenos: + :language: yaml + :caption: A rougail structure description file with a hierarchy. + :name: RougailFirstFamilyHierarchy + +.. + --- + manual: + description: Manual proxy configuration + type: family + + http_proxy: + description: HTTP Proxy + type: family + +Here the `http_proxy` family lives inside the `manual` family. + +Put a variable inside a family or a sub family +-------------------------------------------------- Let's create a variable in its family with a description and a default value. The type of this variable is a `choice` type: -.. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/commit/v1.1_006/firefox/00-proxy.yml +.. extinclude:: https://forge.cloud.silique.fr/stove/rougail-tutorials/raw/tag/v1.1_022/firefox/10-manual.yml :linenos: :language: yaml - :caption: A rougail dictionnary file with a choice variable named `proxy_mode`, with a default value and a description. - :name: RougailDictionaryFirstVariableChoiceType + :caption: An `address` variable in the `http_proxy` family + :name: RougailVariableInSubFamily -.. glossary:: +.. + --- + manual: + description: Manual proxy configuration + type: family - mandatory + http_proxy: + description: HTTP Proxy + type: family - A variable is mandatory when a value is required, that is, `None` is not an option. + address: + description: HTTP address -The `proxy_mode` variable here, implicitely requires a value. It is a mandatory variable. +.. keypoints:: Key points progress -It shall have a value, but what if the user *does not* specify any value? -There is a possibility of setting a default value, wich is set as `No proxy` by default. - -.. glossary:: - - choice type - - The `proxy_mode` setting is "choice" (`type: choice`) means that - there is a list of available values that can be selected. - -We say that the `proxy_mode` variable is *constrained* (by the `choice` type). - -We have the list of the possible (authorized) values: - -- `No proxy` -- `Auto-detect proxy settings for this network` -- `Use system proxy settings` -- `Manual proxy configuration` -- `Automatic proxy configuration URL` - -Now let's test our first two dictionaries: - ->>> from rougail import Rougail, RougailConfig ->>> from pprint import pprint ->>> RougailConfig['dictionaries_dir'] = ['dict'] ->>> rougail = Rougail() ->>> config = rougail.get_config() ->>> config.property.read_only() ->>> pprint(config.value.get(), sort_dicts=False) -{'rougail.proxy.proxy_mode': 'No proxy'} + **Keywords** + - :term:`family`, and sub families + - variables defined in a family