Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
394 changes: 192 additions & 202 deletions .github/workflows/ci.yaml

Large diffs are not rendered by default.

330 changes: 156 additions & 174 deletions .github/workflows/maven-central-publish.yaml

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,3 +197,4 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
- Dependency versions are unified in `gradle/libs.versions.toml`
- Use `./gradlew versionCatalogUpdate` to check for dependency updates
- Version publishing through Maven Central Repository, naming rule: `io.github.truenine:composeserver-{module-name}`
- 这是一个库项目,类似于springboot
568 changes: 19 additions & 549 deletions README.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,14 @@ afterEvaluate {

dependsOn(configurations.testRuntimeClasspath)

// Configure test output to suppress warnings
// Configure test output for detailed logging
testLogging {
showStandardStreams = false
showStandardStreams = true
exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL
events("passed", "skipped", "failed")
events("passed", "skipped", "failed", "started")
showExceptions = true
showCauses = true
showStackTraces = true
}

val commonProjectDeps = listOf("testtoolkit", "shared")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import io.github.truenine.composeserver.depend.jackson.autoconfig.JacksonAutoCon
import io.github.truenine.composeserver.logger
import java.time.Duration
import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.redis.cache.RedisCacheConfiguration
Expand All @@ -24,6 +25,7 @@ import org.springframework.data.redis.serializer.StringRedisSerializer
* @since 2023-02-20
*/
@Configuration
@ConditionalOnBean(RedisConnectionFactory::class)
class RedisJsonSerializerAutoConfiguration(@Qualifier(JacksonAutoConfiguration.NON_IGNORE_OBJECT_MAPPER_BEAN_NAME) objectMapper: ObjectMapper) {
companion object {
@JvmStatic private val log = logger<RedisJsonSerializerAutoConfiguration>()
Expand All @@ -41,6 +43,7 @@ class RedisJsonSerializerAutoConfiguration(@Qualifier(JacksonAutoConfiguration.N
.disableCachingNullValues()

@Bean(name = [ICacheNames.IRedis.HANDLE])
@ConditionalOnBean(name = [VIRTUAL_THREAD_REDIS_FACTORY_BEAN_NAME])
fun customRedisJsonSerializable(@Qualifier(VIRTUAL_THREAD_REDIS_FACTORY_BEAN_NAME) factory: RedisConnectionFactory): RedisTemplate<String, *> {
log.trace("register redisTemplate factory: {}", factory)
val rt = RedisTemplate<String, Any?>()
Expand All @@ -55,6 +58,7 @@ class RedisJsonSerializerAutoConfiguration(@Qualifier(JacksonAutoConfiguration.N
}

@Bean(name = [ICacheNames.IRedis.CACHE_MANAGER])
@ConditionalOnBean(name = [VIRTUAL_THREAD_REDIS_FACTORY_BEAN_NAME])
fun cacheManager2h(@Qualifier(VIRTUAL_THREAD_REDIS_FACTORY_BEAN_NAME) factory: RedisConnectionFactory): RedisCacheManager {
log.debug("register RedisCacheManager , factory: {}", factory)
return asCacheConfig(factory)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ class DotenvLoaderTest {
val envFile =
createTempEnvFile(
"""
JAVA_OPTS=-Xmx1g
CUSTOM_OPTS=-Xmx1g
APP_ENV=production
DATABASE_URL=jdbc:postgresql://localhost:5432/mydb
"""
Expand All @@ -304,7 +304,7 @@ class DotenvLoaderTest {
val loader = DotenvLoader(project, config)

// 验证环境变量已注入
assertEquals("-Xmx1g", javaExecTask.environment["JAVA_OPTS"])
assertEquals("-Xmx1g", javaExecTask.environment["CUSTOM_OPTS"])
assertEquals("production", javaExecTask.environment["APP_ENV"])
assertEquals("jdbc:postgresql://localhost:5432/mydb", javaExecTask.environment["DATABASE_URL"])
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ data class MinioConfig(
/** 是否复用容器,默认复用 */
var reuse: Boolean = true,
/** MinIO Docker 镜像 默认使用较新的稳定版本 */
var image: String = "minio/minio:minio/minio:RELEASE.2025-09-07T16-13-09Z-cpuv1",
var image: String = "minio/minio:RELEASE.2025-09-07T16-13-09Z-cpuv1",

/** 默认访问密钥 */
var accessKey: String = "minioadmin",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,10 @@ class TestcontainersPropertiesIntegrationTest {
@Test
fun should_inject_properties_with_defaults() {
assertNotNull(testcontainersProperties)
assertEquals("postgres:17.5-alpine3.22", testcontainersProperties.postgres.image)
assertEquals("postgres:17.6-alpine3.22", testcontainersProperties.postgres.image)
assertEquals("mysql:8.4.6-oraclelinux9", testcontainersProperties.mysql.image)
assertEquals("redis:8.0.3-alpine3.21", testcontainersProperties.redis.image)
assertEquals("minio/minio:RELEASE.2025-07-23T15-54-02Z", testcontainersProperties.minio.image)
assertEquals("redis/redis-stack:7.2.0-v18", testcontainersProperties.redis.image)
assertEquals("minio/minio:RELEASE.2025-09-07T16-13-09Z-cpuv1", testcontainersProperties.minio.image)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class TestcontainersPropertiesTest {
fun should_have_correct_default_postgres_config() {
val properties = TestcontainersProperties()

assertEquals("postgres:17.5-alpine3.22", properties.postgres.image)
assertEquals("postgres:17.6-alpine3.22", properties.postgres.image)
assertEquals("testdb", properties.postgres.databaseName)
assertEquals("test", properties.postgres.username)
assertEquals("test", properties.postgres.password)
Expand All @@ -40,14 +40,14 @@ class TestcontainersPropertiesTest {
fun should_have_correct_default_redis_config() {
val properties = TestcontainersProperties()

assertEquals("redis:8.0.3-alpine3.21", properties.redis.image)
assertEquals("redis/redis-stack:7.2.0-v18", properties.redis.image)
}

@Test
fun should_have_correct_default_minio_config() {
val properties = TestcontainersProperties()

assertEquals("minio/minio:RELEASE.2025-07-23T15-54-02Z", properties.minio.image)
assertEquals("minio/minio:RELEASE.2025-09-07T16-13-09Z-cpuv1", properties.minio.image)
assertEquals("minioadmin", properties.minio.accessKey)
assertEquals("minioadmin", properties.minio.secretKey)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ class TestcontainersConfigurationHolderTest {
assertNotNull(properties.minio, "MinIO 配置不应为 null")

// 验证默认配置值
assertEquals("postgres:17.5-alpine3.22", properties.postgres.image, "PostgreSQL 默认镜像应该正确")
assertEquals("redis:8.0.3-alpine3.21", properties.redis.image, "Redis 默认镜像应该正确")
assertEquals("minio/minio:RELEASE.2025-07-23T15-54-02Z", properties.minio.image, "MinIO 默认镜像应该正确")
assertEquals("postgres:17.6-alpine3.22", properties.postgres.image, "PostgreSQL 默认镜像应该正确")
assertEquals("redis/redis-stack:7.2.0-v18", properties.redis.image, "Redis 默认镜像应该正确")
assertEquals("minio/minio:RELEASE.2025-09-07T16-13-09Z-cpuv1", properties.minio.image, "MinIO 默认镜像应该正确")

// 验证配置的完整性
assertTrue(properties.postgres.image.isNotEmpty(), "PostgreSQL 镜像名不应为空")
Expand All @@ -56,7 +56,7 @@ class TestcontainersConfigurationHolderTest {

// 验证在Bean不存在时返回默认配置
assertNotNull(properties, "属性对象不应为 null")
assertEquals("postgres:17.5-alpine3.22", properties.postgres.image, "PostgreSQL 默认镜像应该正确")
assertEquals("postgres:17.6-alpine3.22", properties.postgres.image, "PostgreSQL 默认镜像应该正确")

// 验证所有默认配置都可用
assertNotNull(properties.postgres, "PostgreSQL 配置不应为 null")
Expand Down