Module jumpscale.tools.schemac.plugins.crystal

Generator for crystal language. Takes in parsed schemas and generates crystal language classes.

Expand source code
"""Generator for crystal language. Takes in parsed schemas and generates crystal language classes.
"""
from .plugin import Plugin
from jumpscale.loader import j

types_map = {
    "": "String",
    "S": "String",
    "O": "Object",
    "I": "Int64",
    "F": "Float",
    "B": "Boolean",
    "L": "[] of Object",
    "LS": "[] of String",
    "LI": "[] of Int64",
    "LF": "[] of Float",
    "LO": "",
}


def get_prop_line(prop):
    prop_type = prop.prop_type
    crystal_type = types_map.get(prop_type)
    line = f"property {prop.name}"

    # print(f"\n\n{prop.name} => {prop} \n\n")
    # primitive with a default or not.
    if prop_type == "E":
        line += f" : {prop.name.capitalize()}"
    elif prop_type == "O":
        line += f" : {prop.url_to_class_name}"
    elif prop_type == "LO" and prop.defaultvalue and prop.defaultvalue != "[]":
        line += f" : [] of {prop.url_to_class_name}"
    elif prop_type == "LO" and not prop.defaultvalue:
        line += f" : [] of Object"
    elif crystal_type == "L" and not prop.defaultvalue:
        line += f" : [] of Object"
    elif crystal_type == "L" and prop.defaultvalue:
        line += f" = {crystal_type}"
    elif len(prop_type) > 1 and prop_type[0] == "L" and prop_type[1] != "O":
        line += f" : {crystal_type}"

    elif prop_type in ["I", "F", "B"] and not prop.defaultvalue:
        line += f" : {crystal_type}"
    elif prop_type in ["I", "F", "B"] and prop.defaultvalue:
        line += f" = {prop.defaultvalue}"
    elif prop_type == "S":
        line += f' = "{prop.defaultvalue}"'
    else:
        line += f": {crystal_type}"

    return line


SINGLE_TEMPLATE = """

class {{generated_class_name}}
{%- for prop in generated_properties.values() %}
    {{get_prop_line(prop)}}
{%- endfor %}
end

"""

TEMPLATE = """
#GENERATED CLASS DONT EDIT

{%- for enum in enums %}

enum {{enum['name']}}:
    {%- for enumval in enum['vals'] %}
    {{enumval}} = {{loop.index0}}
    {%- endfor %}
end
{%- endfor %}


{{classes_generated}}

"""


class CrystalGenerator(Plugin):
    def __init__(self):
        super().__init__()

        self._single_template = SINGLE_TEMPLATE
        self._template = TEMPLATE
        self._get_prop_line = get_prop_line
        self._types_map = types_map

Functions

def get_prop_line(prop)
Expand source code
def get_prop_line(prop):
    prop_type = prop.prop_type
    crystal_type = types_map.get(prop_type)
    line = f"property {prop.name}"

    # print(f"\n\n{prop.name} => {prop} \n\n")
    # primitive with a default or not.
    if prop_type == "E":
        line += f" : {prop.name.capitalize()}"
    elif prop_type == "O":
        line += f" : {prop.url_to_class_name}"
    elif prop_type == "LO" and prop.defaultvalue and prop.defaultvalue != "[]":
        line += f" : [] of {prop.url_to_class_name}"
    elif prop_type == "LO" and not prop.defaultvalue:
        line += f" : [] of Object"
    elif crystal_type == "L" and not prop.defaultvalue:
        line += f" : [] of Object"
    elif crystal_type == "L" and prop.defaultvalue:
        line += f" = {crystal_type}"
    elif len(prop_type) > 1 and prop_type[0] == "L" and prop_type[1] != "O":
        line += f" : {crystal_type}"

    elif prop_type in ["I", "F", "B"] and not prop.defaultvalue:
        line += f" : {crystal_type}"
    elif prop_type in ["I", "F", "B"] and prop.defaultvalue:
        line += f" = {prop.defaultvalue}"
    elif prop_type == "S":
        line += f' = "{prop.defaultvalue}"'
    else:
        line += f": {crystal_type}"

    return line

Classes

class CrystalGenerator
Expand source code
class CrystalGenerator(Plugin):
    def __init__(self):
        super().__init__()

        self._single_template = SINGLE_TEMPLATE
        self._template = TEMPLATE
        self._get_prop_line = get_prop_line
        self._types_map = types_map

Ancestors

Inherited members