Skip to main content

Generate source code for C++, Rust, Go or Python from a Flatdata schema file

Project description

flatdata-generator

Build Status

Generates code from a flatdata schema file.

For more information on flatdata and its implementations, please refer to flatdata's homepage.

Using flatdata-generator

# installation
pip3 install flatdata-generator

# example: generate a header-only C++ library
flatdata-generator -s locations.flatdata -g cpp -O locations.hpp

Currently supported target languages:

  • C++
  • Rust
  • Python
  • Go
  • Dot (graph of the schema)
  • Flatdata (normalized stable schema)

Architecture

Stages

The flatdata generator works in several stages which are clearly separated from one another and can be extended/tested in isolation:

  1. Parse the source schema file using pyparsing library. Grammar for the schema is defined in grammar.py

  2. Construct a node tree out of pyparsing.ParseResults. The node tree contains entities for every construct of flatdata grammar, organized in hierarchical order, allowing non-tree references between nodes:

    • Namespace - Nesting namespaces in the tree is allowed.
    • Structure - Structures are grouping together a set of fields.
    • Archive - Archives are grouping together resources and are referencing structures or other archives (see Reference)
    • ResourceBase - All resources derive from ResourceBase
    • Reference - All references between flatdata entities are modeled with Reference nodes. All references participate in name resolution. There are two type of references:
      • RuntimeReference - model explicit references and bound resources that show themselves at runtime.
      • TypeReference - model type dependencies, which are used during topological sorting at a later stage and for schema resolution.
  3. Augment the tree with structures and references that are not directly corresponding to pyparsing.ParseResults or needed to implement advanced features. Among these:

    • Add builtin structures if any of the resources require them. For example, multivector< N, ... > requires _builtin.multivector.IndexTypeN to be available in the parent namespace.
    • Add constant references to all archives so that constants are available for schema resolution.
  4. Resolve references iterates through all references and tries to find a node they refer to, either in:

    • Parent scopes until (inclusive) innermost parent namespace.
    • Root node if path is fully qualified.
  5. Perform topological sorting to detect cycles in between entities and to determine the order of serialization for targets that depend on one.

  6. Generate the source code using nodes in topological order and/or the tree (depending on the generator architecture - recursive descent or iterative).

Node Tree

Every node of the tree consists of its name, properties (metadata) and holds references to its children. Every node is reachable via certain path which is a dot-joint concatenation of the names of its parents. Node tree enforces several properties of the flatdata schema:

  • No conflicting declarations: No two nodes with the same path are allowed.
  • All references are correct: All reference nodes are resolvable.
  • No cyclic dependencies among resources: All TypeReference participate in topological sorting of the DAG formed by the tree edges and edges between source and target of a TypeReference

References

Reference names are mangled so they are not ambiguous with other paths components. For example reference to type T would have name @T, and similarly reference to .foo.bar.T would change to @@foo@bar@T.

Project details


Download files

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

Source Distribution

flatdata_generator-0.4.6.tar.gz (36.4 kB view details)

Uploaded Source

Built Distribution

flatdata_generator-0.4.6-py2.py3-none-any.whl (68.3 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file flatdata_generator-0.4.6.tar.gz.

File metadata

  • Download URL: flatdata_generator-0.4.6.tar.gz
  • Upload date:
  • Size: 36.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.12

File hashes

Hashes for flatdata_generator-0.4.6.tar.gz
Algorithm Hash digest
SHA256 f6e88603a67405c8b5abf37948de6ba7ce5dcb1d2ca2c731db1664ca3aecc5ca
MD5 f400f1523fde7c9aec56953db17bb748
BLAKE2b-256 2e85251e3ff7ab45267601209c7ca0d5e27d6208dea9af4567ee8b50208b9e85

See more details on using hashes here.

File details

Details for the file flatdata_generator-0.4.6-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for flatdata_generator-0.4.6-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 6701351d6fe5dbd11464b660d5d54e7767230b401f3ac4dfd2c310149cdaf877
MD5 e28325e9fafab08131e83f8bf4329957
BLAKE2b-256 4de0c2cb8f005dc51ff2167e57e2242848592d7a94c7a64a6c089c3c4326c0b0

See more details on using hashes here.

Supported by

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