zwischenstand

This commit is contained in:
Hartmut Bauer committed 2026-02-05 13:53:49 +01:00
1 parent e89bb29070
commit 231132dd9e
12 files changed
+191 -13

No files matched your search

+2 -2
View File
@@ -1,3 +1,3 @@
#auto generated
#Tue Feb 03 00:28:14 CET 2026
build.number=174
#Thu Feb 05 01:16:28 CET 2026
build.number=190
@@ -4,13 +4,13 @@ import net.keinekekse.version.Version
object VERSION: Version {
override val version = "1.0.0"
override val fullVersion = "1.0.0+build.174"
override val fullVersion = "1.0.0+build.190"
override val major = 1
override val minor = 0
override val patch = 0
override val preRelease = ""
override val buildMetadata = "build.174"
override val buildDate = "2026-02-02T23:28:14.786916Z"
override val buildMetadata = "build.190"
override val buildDate = "2026-02-05T00:16:28.206204Z"
override val displayName = "Books App"
override val copyright = "Copyright (c) 2026 Hartmut Bauer"
override val name = "books"
@@ -0,0 +1,5 @@
package net.keinekekse.app.config
// das interface kann in shared, aber der expect/actual-Teil muss in die Anwendung
// damit konkrete Werte, z.B. für die Preferences gesetzt werden können.
expect fun settingsFactory(): Settings
@@ -0,0 +1,9 @@
package net.keinekekse.app.config
import net.keinekekse.app.books.VERSION
import org.koin.core.annotation.Singleton
@Singleton
actual fun settingsFactory(): Settings {
return JvmSettings(VERSION::class.java)
}
@@ -19,6 +19,7 @@ import kotlinx.coroutines.withContext
import net.keinekekse.app.auth.AuthResult
import net.keinekekse.app.auth.Authenticator
import net.keinekekse.app.books.di.KoinApp
import net.keinekekse.app.config.Settings
import net.keinekekse.app.ui.ProgressIndicator
import org.koin.compose.koinInject
import org.koin.plugin.module.dsl.startKoin
@@ -36,6 +37,18 @@ fun main() = application {
startKoin<KoinApp>()
val settings: Settings = koinInject()
// val settings: Settings = PreferencesSettings(delegate)
//
// settings.put("kc_server", "kec.keinekekse.net")
println(settings.get("kc_server", "default"))
// println(Preferences.userRoot())
// println("System properties:")
// System.getProperties().forEach { println("${it.key}=${it.value}") }
// println("")
// keycloakServer = "kec.keinekekse.net"
// keycloakRealm = "app-server-realm"
// keycloakClient = "pkce-book-app"
@@ -164,3 +177,63 @@ fun main() = application {
// strokeWidth = strokewidth
// )
//}
/*
System properties:
------------------
java.specification.version=21
sun.jnu.encoding=UTF-8
java.class.path=/Users/hb/Workspaces/Kotlin/app/books/build/classes/kotlin/jvm/main:/Users/hb/Workspaces/Kotlin/app/books/build/classes/java/jvmMain:/Users/hb/Workspaces/Kotlin/app/books/build/processedResources/jvm/main:/Users/hb/Workspaces/Kotlin/app/shared/build/libs/shared-jvm.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-cio-jvm/3.4.0/84786f75d08fe5042f17c246380eb8381d125a6b/ktor-client-cio-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-auth-jvm/3.4.0/14d75d5e7552a8e26a2ad4dd511a76d4a0c5502f/ktor-client-auth-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-logging-jvm/3.4.0/278d41697d9194d36290842bfdae03d674b3f365/ktor-client-logging-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-content-negotiation-jvm/3.4.0/266c1aef9d340c22cd859dd5c9174c2e1d86489f/ktor-client-content-negotiation-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-java-jvm/3.4.0/4fcb8ec3488c8529773562d45e475533ab46f8ee/ktor-client-java-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-auth-jwt-jvm/3.4.0/f9c667cf2b122debb0081d0d69edb4caaa047d09/ktor-server-auth-jwt-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-auth-jvm/3.4.0/6c5fd0cb490bc7efabda621873c07b30b2e7f686/ktor-server-auth-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-client-core-jvm/3.4.0/1f017fc4dcf7e3ff5152a28923b7639a9ba82123/ktor-client-core-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-slf4j/1.10.2/1271f9d4a929150bb87ab8d1dc1e86d4bcf039f3/kotlinx-coroutines-slf4j-1.10.2.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.components/components-resources-desktop/1.10.0/c6115b607f77e9d033de360f989850d3824bf112/library-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material3/material3-desktop/1.10.0-alpha05/ebcf3065e9f7d408f8be2854b6542fb1dd51356f/material3-desktop-1.10.0-alpha05.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-compose-viewmodel-jvm/4.2.0-RC1/635720e57068e85996de14fe99262210bd373bf9/koin-compose-viewmodel-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.insert-koin/koin-compose-jvm/4.2.0-RC1/f8d7e9c3bc6ab356961774f56a9e844158b1de42/koin-compose-jvm-4.2.0-RC1.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.desktop/desktop-jvm/1.10.0/42facd9840309ac4eb841a986c5d1b97d2780471/desktop-jvm-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-desktop/1.10.0/63e1c3c6705d111bf84e41110e7729df5b85163e/material-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-ripple-desktop/1.10.0/74a14824f086339703264689c5a7cf4ceb39ed40/material-ripple-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.foundation/foundation-desktop/1.10.0/439630673394b12a406fe398faaca548a13fdb72/foundation-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-icons-extended-desktop/1.7.0/c7c5465dd754043076875b32bce0dd7f5a354fe8/material-icons-extended-desktop-1.7.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.androidx.lifecycle/lifecycle-viewmodel-compose-desktop/2.9.6/5cf03bfbc0f7139a4d7081d5da78c97287f3c65f/lifecycle-viewmodel-compose-desktop-2.9.6.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.animation/animation-desktop/1.10.0/17f777e04f7fe5dff2fe7992d0c0bda81c3a3897/animation-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.foundation/foundation-layout-desktop/1.10.0/263364f922ef14fb64f1313a384a0c31cd6f3fa5/foundation-layout-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.material/material-icons-core-desktop/1.7.0/414b3096050fe647b0638832eace80f22c06b85c/material-icons-core-desktop-1.7.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.animation/animation-core-desktop/1.10.0/5dd98c5745e548644b7657901bbcc4c2c8f9ec59/animation-core-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/org.jetbrains.compose.ui/ui-desktop/1.10.0/361220f423057a8dae48d6ba8a0294f0948caf8a/ui-desktop-1.10.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-serialization-kotlinx-json-jvm/3.4.0/2a09f17d70b6e61623fd8aff9bdce6d7877892/ktor-serialization-kotlinx-json-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-cio-jvm/3.4.0/16a50d239963841ae64e8e207f93ae7a5fdd7062/ktor-server-cio-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-sessions-jvm/3.4.0/35d3bb0535b2a6429b1eb73390cd4de9c541e654/ktor-server-sessions-jvm-3.4.0.jar:/Users/hb/.gradle/caches/modules-2/files-2.1/io.ktor/ktor-server-core-jvm/3.4.0/97aba0f5e3cd539679907382a3f57Line truncated
sun.awt.enableExtraMouseButtons=true
java.vm.vendor=Eclipse Adoptium
sun.arch.data.model=64
user.variant=
java.vendor.url=https://adoptium.net/
java.vm.specification.version=21
os.name=Mac OS X
user.country=DE
sun.java.launcher=SUN_STANDARD
sun.boot.library.path=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home/lib
sun.java.command=net.keinekekse.app.MainKt
http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
jdk.debug=release
sun.cpu.endian=little
user.home=/Users/hb
user.language=de
java.specification.vendor=Oracle Corporation
java.version.date=2025-10-21
java.home=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home
file.separator=/
java.vm.compressedOopsMode=Non-zero disjoint base
line.separator=
java.vm.specification.vendor=Oracle Corporation
java.specification.name=Java Platform API Specification
apple.awt.application.name=MainKt
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
java.runtime.version=21.0.9+10-LTS
user.name=hb
stdout.encoding=UTF-8
path.separator=:
os.version=26.2
java.runtime.name=OpenJDK Runtime Environment
file.encoding=UTF-8
java.vm.name=OpenJDK 64-Bit Server VM
java.vendor.version=Temurin-21.0.9+10
java.vendor.url.bug=https://github.com/adoptium/adoptium-support/issues
java.io.tmpdir=/var/folders/tb/nj4p1kpn1fn__rhr8k1gvfhw0000gn/T/
java.version=21.0.9
user.dir=/Users/hb/Workspaces/Kotlin/app/books
os.arch=aarch64
java.vm.specification.name=Java Virtual Machine Specification
native.encoding=UTF-8
java.library.path=/Users/hb/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
java.vm.info=mixed mode, sharing
stderr.encoding=UTF-8
java.vendor=Eclipse Adoptium
java.vm.version=21.0.9+10-LTS
sun.io.unicode.encoding=UnicodeBig
socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16
java.class.version=65.0
*/
Whitespace-only changes.
+9 -2
View File
@@ -18,6 +18,8 @@ koin-plugin = "0.3.0"
ktor = "3.4.0"
logback = "1.5.26"
material3 = "1.10.0-alpha05"
settings = "1.3.0"
dataStore = "1.2.0"
uiDesktop = "1.7.0"
[libraries]
@@ -34,7 +36,7 @@ compose-materialIcons = { module = "org.jetbrains.compose.material:material-icon
compose-ui = { module = "org.jetbrains.compose.ui:ui", version.ref = "composeMultiplatform" }
compose-components-resources = { module = "org.jetbrains.compose.components:components-resources", version.ref = "composeMultiplatform" }
compose-uiToolingPreview = { module = "org.jetbrains.compose.ui:ui-tooling-preview", version.ref = "composeMultiplatform" }
# --
# ----
kotlinx-coroutinesSwing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "kotlinx-coroutines" }
kotlinx-html = { module = "org.jetbrains.kotlinx:kotlinx-html", version.ref = "kotlinx-html" }
kotlin-wrappersCss = { module = "org.jetbrains.kotlin-wrappers:kotlin-css-jvm", version.ref = "kotlin-wrappers-css" }
@@ -77,7 +79,12 @@ koin-compose-viewmodel-navigation = { module = "io.insert-koin:koin-compose-view
#koin-compose-viewmodel-navigation3 = { module = "io.insert-koin:koin-compose-viewmodel-navigation3" }
koin-ktor = { module = "io.insert-koin:koin-ktor" }
koin-test = { module = "io.insert-koin:koin-test" }
# --
# ----
# Settings vorerst ohne externe Hilfe
#multiplatformSettings = { module = "com.russhwolf:multiplatform-settings", version.ref = "settings" }
#androidx-datastore = { module = "androidx.datastore:datastore", version.ref = "dataStore" }
#androidx-datastore-preferences = { module = "androidx.datastore:datastore-preferences", version.ref = "dataStore" }
[bundles]
kotlin-compose = [
+2 -2
View File
@@ -1,3 +1,3 @@
#auto generated
#Tue Feb 03 00:47:38 CET 2026
build.number=19
#Wed Feb 04 23:56:00 CET 2026
build.number=20
@@ -3,14 +3,14 @@ package net.keinekekse.app.server
import net.keinekekse.version.Version
object VERSION: Version {
override val version = "0.1.0-beta.1+build.19"
override val fullVersion = "0.1.0-beta.1+build.19"
override val version = "0.1.0-beta.1+build.20"
override val fullVersion = "0.1.0-beta.1+build.20"
override val major = 0
override val minor = 1
override val patch = 0
override val preRelease = "beta.1"
override val buildMetadata = "build.19"
override val buildDate = "2026-02-02T23:47:38.629893Z"
override val buildMetadata = "build.20"
override val buildDate = "2026-02-04T22:56:00.753833Z"
override val displayName = "kAS"
override val copyright = "Copyright (c) 2026 Hartmut Bauer"
override val name = "server"
@@ -0,0 +1,27 @@
package net.keinekekse.app.config
interface Settings {
fun get(key: String): String?
fun get(key: String, default: String): String = get(key) ?: default
fun getInt(key: String): Int? = get(key)?.toIntOrNull()
fun getInt(key: String, default: Int): Int = getInt(key) ?: default
fun getLong(key: String): Long? = get(key)?.toLongOrNull()
fun getLong(key: String, default: Long): Long = getLong(key) ?: default
fun getFloat(key: String): Float? = get(key)?.toFloatOrNull()
fun getFloat(key: String, default: Float): Float = getFloat(key) ?: default
fun getBoolean(key: String): Boolean? = get(key)?.toBooleanStrictOrNull()
fun getBoolean(key: String, default: Boolean): Boolean = getBoolean(key) ?: default
fun put(key: String, value: String)
fun putInt(key: String, value: Int)
fun putLong(key: String, value: Long)
fun putFloat(key: String, value: Float)
fun putBoolean(key: String, value: Boolean)
fun hasKey(key: String): Boolean = get(key) != null
fun remove(key: String)
fun clear()
fun size(): Int
fun keys(): Set<String>
}
@@ -10,6 +10,8 @@ import androidx.compose.ui.draw.drawBehind
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.unit.dp
// TODO (ProgressIndicator.() -> Unit) --> { animationSize = ....
@Composable
fun ProgressIndicator(animationSize: Int = 48, paddingTop: Int = 16, strokeWidth: Int = 5) {
val primaryColor = MaterialTheme.colorScheme.primary
@@ -0,0 +1,55 @@
package net.keinekekse.app.config
import java.util.prefs.Preferences
class JvmSettings(clazz: Class<*>? = null) : Settings {
private val preferences: Preferences
init {
if (clazz != null) {
preferences = Preferences.userNodeForPackage(clazz)
} else {
preferences = Preferences.userRoot()
}
}
override fun get(key: String): String? {
return preferences.get(key, null)
}
override fun put(key: String, value: String) {
preferences.put(key, value)
}
override fun putInt(key: String, value: Int) {
preferences.putInt(key, value)
}
override fun putLong(key: String, value: Long) {
preferences.putLong(key, value)
}
override fun putFloat(key: String, value: Float) {
preferences.putFloat(key, value)
}
override fun putBoolean(key: String, value: Boolean) {
preferences.putBoolean(key, value)
}
override fun remove(key: String) {
preferences.remove(key)
}
override fun clear() {
preferences.clear()
}
override fun size(): Int {
return preferences.keys().size
}
override fun keys(): Set<String> {
return preferences.keys().toSet()
}
}