From 86c141bdb73b5623c7954ead0de03d1156ed4d6c Mon Sep 17 00:00:00 2001 From: Michael Huster Date: Mon, 8 Jul 2024 11:56:58 +0200 Subject: [PATCH 1/2] fix(model-api-gen): fix IConcept.conceptAlias() always returning null for generated concepts Generated concepts did not implement getConceptProperty(name: String). --- .../metamodel/generator/GeneratedApiTest.kt | 6 ++++++ .../internal/ConceptObjectGenerator.kt | 20 +++++++++++++++++++ .../ConceptWrapperInterfaceGenerator.kt | 3 +-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/model-api-gen-gradle-test/kotlin-generation/src/test/kotlin/org/modelix/metamodel/generator/GeneratedApiTest.kt b/model-api-gen-gradle-test/kotlin-generation/src/test/kotlin/org/modelix/metamodel/generator/GeneratedApiTest.kt index 53784c1fa4..c401f0c599 100644 --- a/model-api-gen-gradle-test/kotlin-generation/src/test/kotlin/org/modelix/metamodel/generator/GeneratedApiTest.kt +++ b/model-api-gen-gradle-test/kotlin-generation/src/test/kotlin/org/modelix/metamodel/generator/GeneratedApiTest.kt @@ -16,6 +16,7 @@ import org.modelix.metamodel.typed import org.modelix.metamodel.untyped import org.modelix.model.ModelFacade import org.modelix.model.api.INode +import org.modelix.model.api.conceptAlias import org.modelix.model.api.getRootNode import org.modelix.model.data.ConceptData import org.modelix.model.data.ModelData @@ -84,6 +85,11 @@ class GeneratedApiTest { assertEquals("class", alias) } + @Test + fun `alias can be retrieved via conceptAlias`() { + assertEquals(C_ClassConcept.alias, C_ClassConcept.untyped().conceptAlias()) + } + private fun KAnnotatedElement.hasDeprecationWithMessage() = findAnnotation()?.message?.isNotEmpty() ?: false diff --git a/model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/internal/ConceptObjectGenerator.kt b/model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/internal/ConceptObjectGenerator.kt index 5d840220f9..af3ebfc08a 100644 --- a/model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/internal/ConceptObjectGenerator.kt +++ b/model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/internal/ConceptObjectGenerator.kt @@ -67,6 +67,7 @@ internal class ConceptObjectGenerator( addSuperclassConstructorParameter(concept.abstract.toString()) addInstanceClassGetter() addTypedFun() + addConceptPropertiesGetter() addLanguageProperty() addWrapFun() if (concept.uid != null) { @@ -99,6 +100,25 @@ internal class ConceptObjectGenerator( addProperty(propertySpec) } + private fun TypeSpec.Builder.addConceptPropertiesGetter() { + if (concept.metaProperties.isEmpty()) return + + val getConceptPropertyFun = FunSpec.builder(GeneratedConcept<*, *>::getConceptProperty.name).runBuild { + val paramName = GeneratedConcept<*, *>::getConceptProperty.parameters.first().name ?: "name" + returns(String::class.asTypeName().copy(nullable = true)) + addParameter(paramName, String::class) + addModifiers(KModifier.OVERRIDE) + beginControlFlow("return when (%N)", paramName) + for ((key, _) in concept.metaProperties) { + addStatement("""%S -> %T.%N""", key, concept.conceptWrapperInterfaceClass(), key) + } + addStatement("else -> null") + endControlFlow() + } + + addFunction(getConceptPropertyFun) + } + private fun TypeSpec.Builder.addConceptObjectChildLink(childLink: ProcessedChildLink) { val methodName = if (childLink.multiple) { "newChildListLink" diff --git a/model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/internal/ConceptWrapperInterfaceGenerator.kt b/model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/internal/ConceptWrapperInterfaceGenerator.kt index 5e4f0fc5e2..925185727a 100644 --- a/model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/internal/ConceptWrapperInterfaceGenerator.kt +++ b/model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/internal/ConceptWrapperInterfaceGenerator.kt @@ -89,8 +89,7 @@ internal class ConceptWrapperInterfaceGenerator( private fun TypeSpec.Builder.addConceptMetaPropertiesIfNecessary() { if (conceptPropertiesInterfaceName == null) return - // TODO use IConcept.getConceptProperty(name: String) - concept.metaProperties.forEach { (key, value) -> + for ((key, value) in concept.metaProperties) { val propertySpec = PropertySpec.builder(key, String::class.asTypeName()).runBuild { addModifiers(KModifier.OVERRIDE) initializer("%S", value) From b3f1c86d66f0700402f58737e0ad6225119324ee Mon Sep 17 00:00:00 2001 From: Michael Huster Date: Mon, 8 Jul 2024 13:36:14 +0200 Subject: [PATCH 2/2] chore(modelql): increase timeout for HtmlBuilderTest In CI we sometimes hit this timeout leading to failed builds. --- .../kotlin/org/modelix/modelql/client/HtmlBuilderTest.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modelql-client/src/jvmTest/kotlin/org/modelix/modelql/client/HtmlBuilderTest.kt b/modelql-client/src/jvmTest/kotlin/org/modelix/modelql/client/HtmlBuilderTest.kt index adcd0427c5..18c8699bac 100644 --- a/modelql-client/src/jvmTest/kotlin/org/modelix/modelql/client/HtmlBuilderTest.kt +++ b/modelql-client/src/jvmTest/kotlin/org/modelix/modelql/client/HtmlBuilderTest.kt @@ -47,10 +47,12 @@ import org.modelix.modelql.untyped.property import kotlin.test.Test import kotlin.test.assertEquals import kotlin.time.Duration.Companion.seconds +import kotlin.time.ExperimentalTime class HtmlBuilderTest { + @OptIn(ExperimentalTime::class) private fun runTest(block: suspend (HttpClient) -> Unit) = testApplication { - withTimeout(10.seconds) { + withTimeout(20.seconds) { application { val tree = CLTree(ObjectStoreCache(MapBaseStore())) val branch = PBranch(tree, IdGenerator.getInstance(1))