This commit is contained in:
2023-06-01 01:56:14 +02:00
parent aa1435bb4e
commit ad657a6136
8 changed files with 41 additions and 33 deletions

9
src/.editorconfig Normal file
View File

@@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
tab_width = 4

View File

@@ -1,8 +1,6 @@
package fr.postgresjson.definition
import fr.postgresjson.definition.Parameter.Direction.IN
import fr.postgresjson.definition.parse.ScriptPart
import fr.postgresjson.definition.parse.trimSpace
import java.nio.file.Path
class Function(
@@ -11,7 +9,7 @@ class Function(
val returns: Returns,
override val script: String,
override val source: Path? = null,
): Resource, ParametersInterface {
) : Resource, ParametersInterface {
// private fun <T> NextScript<T>.changeValue(block: (T) -> T): NextScript<T> {
// return NextScript(block(value), restOfScript)

View File

@@ -29,8 +29,8 @@ class Parameter(
override val type: ParameterType,
val direction: Direction = Direction.IN,
val default: String? = null,
): ParameterSimpleI {
constructor(name: String?, type: ParameterType, direction: String = "IN", default: String? = null): this(
) : ParameterSimpleI {
constructor(name: String?, type: ParameterType, direction: String = "IN", default: String? = null) : this(
name = name,
type = type,
direction = direction.let { Direction.valueOf(direction.uppercase(Locale.getDefault())) },

View File

@@ -7,7 +7,7 @@ sealed class Returns(
class Primitive(
definition: String,
isSetOf: Boolean,
): Returns(definition, isSetOf) {
) : Returns(definition, isSetOf) {
val name = definition
.trim('"')
}
@@ -15,7 +15,7 @@ sealed class Returns(
class PrimitiveList(
definition: String,
isSetOf: Boolean,
): Returns(definition, isSetOf) {
) : Returns(definition, isSetOf) {
val name = definition
.drop(2)
.trim('"')
@@ -25,16 +25,16 @@ sealed class Returns(
definition: String,
isSetOf: Boolean,
val parameters: List<ParameterTable>,
): Returns(definition, isSetOf) {
) : Returns(definition, isSetOf) {
class ParameterTable(
override val name: String,
override val type: ParameterType,
): ParameterSimpleI
) : ParameterSimpleI
}
class Any(
isSetOf: Boolean,
): Returns("any", isSetOf)
) : Returns("any", isSetOf)
class Void: Returns("void", false)
}
class Void : Returns("void", false)
}

View File

@@ -2,7 +2,6 @@ package fr.postgresjson.definition.parse
import fr.postgresjson.definition.Function
import fr.postgresjson.definition.Parameter
import fr.postgresjson.definition.Returns.Void
import fr.postgresjson.definition.Parameter.Direction
import fr.postgresjson.definition.Parameter.Direction.IN
import fr.postgresjson.definition.Parameter.Direction.INOUT
@@ -10,6 +9,7 @@ import fr.postgresjson.definition.Parameter.Direction.OUT
import fr.postgresjson.definition.ParameterType
import fr.postgresjson.definition.Resource.ParseException
import fr.postgresjson.definition.Returns
import fr.postgresjson.definition.Returns.Void
import java.nio.file.Path
import kotlin.text.RegexOption.IGNORE_CASE
@@ -26,7 +26,6 @@ internal fun parseFunction(script: String, source: Path? = null): Function {
return Function(name, parameters, returns, script, source)
}
@Throws(FunctionNameMalformed::class)
internal fun ScriptPart.getFunctionName(): NextScript<String> {
try {
@@ -35,7 +34,7 @@ internal fun ScriptPart.getFunctionName(): NextScript<String> {
throw FunctionNameMalformed(this, e)
}
}
internal class FunctionNameMalformed(val script: ScriptPart, cause: Throwable? = null):
internal class FunctionNameMalformed(val script: ScriptPart, cause: Throwable? = null) :
ParseException("Function name is malformed", cause)
@Throws(FunctionNotFound::class)
@@ -54,7 +53,7 @@ internal fun ScriptPart.getFunctionOrProcedure(): NextScript<String> {
)
}
internal class FunctionNotFound(val script: ScriptPart):
internal class FunctionNotFound(val script: ScriptPart) :
ParseException("Function not found in script")
internal fun ScriptPart.getParameters(): NextScript<List<Parameter>> {
@@ -96,7 +95,7 @@ private fun ScriptPart.getParameterName(): NextScript<String> {
throw ParameterNameMalformed(this, e)
}
}
private class ParameterNameMalformed(val script: ScriptPart, cause: Throwable):
private class ParameterNameMalformed(val script: ScriptPart, cause: Throwable) :
ParseException("Parameter name is malformed", cause)
@Throws(ParameterTypeMalformed::class)
@@ -125,11 +124,12 @@ private fun ScriptPart.getParameterType(): NextScript<ParameterType> {
name = name.value.trim(),
precision = precision.value,
scale = scale.value
), fullType.nextScriptPart.restOfScript
),
fullType.nextScriptPart.restOfScript
)
}
internal class ParameterTypeMalformed(val script: ScriptPart, cause: Throwable):
internal class ParameterTypeMalformed(val script: ScriptPart, cause: Throwable) :
ParseException("Parameter type is malformed", cause)
@Throws(ParameterDefaultMalformed::class)
@@ -146,7 +146,7 @@ private fun ScriptPart.getParameterDefault(): NextScript<String?> {
}
}
private class ParameterDefaultMalformed(val script: ScriptPart):
private class ParameterDefaultMalformed(val script: ScriptPart) :
ParseException("Parameter default is malformed")
/**
@@ -156,5 +156,5 @@ internal fun ScriptPart.getReturns(): NextScript<Returns> {
return NextScript(Void(), "")
}
class ParseError(message: String? = null, cause: Throwable? = null):
ParseException(message ?: "Parsing fail", cause)
class ParseError(message: String? = null, cause: Throwable? = null) :
ParseException(message ?: "Parsing fail", cause)

View File

@@ -128,7 +128,6 @@ internal inline fun ScriptPart.change(block: String.() -> String): ScriptPart {
return ScriptPart(restOfScript.run(block))
}
internal fun ScriptPart.getNextInteger(): NextScript<Int?> {
val trimmed = restOfScript.trimStart { !it.isDigit() }
val digits = trimmed.takeWhile { it.isDigit() }
@@ -136,8 +135,6 @@ internal fun ScriptPart.getNextInteger(): NextScript<Int?> {
return NextScript(digits.toIntOrNull(), restOfScript).trimSpace()
}
internal data class Status(
var doubleQuoted: Boolean = false, // "
var simpleQuoted: Boolean = false, // '
@@ -161,4 +158,4 @@ internal data class Context(
}
val nextChar: Char? get() = script.substring(index + 1).getOrNull(0)
}
}

View File

@@ -1,11 +1,11 @@
package fr.postgresjson.functionGenerator
import fr.postgresjson.definition.Function
import fr.postgresjson.definition.Returns
import fr.postgresjson.definition.Parameter
import fr.postgresjson.definition.Parameter.Direction.IN
import fr.postgresjson.definition.Parameter.Direction.INOUT
import fr.postgresjson.definition.Parameter.Direction.OUT
import fr.postgresjson.definition.Returns
import fr.postgresjson.utils.searchSqlFiles
import fr.postgresjson.utils.toCamelCase
import org.slf4j.Logger

View File

@@ -9,26 +9,30 @@ import fr.postgresjson.serializer.toTypeReference
import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.nulls.shouldBeNull
import io.kotest.matchers.nulls.shouldNotBeNull
import org.amshove.kluent.`should be equal to`
import org.junit.jupiter.api.assertThrows
import java.util.UUID
import kotlin.reflect.full.hasAnnotation
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertNotNull
import kotlin.test.assertTrue
import org.amshove.kluent.`should be equal to`
import org.junit.jupiter.api.assertThrows
class ConnectionTest : StringSpec({
class ConnectionTest: StringSpec({
val connection = TestConnection()
@SqlSerializable
class ObjTest(val name: String, val id: UUID = UUID.fromString("2c0243ed-ff4d-4b9f-a52b-e38c71b0ed00"))
@SqlSerializable
class ObjTest2(val id: UUID, val title: String, var test: ObjTest?)
@SqlSerializable
class ObjTest3(val id: UUID, val first: String, var second: String, var third: Int)
@SqlSerializable
class ParameterObject(var third: String)
@SqlSerializable
class ObjTestWithParameterObject(val id: UUID, var first: ParameterObject, var second: ParameterObject)
class ObjTest4
@@ -112,7 +116,7 @@ class ConnectionTest : StringSpec({
"test call request without args" {
val result: ObjTest? = connection.execute(
"select json_build_object('id', '2c0243ed-ff4d-4b9f-a52b-e38c71b0ed00', 'name', 'myName')",
object : TypeReference<ObjTest>() {}
object: TypeReference<ObjTest>() {}
) {
assertEquals("myName", this.deserialize<ObjTest>()?.name)
}
@@ -121,7 +125,7 @@ class ConnectionTest : StringSpec({
}
"test call request return null" {
val result: ObjTest? = connection.execute("select null;", object : TypeReference<ObjTest>() {})
val result: ObjTest? = connection.execute("select null;", object: TypeReference<ObjTest>() {})
result.shouldBeNull()
}
@@ -137,7 +141,7 @@ class ConnectionTest : StringSpec({
)
assertThrows<DataNotFoundException> {
execute("select * from test where false;", object : TypeReference<ObjTest>() {})
execute("select * from test where false;", object: TypeReference<ObjTest>() {})
}
}