Skip to main content

Generate code from DSDL using Jinja2 templates.

Project description

tox build (main)

Build status

static analysis

Sonarcloud Quality Gate Sonarcloud bugs

unit test code coverage

Sonarcloud coverage

Python versions supported

Supported Python Versions

latest released version

PyPI Release Version

documentation

Documentation Status

license

MIT license

community/support

OpenCyphal forum

Nunavut is a source-to-source compiler (transpiler) that automatically converts OpenCyphal DSDL definitions into source code in a specified target programming language. It is constructed as a template engine that exposes a PyDSDL abstract syntax tree to Jinja2 templates allowing authors to generate code, schemas, metadata, documentation, etc.

/docs/static/images/nunavut_pipeline.svg

Nunavut DSDL transcompilation pipeline.

Nunavut ships with built-in support for some programming languages, and it can be used to generate code for other languages if custom templates (and some glue logic) are provided. Currently, the following languages are supported out of the box:

  • C11 (generates header-only libraries)

  • C++ (generates header-only libraries; work-in-progress)

  • Python (generates Python packages)

  • HTML (generates documentation pages)

Nunavut is named after the Canadian territory. We chose the name because it is a beautiful word to say and read.

Installation

Nunavut depends on PyDSDL.

Install from PIP:

pip install -U nunavut

Examples

The examples do not replace the documentation, please do endeavor to read it.

Generate C headers using the command-line tool

This example assumes that the public regulated namespace directories uavcan reside under public_regulated_data_types/. Nunavut is invoked to generate code for the former.

nnvg --target-language c --enable-serialization-asserts public_regulated_data_types/reg --lookup-dir public_regulated_data_types/uavcan

Generate HTML documentation pages using the command-line tool

See above assumptions. The below commands generate documentation for the reg namespace.

as well, because there are types in reg that will link to uavcan documentation sections.

nnvg --experimental-languages --target-language html public_regulated_data_types/reg --lookup-dir public_regulated_data_types/uavcan

Note that using the --lookup-dir option will only generate types under uavcan that are referenced by types in reg. To generate all types in both directories simply target each namespace.

nnvg --experimental-languages --target-language html public_regulated_data_types/reg public_regulated_data_types/uavcan

Generate Python packages using the command-line tool

This example assumes that the public regulated namespace directories reg and uavcan reside under public_regulated_data_types/. Nunavut is invoked to generate code for the former.

nnvg --target-language py public_regulated_data_types/reg --lookup-dir public_regulated_data_types/uavcan

Use custom templates

Partial example: generating a C struct

   /*
    * Cyphal data structure definition
    *
    * Auto-generated, do not edit.
    *
    * Source file: {{T.source_file_path.as_posix()}}
    */

    #ifndef {{T.full_name | ln.c.macrofy}}
    #define {{T.full_name | ln.c.macrofy}}

    {%- for constant in T.constants %}
    #define {{ T | ln.c.macrofy }}_{{ constant.name | ln.c.macrofy }} {{ constant | constant_value }}
    {%- endfor %}

    typedef struct
    {
        /*
            Note that we're not handling union types properly in this simplified example.
            Unions take a bit more logic to generate correctly.
        */
        {%- for field in T.fields_except_padding %}
            {{ field.data_type | declaration }} {{ field | id }}
            {%- if field.data_type is ArrayType -%}
                [{{ field.data_type.capacity }}]
            {%- endif -%};
        {%- if field is VariableLengthArrayType %}
            {{ typename_unsigned_length }} {{ field | id }}_length;
        {%- endif -%}
        {%- endfor %}
...

    } {{ T | full_reference_name }};

    #endif // {{T.full_name | ln.c.macrofy}}

More examples

Where to find more examples to get started:

  1. See built-in templates under nunavut.lang.LANGUAGE.templates.

  2. API usage examples can be found in the Pycyphal library.

Extras

Support for shell autocomplete (see argcomplete docs for full details)

pip install "nunavut[shell]"

# if you haven't setup argcomplete ever...
activate-global-python-argcomplete
source ~/.my_shell_rc_thingy_see_argcomplete_docs

# now register nnvg with argcomplete
eval "$(register-python-argcomplete nnvg)"

Bundled third-party software

Nunavut embeds the following third-party software libraries into its source (i.e. these are not dependencies and do not need to be installed):

  • Jinja2 by Armin Ronacher and contributors, BSD 3-clause license.

  • markupsafe by Armin Ronacher and contributors, BSD 3-clause license (needed for Jinja).

Documentation

The documentation for Nunavut is hosted on readthedocs.io:

Nunavut is part of the OpenCyphal project:

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nunavut-3.0.0.dev1.tar.gz (350.1 kB view details)

Uploaded Source

Built Distribution

nunavut-3.0.0.dev1-py3-none-any.whl (398.2 kB view details)

Uploaded Python 3

File details

Details for the file nunavut-3.0.0.dev1.tar.gz.

File metadata

  • Download URL: nunavut-3.0.0.dev1.tar.gz
  • Upload date:
  • Size: 350.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for nunavut-3.0.0.dev1.tar.gz
Algorithm Hash digest
SHA256 bc5b91afc2ea4cf7bf680b5ab7472a20be728cabb969caaa56caa708fd208520
MD5 265e5fc1141aea632d61c4bebe7e4e97
BLAKE2b-256 1abaad035d7c7272d6a6fc740e5c3f1d8b9e2bb98bbe12bdf0c3e35cd0444e35

See more details on using hashes here.

File details

Details for the file nunavut-3.0.0.dev1-py3-none-any.whl.

File metadata

  • Download URL: nunavut-3.0.0.dev1-py3-none-any.whl
  • Upload date:
  • Size: 398.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.11.11

File hashes

Hashes for nunavut-3.0.0.dev1-py3-none-any.whl
Algorithm Hash digest
SHA256 2c697a4fdb1cc9b6b9dd7d41113e191bd15485a2752404a199f3a16abd7cb9ab
MD5 732c912a14ad474a72ebadc1ba4b504d
BLAKE2b-256 2ddfc41c9e997787cf4af7a63d2e4fc876897ae601ab9faceea90e7538b8a26f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page