diff --git a/README.md b/README.md index 6b7bd79..2b8e0f5 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ This diagram shows all the features and how to model in UML ## Metamodel This diagram shows the internal classes which are passed to the templates during generation. -![Metamodel](https://github.com/Semprini/pyMDG/raw/master/sample_recipes/images/EAID_B080F856_9EFB_46f2_8D69_1C79956D714A.png) +![Metamodel](https://raw.githubusercontent.com/Semprini/pyMDG/master/docs/_static/image/metamodel.png) ## Build the docs Install sphinx diff --git a/docs/_static/image/metamodel.png b/docs/_static/image/metamodel.png new file mode 100644 index 0000000..eb6f253 Binary files /dev/null and b/docs/_static/image/metamodel.png differ diff --git a/docs/docs.qea b/docs/docs.qea index 3d05fd3..c3b7e9f 100644 Binary files a/docs/docs.qea and b/docs/docs.qea differ diff --git a/mdg/parse/sparx_db.py b/mdg/parse/sparx_db.py index 63f81f2..5646797 100644 --- a/mdg/parse/sparx_db.py +++ b/mdg/parse/sparx_db.py @@ -327,13 +327,10 @@ def association_parse(session, tconnector: TConnector, package: UMLPackage, sour # TODO: Extract list of stereotypes if tconnector.stereotype is not None: association.stereotypes = [tconnector.stereotype,] - print(association.stereotypes) if tconnector.sourcestereotype is not None: association.source_stereotypes = [tconnector.sourcestereotype,] - print(association.source_stereotypes) if tconnector.deststereotype is not None: association.destination_stereotypes = [tconnector.deststereotype,] - print(association.destination_stereotypes) logging.debug(f"Created {association.cardinality.name} {association.association_type.name} from {association.source_name} to {association.destination_name}") return association diff --git a/mdg/templates/Django/app/models.py.jinja b/mdg/templates/Django/app/models.py.jinja index 6a0771b..ce4c441 100644 --- a/mdg/templates/Django/app/models.py.jinja +++ b/mdg/templates/Django/app/models.py.jinja @@ -10,7 +10,7 @@ from {{ attr.classification.package.name | case_package }}.models import ENUM_{{ {% endfor %}{% for cls in package.classes %}{% if cls.is_abstract %}class {{ cls.name | case_class }}( models.Model ):{% for attr in cls.attributes %}{% if attr.classification %} {{ attr.name | snakecase }} = models.CharField( max_length=100, choices=ENUM_{{ attr.classification.name}}.choices, blank=True, null=True ){% else %} - {{ attr.name | snakecase }} = models.{% if "auto" in attr.stereotypes %}AutoField{% else %}{{ attr.dest_type }}{% endif %}( {% if attr.is_id %}primary_key=True, {% else %}blank=True, null=True, {% endif %}{% if attr.length %}max_length={{ attr.length }}{% endif %} ) + {{ attr.name | snakecase }} = models.{% if "Auto" in attr.stereotypes %}AutoField{% else %}{{ attr.dest_type }}{% endif %}( {% if attr.is_id %}primary_key=True, {% else %}blank=True, null=True, {% endif %}{% if attr.length %}max_length={{ attr.length }}{% endif %} ) {% endif %}{% endfor %} class Meta: abstract = True @@ -18,7 +18,7 @@ from {{ attr.classification.package.name | case_package }}.models import ENUM_{{ {% for cls in package.classes %}{% if not cls.is_abstract and cls.specialized_by | length > 0 %}class {{ cls.name | case_class }}( {% if cls.generalization %}{{ cls.generalization.name | case_class }}{% else %}models.Model{% endif %} ):{% for attr in cls.attributes %}{% if attr.classification %} {{ attr.name | snakecase }} = models.CharField( max_length=100, choices=ENUM_{{ attr.classification.name | case_class }}.choices, blank=True, null=True ){% else %} - {{ attr.name | snakecase }} = models.{% if "auto" in attr.stereotypes %}AutoField{% else %}{{ attr.dest_type }}{% endif %}( {% if attr.is_id %}primary_key=True, {% else %}blank=True, null=True, {% endif %}{% if attr.dest_type == "DecimalField" %}max_digits=10, decimal_places=2, {% endif %}{% if attr.length %}max_length={{ attr.length }}{% endif %}{% if attr.validations != [] %}validators=[validate_even]{% endif %} ) + {{ attr.name | snakecase }} = models.{% if "Auto" in attr.stereotypes %}AutoField{% else %}{{ attr.dest_type }}{% endif %}( {% if attr.is_id %}primary_key=True, {% else %}blank=True, null=True, {% endif %}{% if attr.dest_type == "DecimalField" %}max_digits=10, decimal_places=2, {% endif %}{% if attr.length %}max_length={{ attr.length }}{% endif %}{% if attr.validations != [] %}validators=[validate_even]{% endif %} ) {% endif %}{% endfor %}{% for rel in cls.associations_from %}{% if rel.association_type.name == "ASSOCIATION" %}{% if rel.cardinality.name == "ONE_TO_ONE" %} {{ rel.destination_name | snakecase }} = models.OneToOneField( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', on_delete=models.CASCADE, blank=True, null=True ){% elif rel.cardinality.name == "MANY_TO_ONE" %} {{ rel.destination_name | snakecase }} = models.ForeignKey( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE, blank=True, null=True ){% elif rel.cardinality.name == "MANY_TO_MANY" %} @@ -27,12 +27,18 @@ from {{ attr.classification.package.name | case_package }}.models import ENUM_{{ {{ rel.destination_name | snakecase }} = models.ForeignKey( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE ){% endif %} {% endif %}{% endfor %}{% for rel in cls.associations_to %}{% if rel.association_type.name != "COMPOSITION" %}{% if rel.cardinality.name == "ONE_TO_MANY" %} {{ rel.source_name | snakecase }} = models.ForeignKey( '{{ rel.source.package.name | case_package }}.{{ rel.source.name | case_class }}', on_delete=models.CASCADE, related_name='{{ rel.destination_name | snakecase }}', blank=True, null=True ){% endif %} -{% endif %}{% endfor %}{% endif %} +{% endif %}{% endfor %}{% set uniques = [] %}{% for attr in cls.attributes %}{% if "UniqueKey" in attr.stereotypes %}{{ uniques.append( attr.name ) | default("", True) }}{% endif %}{% endfor %}{% for rel in cls.associations_from %}{% if "UniqueKey" in rel.destination_stereotypes %}{{ uniques.append( rel.destination_name ) | default("", True) }}{% endif %}{% endfor %}{% if uniques != [] %} -{% endfor %} + class Meta(): + constraints = [ + models.UniqueConstraint(fields=[{% for unique in uniques%}'{{ unique | snakecase }}',{% endfor %}], name='unique {% for unique in uniques%}{{ unique | snakecase }}__{% endfor %}') + ] +{% endif %} + +{% endif %}{% endfor %} {% for cls in package.classes %}{% if not cls.is_abstract and cls.specialized_by | length == 0 %}class {{ cls.name | case_class }}( {% if cls.generalization %}{{ cls.generalization.name | case_class }}{% else %}models.Model{% endif %} ):{% for attr in cls.attributes %}{% if attr.classification %} {{ attr.name | snakecase }} = models.CharField( max_length=100, choices=ENUM_{{ attr.classification.name | case_class }}.choices, blank=True, null=True ){% else %} - {{ attr.name | snakecase }} = models.{% if "auto" in attr.stereotypes %}AutoField{% else %}{{ attr.dest_type }}{% endif %}( {% if attr.is_id %}primary_key=True, {% else %}blank=True, null=True, {% endif %}{% if attr.dest_type == "DecimalField" %}max_digits=10, decimal_places=2, {% endif %}{% if attr.length %}max_length={{ attr.length }}{% endif %}{% if attr.validations != [] %}validators=[validate_even]{% endif %} ) + {{ attr.name | snakecase }} = models.{% if "Auto" in attr.stereotypes %}AutoField{% else %}{{ attr.dest_type }}{% endif %}( {% if attr.is_id %}primary_key=True, {% else %}blank=True, null=True, {% endif %}{% if attr.dest_type == "DecimalField" %}max_digits=10, decimal_places=2, {% endif %}{% if attr.length %}max_length={{ attr.length }}{% endif %}{% if attr.validations != [] %}validators=[validate_even]{% endif %} ) {% endif %}{% endfor %}{% for rel in cls.associations_from %}{% if rel.association_type.name == "ASSOCIATION" %}{% if rel.cardinality.name == "ONE_TO_ONE" %} {{ rel.destination_name | snakecase }} = models.OneToOneField( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', on_delete=models.CASCADE, blank=True, null=True ){% elif rel.cardinality.name == "MANY_TO_ONE" %} {{ rel.destination_name | snakecase }} = models.ForeignKey( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE, blank=True, null=True ){% elif rel.cardinality.name == "MANY_TO_MANY" %} @@ -41,6 +47,12 @@ from {{ attr.classification.package.name | case_package }}.models import ENUM_{{ {{ rel.destination_name | snakecase }} = models.ForeignKey( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE ){% endif %} {% endif %}{% endfor %}{% for rel in cls.associations_to %}{% if rel.association_type.name != "COMPOSITION" %}{% if rel.cardinality.name == "ONE_TO_MANY" %} {{ rel.source_name | snakecase }} = models.ForeignKey( '{{ rel.source.package.name | case_package }}.{{ rel.source.name | case_class }}', on_delete=models.CASCADE, related_name='{{ rel.destination_name | snakecase }}', blank=True, null=True ){% endif %} -{% endif %}{% endfor %}{% endif %} +{% endif %}{% endfor %}{% set uniques = [] %}{% for attr in cls.attributes %}{% if "UniqueKey" in attr.stereotypes %}{{ uniques.append( attr.name ) | default("", True) }}{% endif %}{% endfor %}{% for rel in cls.associations_from %}{% if "UniqueKey" in rel.destination_stereotypes %}{{ uniques.append( rel.destination_name ) | default("", True) }}{% endif %}{% endfor %}{% if uniques != [] %} -{% endfor %} + class Meta(): + constraints = [ + models.UniqueConstraint(fields=[{% for unique in uniques%}'{{ unique | snakecase }}',{% endfor %}], name='unique {% for unique in uniques%}{{ unique | snakecase }}__{% endfor %}') + ] +{% endif %} + +{% endif %}{% endfor %} diff --git a/mdg/templates/Schema/avro.avsc.jinja b/mdg/templates/Schema/avro.avsc.jinja index 2ecedbb..8933c5f 100644 --- a/mdg/templates/Schema/avro.avsc.jinja +++ b/mdg/templates/Schema/avro.avsc.jinja @@ -1,149 +1,55 @@ -[ -{% for assoc in cls.associations_to %}{% if assoc.association_type.name in ['AGGREGATION', 'COMPOSITION', 'ASSOCIATION'] and "aggregate root" not in assoc.source.stereotypes %} - { - "namespace": "{{ assoc.source.package.path[1:-1] | replace("/",".") | snakecase }}", - "type": "record", - "name": "{{ assoc.source.name | case_class }}", - "fields": [{% if assoc.source.generalization %}{% for attr in assoc.source.generalization.attributes %} - { - "name": "{{ attr.name | case_attribute }}", - {% if attr.dest_type == "date" %}"type": ["string", "null", {"type": "int", "logicalType": "date"}], "default": "__" - {% elif attr.dest_type == "datetime" %}"type": ["string", "null", {"type" : "long", "logicalType": "timestamp-millis"}], "default": "__"{% elif attr.classification %}"type": - { - "type": "enum", - "name": "{{ attr.classification.name | case_class }}", - "symbols": [{% for enum in attr.classification.values[:-1] %} - "{{ enum | uppercase | replace(" ","_")}}",{% endfor %} - "{{ attr.classification.values[-1] | uppercase | replace(" ","_") }}" - ] - }{% else %}"type": {% if not attr.is_id %}[ "string", "null"{% if attr.dest_type != 'string' %}, "{{attr.dest_type}}"{% endif %} ], "default": "__"{% else %}"{{attr.dest_type}}"{% endif %}{% endif %} - },{% endfor %}{% endif %}{% for attr in assoc.source.attributes[:-1] %} - { - "name": "{{ attr.name | case_attribute }}", - {% if attr.dest_type == "date" %}"type": ["string", "null", {"type": "int", "logicalType": "date"}], "default": "__" - {% elif attr.dest_type == "datetime" %}"type": ["string", "null", {"type" : "long", "logicalType": "timestamp-millis"}], "default": "__"{% elif attr.classification %}"type": +{% macro do_enum(current_enum) -%} { "type": "enum", - "name": "{{ attr.classification.name | case_class }}", - "symbols": [{% for enum in attr.classification.values[:-1] %} + "name": "{{ current_enum.name | case_class }}", + "symbols": [{% for enum in current_enum.values[:-1] %} "{{ enum | uppercase | replace(" ","_") | replace("/","_") }}",{% endfor %} - "{{ attr.classification.values[-1] | uppercase | replace(" ","_")}}" + "{{ current_enum.values[-1] | uppercase | replace(" ","_") }}" ] - }{% else %}"type": {% if not attr.is_id %}[ "string", "null"{% if attr.dest_type != 'string' %}, "{{attr.dest_type}}"{% endif %} ], "default": "__"{% else %}"{{attr.dest_type}}"{% endif %}{% endif %} - },{% endfor %} + } +{% endmacro -%} + +{% macro do_attribute(current_attr) -%} { - "name": "{{ assoc.source.attributes[-1].name | case_attribute }}", - {% if assoc.source.attributes[-1].dest_type == "date" %}"type": ["string", "null", {"type": "int", "logicalType": "date"}], "default": "__" - {% elif assoc.source.attributes[-1].dest_type == "datetime" %}"type": ["string", "null", {"type" : "long", "logicalType": "timestamp-millis"}], "default": "__"{% elif assoc.source.attributes[-1].classification %}"type": - { - "type": "enum", - "name": "{{ assoc.source.attributes[-1].classification.name | case_class }}", - "symbols": [{% for enum in assoc.source.attributes[-1].classification.values[:-1] %} - "{{ enum | uppercase | replace(" ","_") | replace("/","_") }}",{% endfor %} - "{{ assoc.source.attributes[-1].classification.values[-1] | uppercase | replace(" ","_")}}" - ] - }{% else %}"type": {% if not assoc.source.attributes[-1].is_id %}[ "string", "null"{% if assoc.source.attributes[-1].dest_type != 'string' %}, "{{assoc.source.attributes[-1].dest_type}}"{% endif %} ], "default": "__"{% else %}"{{assoc.source.attributes[-1].dest_type}}"{% endif %}{% endif %} - }{% for assoc in assoc.source.associations_from %}{% if assoc.association_type.name not in ['AGGREGATION', 'COMPOSITION'] %} - ,{ - "name": "{{ assoc.destination_name | case_attribute }}_id", - "type": ["string", "null"{% if assoc.destination_multiplicity[1] == '*' %}, - { - "type": "array", - "items": "string" - }{% else %}], "default": "__"{% endif %} - }{% endif %}{% endfor %} - ] - },{% endif %}{% endfor %} + "name": "{{ current_attr.name | case_attribute }}", + {% if current_attr.dest_type == "date" %}"type": ["string", "null", {"type": "int", "logicalType": "date"}], "default": "__" + {% elif current_attr.dest_type == "datetime" %}"type": ["string", "null", {"type" : "long", "logicalType": "timestamp-millis"}], "default": "__"{% elif current_attr.classification %}"type": + {{ do_enum(current_attr.classification) }} + {% else %}"type": {% if not current_attr.is_id %}[ "string", "null"{% if current_attr.dest_type != 'string' %}, "{{current_attr.dest_type}}"{% endif %} ], "default": "__"{% else %}"{{current_attr.dest_type}}"{% endif %}{% endif %} + } +{% endmacro -%} + +{% macro do_class(current_class) -%} { - "namespace": "{{ cls.package.path[1:-1] | replace("/",".") | snakecase }}", + "namespace": "{{ current_class.package.path[1:-1] | replace("/",".") | snakecase }}", "type": "record", - "name": "{{ cls.name | case_class }}", - "fields": [{% if cls.generalization %}{% for attr in cls.generalization.attributes %} - { - "name": "{{ attr.name | case_attribute }}", - {% if attr.dest_type == "date" %}"type": ["string", "null", {"type": "int", "logicalType": "date"}], "default": "__" - {% elif attr.dest_type == "datetime" %}"type": ["string", "null", {"type" : "long", "logicalType": "timestamp-millis"}], "default": "__"{% elif attr.classification %}"type": - { - "type": "enum", - "name": "{{ attr.classification.name | case_class }}", - "symbols": [{% for enum in attr.classification.values[:-1] %} - "{{ enum | uppercase | replace(" ","_") | replace("/","_") }}",{% endfor %} - "{{ attr.classification.values[-1] | uppercase | replace(" ","_") }}" - ] - }{% else %}"type": {% if not attr.is_id %}[ "string", "null"{% if attr.dest_type != 'string' %}, "{{attr.dest_type}}"{% endif %} ], "default": "__"{% else %}"{{attr.dest_type}}"{% endif %}{% endif %} - },{% endfor %}{% endif %}{% for attr in cls.attributes[:-1] %} - { - "name": "{{ attr.name | case_attribute }}", - {% if attr.dest_type == "date" %}"type": ["string", "null", {"type": "int", "logicalType": "date"}], "default": "__" - {% elif attr.dest_type == "datetime" %}"type": ["string", "null", {"type" : "long", "logicalType": "timestamp-millis"}], "default": "__"{% elif attr.classification %}"type": - { - "type": "enum", - "name": "{{ attr.classification.name | case_class }}", - "symbols": [{% for enum in attr.classification.values[:-1] %} - "{{ enum | uppercase | replace(" ","_") | replace("/","_")}}",{% endfor %} - "{{ attr.classification.values[-1] | uppercase | replace(" ","_")}}" - ] - }{% else %}"type": {% if not attr.is_id %}[ "string", "null"{% if attr.dest_type != 'string' %}, "{{attr.dest_type}}"{% endif %} ], "default": "__"{% else %}"{{attr.dest_type}}"{% endif %}{% endif %} - },{% endfor %} - { - "name": "{{ cls.attributes[-1].name | case_attribute }}", - {% if cls.attributes[-1].dest_type == "date" %}"type": ["string", "null", {"type": "int", "logicalType": "date"}], "default": "__" - {% elif cls.attributes[-1].dest_type == "datetime" %}"type": ["string", "null", {"type" : "long", "logicalType": "timestamp-millis"}], "default": "__"{% elif cls.attributes[-1].classification %}"type": - { - "type": "enum", - "name": "{{ cls.attributes[-1].classification.name | case_class }}", - "symbols": [{% for enum in cls.attributes[-1].classification.values[:-1] %} - "{{ enum | uppercase | replace(" ","_") | replace("/","_") }}",{% endfor %} - "{{ cls.attributes[-1].classification.values[-1] | uppercase | replace(" ","_")}}" - ] - }{% else %}"type": {% if not cls.attributes[-1].is_id %}[ "string", "null"{% if cls.attributes[-1].dest_type != 'string' %}, "{{cls.attributes[-1].dest_type}}"{% endif %} ], "default": "__"{% else %}"{{cls.attributes[-1].dest_type}}"{% endif %}{% endif %} - }{% for assoc in cls.associations_from %} - ,{ - "name": "{{ assoc.destination_name | case_attribute }}_id", - "type": [{% if assoc.destination_multiplicity[1] == '*' %}{ "type": "array", "items": "string" }{% else %}"string"{% endif %}, "null"], "default": "__" - }{% endfor %}{% for assoc in cls.associations_to %}{% if assoc.association_type.name in ['AGGREGATION', 'COMPOSITION'] %} + "name": "{{ current_class.name | case_class }}", + "fields": [{% if current_class.generalization %}{% for attr in current_class.generalization.attributes %} + {{ do_attribute(attr) }},{% endfor %}{% endif %}{% for attr in current_class.attributes[:-1] %} + {{ do_attribute(attr) }},{% endfor %} + {{ do_attribute(current_class.attributes[-1]) }}{% for assoc in current_class.associations_from %} ,{ + "name": "{{ assoc.destination_name | case_attribute }}", + "type": [{% if assoc.destination_multiplicity[1] == '*' %}{ "type": "array", "items": "{{ assoc.destination.name | case_class }}" }{% else %}"string", "null", "{{ assoc.destination.name | case_class }}"{% endif %}], "default": "__" + }{% endfor %}{% for assoc in current_class.associations_to %}{% if assoc.association_type.name in ['AGGREGATION', 'COMPOSITION'] %} + ,{ "name": "{{ assoc.source.name | case_attribute }}", "type": ["string", "null", {% if assoc.source_multiplicity[1] == '*' %} { "type": "array", "items": "{{ assoc.source.name | case_class }}" }{% else %}"{{ assoc.source.name | case_class }}"{% endif %}], "default": "__", - "namespace": "{{ cls.package.path[1:-1] | replace("/",".") | snakecase }}" + "namespace": "{{ current_class.package.path[1:-1] | replace("/",".") | snakecase }}" }{% endif %}{% endfor %} ] - }{% for special in cls.specialized_by %}{% if "aggregate root" not in special.stereotypes %}, - { - "namespace": "{{ special.package.path[1:-1] | replace("/",".") | snakecase }}", - "type": "record", - "name": "{{ special.name | case_class }}", - "fields": [ - {% for attr in special.attributes[:-1] %}{ - "name": "{{ attr.name | case_attribute }}", - {% if attr.dest_type == "date" %}"type": ["string", "null", {"type": "int", "logicalType": "date"}], "default": "__" - {% elif attr.dest_type == "datetime" %}"type": ["string", "null", {"type" : "long", "logicalType": "timestamp-millis"}], "default": "__"{% elif attr.classification %}"type": - { - "type": "enum", - "name": "{{ attr.classification.name | case_class }}", - "symbols": [{% for enum in attr.classification.values[:-1] %} - "{{ enum | uppercase | replace(" ","_") | replace("/","_")}}",{% endfor %} - "{{ attr.classification.values[-1] | uppercase | replace(" ","_")}}" - ] - }{% else %}"type": {% if not attr.is_id %}[ "string", "null"{% if attr.dest_type != 'string' %}, "{{attr.dest_type}}"{% endif %} ], "default": "__"{% else %}"{{attr.dest_type}}"{% endif %}{% endif %} - },{% endfor %} - { - "name": "{{ special.attributes[-1].name | case_attribute }}", - {% if special.attributes[-1].dest_type == "date" %}"type": ["string", "null", {"type": "int", "logicalType": "date"}], "default": "__" - {% elif special.attributes[-1].dest_type == "datetime" %}"type": ["string", "null", {"type" : "long", "logicalType": "timestamp-millis"}], "default": "__"{% elif cls.attributes[-1].classification %}"type": - { - "type": "enum", - "name": "{{ special.attributes[-1].classification.name | case_class }}", - "symbols": [{% for enum in special.attributes[-1].classification.values[:-1] %} - "{{ enum | uppercase | replace(" ","_") | replace("/","_") }}",{% endfor %} - "{{ special.attributes[-1].classification.values[-1] | uppercase | replace(" ","_")}}" - ] - }{% else %}"type": {% if not special.attributes[-1].is_id %}[ "string", "null"{% if special.attributes[-1].dest_type != 'string' %}, "{{special.attributes[-1].dest_type}}"{% endif %} ], "default": "__"{% else %}"{{special.attributes[-1].dest_type}}"{% endif %}{% endif %} - } - ] - }{% endif %}{% endfor %} + } +{% endmacro -%} + +[ +{% for assoc in cls.associations_to %}{% if assoc.association_type.name in ['AGGREGATION', 'COMPOSITION', 'ASSOCIATION'] and "aggregate root" not in assoc.source.stereotypes %} + {{ do_class(assoc.source) }} + ,{% endif %}{% endfor %} + {{ do_class(cls) }}{% for special in cls.specialized_by %}{% if "aggregate root" not in special.stereotypes %}, + {{ do_class(special) }} +{% endif %}{% endfor %} ] diff --git a/sample_recipes/sparxdb/config-sparxdb-graphql.yaml b/sample_recipes/sparxdb/config-sparxdb-graphql.yaml index 19f07b6..2838f7f 100644 --- a/sample_recipes/sparxdb/config-sparxdb-graphql.yaml +++ b/sample_recipes/sparxdb/config-sparxdb-graphql.yaml @@ -1,5 +1,6 @@ -root_package: "{ECF156CE-46EA-4f7c-9F9C-4A54FB975BEC}" -model_package: "{AEB30CD7-DECA-4310-BFD6-9225F9251D9A}" +root_package: "{EE550A71-3A5F-473d-A3AF-773E900C74ED}" +model_package: "{D6D3BF36-E897-4a8b-8CA9-62ADAAD696ED}" +test_package: "{C2E30D48-F8AB-4c6f-9FA3-AFE44653D5EB}" source: sqlite:///./sample_recipes/sparxdb/sample.qea parser: sparxdb dest_root: ./build/sample_sparxdb_graphql diff --git a/sample_recipes/sparxdb/sample.qea b/sample_recipes/sparxdb/sample.qea index 49a9a27..c398729 100644 Binary files a/sample_recipes/sparxdb/sample.qea and b/sample_recipes/sparxdb/sample.qea differ