Commit
This commit is contained in:
		
					parent
					
						
							
								7ccf8e041f
							
						
					
				
			
			
				commit
				
					
						086bb9b6e4
					
				
			
		
					 10 changed files with 95 additions and 48 deletions
				
			
		| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
plugins {
 | 
			
		||||
    kotlin("multiplatform") version "2.2.21"
 | 
			
		||||
    kotlin("plugin.serialization") version "2.2.21"
 | 
			
		||||
 | 
			
		||||
    id("maven-publish")
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,14 +25,6 @@ kotlin {
 | 
			
		|||
        else -> throw GradleException("Host OS is not supported in Kotlin/Native.")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    nativeTarget.apply {
 | 
			
		||||
        binaries {
 | 
			
		||||
            executable {
 | 
			
		||||
                entryPoint = "dn42.m724.registry.main"
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    sourceSets {
 | 
			
		||||
        nativeMain.dependencies {
 | 
			
		||||
            implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.8.0")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +0,0 @@
 | 
			
		|||
package dn42.m724.registry
 | 
			
		||||
 | 
			
		||||
import dn42.m724.registry.model.Maintainer
 | 
			
		||||
 | 
			
		||||
class FileSystemRegistryLoader(
 | 
			
		||||
 | 
			
		||||
) : RegistryLoader {
 | 
			
		||||
    override fun getMaintainer(maintainerName: String): Maintainer {
 | 
			
		||||
 | 
			
		||||
        TODO("Not yet implemented")
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,8 +0,0 @@
 | 
			
		|||
package eu.m724.dn42.m724.registry
 | 
			
		||||
 | 
			
		||||
import dn42.m724.registry.FileSystemRegistryLoader
 | 
			
		||||
 | 
			
		||||
fun main() {
 | 
			
		||||
    val loader = FileSystemRegistryLoader()
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +0,0 @@
 | 
			
		|||
package dn42.m724.registry
 | 
			
		||||
 | 
			
		||||
import dn42.m724.registry.model.Maintainer
 | 
			
		||||
 | 
			
		||||
interface RegistryLoader {
 | 
			
		||||
    fun getMaintainer(maintainerName: String): Maintainer
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,20 @@
 | 
			
		|||
package dn42.m724.registry.loader
 | 
			
		||||
 | 
			
		||||
import dn42.m724.registry.serializer.RegistryObjectSerializer
 | 
			
		||||
import kotlinx.io.buffered
 | 
			
		||||
import kotlinx.io.files.Path
 | 
			
		||||
import kotlinx.io.files.SystemFileSystem
 | 
			
		||||
 | 
			
		||||
class FileSystemRegistryLoader(
 | 
			
		||||
    val root: Path
 | 
			
		||||
) : RegistryLoader {
 | 
			
		||||
    override fun getData(path: String): Map<String, List<String>> {
 | 
			
		||||
        check(!path.contains("..")) { "Path may not contain ..s"}
 | 
			
		||||
 | 
			
		||||
        return SystemFileSystem.source(
 | 
			
		||||
            path = Path(root, "data", path)
 | 
			
		||||
        ).buffered().use { source ->
 | 
			
		||||
            RegistryObjectSerializer.readToMap(source)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
package dn42.m724.registry.loader
 | 
			
		||||
 | 
			
		||||
interface RegistryLoader {
 | 
			
		||||
    /**
 | 
			
		||||
     * Fetches and processes data from the specified path.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path The relative path within the registry.
 | 
			
		||||
     * @return A map where each key is associated with a list of corresponding values
 | 
			
		||||
     *         as defined by the data file at the specified path.
 | 
			
		||||
     */
 | 
			
		||||
    fun getData(path: String): Map<String, List<String>>
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Fetches and processes data from the specified path.
 | 
			
		||||
     *
 | 
			
		||||
     * @param path The segments of a relative path within the registry, passed as a variable-length argument.
 | 
			
		||||
     * @return A map where each key is associated with a list of corresponding values
 | 
			
		||||
     *         as defined by the data file at the specified path.
 | 
			
		||||
     */
 | 
			
		||||
    fun getData(vararg path: String): Map<String, List<String>> = getData(path.joinToString("/"))
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,4 +0,0 @@
 | 
			
		|||
package dn42.m724.registry.model
 | 
			
		||||
 | 
			
		||||
class Maintainer {
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,45 @@
 | 
			
		|||
package dn42.m724.registry.loader
 | 
			
		||||
 | 
			
		||||
import dn42.m724.registry.test.getResourcePath
 | 
			
		||||
import dn42.m724.registry.test.shouldContainExactly
 | 
			
		||||
import kotlinx.io.files.FileNotFoundException
 | 
			
		||||
import kotlin.test.BeforeTest
 | 
			
		||||
import kotlin.test.Test
 | 
			
		||||
import kotlin.test.assertFailsWith
 | 
			
		||||
 | 
			
		||||
class FileSystemRegistryLoaderTest {
 | 
			
		||||
    lateinit var loader: FileSystemRegistryLoader
 | 
			
		||||
 | 
			
		||||
    @BeforeTest
 | 
			
		||||
    fun initializeLoader() {
 | 
			
		||||
        loader = FileSystemRegistryLoader(getResourcePath("registry"))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    fun `getData should return a map for successful parse`() {
 | 
			
		||||
        val map = loader.getData("mntner", "EXAMPLE-MNT")
 | 
			
		||||
 | 
			
		||||
        map shouldContainExactly mapOf(
 | 
			
		||||
            "mntner" to listOf("EXAMPLE-MNT"),
 | 
			
		||||
            "mnt-by" to listOf("EXAMPLE-MNT"),
 | 
			
		||||
            "auth" to listOf(
 | 
			
		||||
                "pgp-fingerprint 2DE81640E41DD84A9ED9B8F8FD4D7C6652E72E7B",
 | 
			
		||||
                "pgp-fingerprint 139F1460BC66A19A2F880D8D47BA020D8EBCC05E"
 | 
			
		||||
            ),
 | 
			
		||||
            "remarks" to listOf(
 | 
			
		||||
                "This has spaces too yay!",
 | 
			
		||||
                "As well as emojis \uD83D\uDE18!",
 | 
			
		||||
                "Also: commas",
 | 
			
		||||
                "" // blank value
 | 
			
		||||
            ),
 | 
			
		||||
            "source" to listOf("DN42")
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Test
 | 
			
		||||
    fun `getData should throw FileNotFoundException for not existing file`() {
 | 
			
		||||
        assertFailsWith<FileNotFoundException> {
 | 
			
		||||
            loader.getData("mntner", "NOTEXIST-MNT")
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ class RegistryObjectSerializerTest {
 | 
			
		|||
    @Test
 | 
			
		||||
    fun `readToMap should throw InvalidKeyException when the key contains illegal numbers`() {
 | 
			
		||||
        withMockSource("li6ne: this has number! not possible have number!") { source ->
 | 
			
		||||
            assertFailsWith(InvalidKeyException::class) {
 | 
			
		||||
            assertFailsWith<InvalidKeyException> {
 | 
			
		||||
                RegistryObjectSerializer.readToMap(source)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ class RegistryObjectSerializerTest {
 | 
			
		|||
    @Test
 | 
			
		||||
    fun `readToMap should throw InvalidKeyException when a key contains illegal greater than characters`() {
 | 
			
		||||
        withMockSource("li>ne: this has >! cannot have !") { source ->
 | 
			
		||||
            assertFailsWith(InvalidKeyException::class) {
 | 
			
		||||
            assertFailsWith<InvalidKeyException> {
 | 
			
		||||
                RegistryObjectSerializer.readToMap(source)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -61,7 +61,7 @@ class RegistryObjectSerializerTest {
 | 
			
		|||
    @Test
 | 
			
		||||
    fun `readToMap should throw InvalidKeyException when a key contains illegal spaces`() {
 | 
			
		||||
        withMockSource(" line: leading  ! bad!") { source ->
 | 
			
		||||
            assertFailsWith(InvalidKeyException::class) {
 | 
			
		||||
            assertFailsWith<InvalidKeyException> {
 | 
			
		||||
                RegistryObjectSerializer.readToMap(source)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +70,7 @@ class RegistryObjectSerializerTest {
 | 
			
		|||
    @Test
 | 
			
		||||
    fun `readToMap should throw InvalidKeyException when a key contains uppercase characters`() {
 | 
			
		||||
        withMockSource("Line: Content") { source ->
 | 
			
		||||
            assertFailsWith(InvalidKeyException::class) {
 | 
			
		||||
            assertFailsWith<InvalidKeyException> {
 | 
			
		||||
                RegistryObjectSerializer.readToMap(source)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +79,7 @@ class RegistryObjectSerializerTest {
 | 
			
		|||
    @Test
 | 
			
		||||
    fun `readToMap should throw InvalidKeyException when a key is empty`() {
 | 
			
		||||
        withMockSource(": what key?") { source ->
 | 
			
		||||
            assertFailsWith(InvalidKeyException::class) {
 | 
			
		||||
            assertFailsWith<InvalidKeyException> {
 | 
			
		||||
                RegistryObjectSerializer.readToMap(source)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -88,7 +88,7 @@ class RegistryObjectSerializerTest {
 | 
			
		|||
    @Test
 | 
			
		||||
    fun `readToMap should throw MissingKeyException when there's an invalid pair`() {
 | 
			
		||||
        withMockSource("line: content\nanother line") { source ->
 | 
			
		||||
            assertFailsWith(MissingKeyException::class) {
 | 
			
		||||
            assertFailsWith<MissingKeyException> {
 | 
			
		||||
                RegistryObjectSerializer.readToMap(source)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,12 +10,11 @@ import kotlinx.io.readString
 | 
			
		|||
import kotlinx.io.writeString
 | 
			
		||||
import kotlin.test.Test
 | 
			
		||||
import kotlin.test.assertEquals
 | 
			
		||||
import kotlin.test.fail
 | 
			
		||||
 | 
			
		||||
private const val RESOURCES_PATH_PREFIX = "src/nativeTest/resources/"
 | 
			
		||||
private val RESOURCE_ROOT_PATH = Path("src/nativeTest/resources/")
 | 
			
		||||
 | 
			
		||||
fun getResourcePath(resource: String): Path =
 | 
			
		||||
    Path(RESOURCES_PATH_PREFIX + resource)
 | 
			
		||||
    Path(RESOURCE_ROOT_PATH, resource)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieves a raw source for the specified resource.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue