Display the result
==================

After construct a configuration, loads user datas, you can choose this configuration in different output format.

First of create, let's create a structural file like this:

.. code-block:: yaml
    :caption: the :file:`dist/00-base.yml` file content

    %YAML 1.2
    ---
    version: 1.1

    my_variable: my value   # My first variable

    my_boolean_variable: true  # My boolean variable

    my_integer_variable: 1  # My integer variable

    my_secret_variable:
      description: My secret variable
      type: secret
      default: MyVeryStrongPassword
    ...

Display in a console
--------------------

We can display configuration directly in the console:

.. code-block:: python
    :caption: the :file:`script.py` file content

    from rougail import Rougail, RougailConfig
    from rougail.output_console import RougailOutputConsole

    RougailConfig["main_namespace"] = None
    RougailConfig["main_structural_directories"] = ["dist/"]
    RougailConfig["step.output"] = "console"
    rougail = Rougail()
    config = rougail.run()
    config.property.read_only()
    RougailOutputConsole(config).print()

.. FIXME display console!

console.key_is_description
''''''''''''''''''''''''''

By default, the key is the variable description, if you prefer have only the path:

.. code-block:: python
    :caption: the :file:`script.py` file content

    from rougail import Rougail, RougailConfig
    from rougail.output_json import RougailOutputJson

    RougailConfig["main_namespace"] = None
    RougailConfig["main_structural_directories"] = ["dist/"]
    RougailConfig["step.output"] = "console"
    rougail = Rougail()
    config = rougail.run()
    config.property.read_only()
    RougailOutputJson(config).print()


.. FIXME display console!

console.show_secrets
''''''''''''''''''''

Secrets are remplace by "*******", to display real secrets:

.. code-block:: python
    :caption: the :file:`script.py` file content

    from rougail import Rougail, RougailConfig
    from rougail.output_console import RougailOutputConsole

    RougailConfig["main_namespace"] = None
    RougailConfig["main_structural_directories"] = ["dist/"]
    RougailConfig["step.output"] = "console"
    RougailConfig["console.show_secrets"] = True
    rougail = Rougail()
    config = rougail.run()
    config.property.read_only()
    RougailOutputConsole(config).print()

.. FIXME display console!

console.mandatory
'''''''''''''''''

Before display configuration, mandatories variables are check. If you don't want, add the parameter `console.mandatory` to False:

.. code-block:: python
    :caption: the :file:`script.py` file content

    from rougail import Rougail, RougailConfig
    from rougail.output_console import RougailOutputConsole

    RougailConfig["main_namespace"] = None
    RougailConfig["main_structural_directories"] = ["dist/"]
    RougailConfig["step.output"] = "console"
    RougailConfig["console.mandatory"] = False
    rougail = Rougail()
    config = rougail.run()
    config.property.read_only()
    RougailOutputConsole(config).print()

.. FIXME display console!

JSON
----

Your script can return a JSON object:

.. code-block:: python
    :caption: the :file:`script.py` file content

    from rougail import Rougail, RougailConfig
    from rougail.output_console import RougailOutputConsole

    RougailConfig["main_namespace"] = None
    RougailConfig["main_structural_directories"] = ["dist/"]
    RougailConfig["step.output"] = "json"
    rougail = Rougail()
    config = rougail.run()
    config.property.read_only()
    RougailOutputConsole(config).print()

Let's try this script:

.. code-block:: bash

    $ python script.py
    {
      "my_variable": "my value",
      "my_boolean_variable": true,
      "my_integer_variable": 1,
      "my_secret_variable": "MyVeryStrongPassword"
    }

ANSIBLE
-------

It's possible to use Ansible has a output format.

The goal is here to use Ansible has a dynamic user's inventories structure manage by Rougail.

This output needs an extra namespace, named, by default, "hosts". This namespace define your hosts and groups.

Let's create a single group "my_group" with one host "group1.net":

.. code-block:: yaml
   :caption: the :file:`hosts/00-hosts.yml` file content

    %YAML 1.2
    ---
    version: 1.1

    hostnames:

      my_group:

        hosts:
          type: domainname
          default:
            - group1.net
    ...

Now we can generate Ansible inventory:

.. code-block:: python
    :caption: the :file:`script.py` file content

    #!/bin/env python
    from rougail import Rougail, RougailConfig
    from rougail.output_ansible import RougailOutputAnsible

    RougailConfig["main_namespace"] = "main"
    RougailConfig["main_structural_directories"] = ["dist/"]
    RougailConfig['extra_namespaces']['hosts'] = ['hosts/']
    RougailConfig["step.output"] = "ansible"
    rougail = Rougail()
    config = rougail.run()
    config.property.read_only()
    RougailOutputAnsible(config).print()

We will retrieved all ours variables associate to this group with all variables inside the namespace `main`:

.. code-block:: bash

    $ python script.py 
    {
      "_meta": {
        "hostvars": {
          "group1.net": {
            "ansible_host": "group1.net",
            "main": {
              "my_variable": "my value",
              "my_boolean_variable": true,
              "my_integer_variable": 1,
              "my_secret_variable": "MyVeryStrongPassword"
            }
          }
        }
      },
      "my_group": {
        "hosts": [
          "group1.net"
        ]
      }
    }

We can now use our script as an inventory source in Ansible:

.. code-block:: bash

   $ chmod +x script.py
   $ ansible-inventory -i script.py --list
    {
        "_meta": {
            "hostvars": {
                "group1.net": {
                    "ansible_host": "group1.net",
                    "main": {
                        "my_boolean_variable": true,
                        "my_integer_variable": 1,
                        "my_secret_variable": "MyVeryStrongPassword",
                        "my_variable": "my value"
                    }
                }
            }
        },
        "all": {
            "children": [
                "ungrouped",
                "my_group"
            ]
        },
        "my_group": {
            "hosts": [
                "group1.net"
            ]
        }
    }

DOC
---

We can generate the documentation of all the Rougail variable:

.. code-block:: python
    :caption: the :file:`script.py` file content

    from rougail import Rougail, RougailConfig
    from rougail.output_doc import RougailOutputDoc

    RougailConfig["main_namespace"] = "main"
    RougailConfig["main_structural_directories"] = ["dist/"]
    RougailConfig["step.output"] = "doc"
    rougail = Rougail()
    config = rougail.run()
    config.property.read_only()
    RougailOutputDoc(config).print()

.. FIXME : display
