Skip to content

ci: add spotless Gradle tasks and check during build in CI #599

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 21, 2025
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
4 changes: 4 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ jobs:
key: ${{ runner.os }}-gradlew-${{ hashFiles('**/gradlew') }}
restore-keys: ${{ runner.os }}-gradlew-

- name: Code Style Check
run: |
./gradlew spotlessCheck -S

- name: Build
run: |
./gradlew build aggregateTestReport -S
Expand Down
380 changes: 380 additions & 0 deletions .spotless/roms-style.xml

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -632,22 +632,22 @@ detail. [Open an issue on GitHub](https://github.com/redis-om/redis-om-spring/is

### Code Style

This project uses the Spotless Maven plugin with Eclipse formatter to enforce a consistent code style. Before submitting a pull request, please make sure your code follows our formatting guidelines by running:
This project uses the Spotless Gradle plugin with Eclipse formatter to enforce a consistent code style. Before submitting a pull request, please make sure your code follows our formatting guidelines by running:

```bash
mvn spotless:apply
./gradlew spotlessApply
```

This will automatically reformat your code to match the project's style. You can also check if your code meets the formatting requirements without changing it:

```bash
mvn spotless:check
./gradlew spotlessCheck
```

The main formatting rules include:
- 2-space indentation (not 4)
- KNR brace style (braces at end of line)
- Maximum line length of 100 characters
- Maximum line length of 120 characters
- Consistent import ordering (java, javax, org, com, other imports)

## 🧑‍🤝‍🧑 Sibling Projects
Expand Down
33 changes: 20 additions & 13 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,26 +1,33 @@
plugins {
id 'org.springframework.boot' version "${springBootVersion}" apply false
id 'org.springframework.boot' version "${springBootVersion}" apply false
id 'com.diffplug.spotless' version '6.25.0'
id 'java' // Add java plugin to root project
}

ext['jedis.version'] = "${jedisVersion}"

allprojects {
version = project.version
group = project.group
description = project.description
repositories {
mavenLocal()
mavenCentral()
}
version = project.version
group = project.group
description = project.description
repositories {
mavenLocal()
mavenCentral()
}
}

// Apply the Spotless configuration
apply from: "spotless.gradle"

subprojects {
apply from: "$rootDir/gradle/build-conventions.gradle"
apply from: "$rootDir/gradle/build-conventions.gradle"
}

tasks.register('aggregateTestReport', TestReport) {
destinationDirectory = layout.buildDirectory.dir("reports/tests/aggregate")
testResults.setFrom(
subprojects.collect { it.tasks.withType(Test) }
)
destinationDirectory = layout.buildDirectory.dir("reports/tests/aggregate")
testResults.setFrom(
subprojects.collect {
it.tasks.withType(Test)
}
)
}
134 changes: 67 additions & 67 deletions gradle/build-conventions.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,89 +3,89 @@ apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven-publish'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
withJavadocJar()
withSourcesJar()
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
withJavadocJar()
withSourcesJar()
}

test {
useJUnitPlatform()
useJUnitPlatform()
}

dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
}
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
}
}

dependencies {
compileOnly "org.projectlombok:lombok"
annotationProcessor "org.projectlombok:lombok"
testImplementation "org.projectlombok:lombok"
testAnnotationProcessor "org.projectlombok:lombok"
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testImplementation 'org.junit.jupiter:junit-jupiter-params'
testImplementation 'org.junit.jupiter:junit-jupiter-engine'
testImplementation 'org.junit.platform:junit-platform-launcher'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation "com.redis:testcontainers-redis:${testcontainersRedisVersion}"
compileOnly "org.projectlombok:lombok"
annotationProcessor "org.projectlombok:lombok"
testImplementation "org.projectlombok:lombok"
testAnnotationProcessor "org.projectlombok:lombok"
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testImplementation 'org.junit.jupiter:junit-jupiter-params'
testImplementation 'org.junit.jupiter:junit-jupiter-engine'
testImplementation 'org.junit.platform:junit-platform-launcher'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation "com.redis:testcontainers-redis:${testcontainersRedisVersion}"
}

publishing {
publications {
mavenJava(MavenPublication) {
from components.java
groupId = project.group
artifactId = project.name
version = project.version
description = project.description
publications {
mavenJava(MavenPublication) {
from components.java
groupId = project.group
artifactId = project.name
version = project.version
description = project.description

versionMapping {
usage('java-api') {
fromResolutionOf('runtimeClasspath')
}
usage('java-runtime') {
fromResolutionResult()
}
}
versionMapping {
usage('java-api') {
fromResolutionOf('runtimeClasspath')
}
usage('java-runtime') {
fromResolutionResult()
}
}

pom {
packaging = 'jar'
name = project.name
description = project.description
url = "https://github.com/redis/redis-om-spring"
inceptionYear = '2021'
pom {
packaging = 'jar'
name = project.name
description = project.description
url = "https://github.com/redis/redis-om-spring"
inceptionYear = '2021'

licenses {
license {
name = "MIT License"
url = "https://opensource.org/licenses/MIT"
}
}
licenses {
license {
name = "MIT License"
url = "https://opensource.org/licenses/MIT"
}
}

developers {
developer {
id = "bsbodden"
name = "Brian Sam-Bodden"
email = "bsb at redis.com"
}
}
developers {
developer {
id = "bsbodden"
name = "Brian Sam-Bodden"
email = "bsb at redis.com"
}
}

scm {
connection = "scm:git:git://github.com/redis/redis-om-spring.git"
developerConnection = "scm:git:ssh://github.com/redis/redis-om-spring.git"
url = "https://github.com/redis/redis-om-spring"
}
}
}
}
scm {
connection = "scm:git:git://github.com/redis/redis-om-spring.git"
developerConnection = "scm:git:ssh://github.com/redis/redis-om-spring.git"
url = "https://github.com/redis/redis-om-spring"
}
}
}
}

repositories {
maven {
url = rootProject.layout.buildDirectory.dir('staging-deploy')
}
}
repositories {
maven {
url = rootProject.layout.buildDirectory.dir('staging-deploy')
}
}
}
61 changes: 30 additions & 31 deletions redis-om-spring-ai/build.gradle
Original file line number Diff line number Diff line change
@@ -1,40 +1,39 @@
description = 'Redis OM Spring AI'

dependencies {
implementation project(':redis-om-spring')
implementation project(':redis-om-spring')

implementation "org.springframework.ai:spring-ai-openai:${springAiVersion}"
compileOnly "jakarta.websocket:jakarta.websocket-api"
compileOnly "jakarta.websocket:jakarta.websocket-client-api"
implementation "org.springframework.ai:spring-ai-ollama:${springAiVersion}"
implementation "org.springframework.ai:spring-ai-azure-openai:${springAiVersion}"
implementation "org.springframework.ai:spring-ai-vertex-ai-embedding:${springAiVersion}"
implementation "org.springframework.ai:spring-ai-bedrock:${springAiVersion}"
implementation "org.springframework.ai:spring-ai-transformers:${springAiVersion}"
compileOnly "org.springframework.ai:spring-ai-mistral-ai:${springAiVersion}"
compileOnly "org.springframework.ai:spring-ai-minimax:${springAiVersion}"
compileOnly "org.springframework.ai:spring-ai-zhipuai:${springAiVersion}"
implementation "org.springframework.ai:spring-ai-openai:${springAiVersion}"
compileOnly "jakarta.websocket:jakarta.websocket-api"
compileOnly "jakarta.websocket:jakarta.websocket-client-api"
implementation "org.springframework.ai:spring-ai-ollama:${springAiVersion}"
implementation "org.springframework.ai:spring-ai-azure-openai:${springAiVersion}"
implementation "org.springframework.ai:spring-ai-vertex-ai-embedding:${springAiVersion}"
implementation "org.springframework.ai:spring-ai-bedrock:${springAiVersion}"
implementation "org.springframework.ai:spring-ai-transformers:${springAiVersion}"
compileOnly "org.springframework.ai:spring-ai-mistral-ai:${springAiVersion}"
compileOnly "org.springframework.ai:spring-ai-minimax:${springAiVersion}"
compileOnly "org.springframework.ai:spring-ai-zhipuai:${springAiVersion}"

compileOnly "com.google.auto.service:auto-service:${autoServiceVersion}"
compileOnly "com.google.auto.service:auto-service:${autoServiceVersion}"

// DJL Dependencies
implementation "ai.djl.spring:djl-spring-boot-starter-autoconfigure:${djlStarterVersion}"
implementation "ai.djl.spring:djl-spring-boot-starter-pytorch-auto:${djlStarterVersion}"
implementation "ai.djl.huggingface:tokenizers:${djlVersion}"
// DJL Dependencies
implementation "ai.djl.spring:djl-spring-boot-starter-autoconfigure:${djlStarterVersion}"
implementation "ai.djl.spring:djl-spring-boot-starter-pytorch-auto:${djlStarterVersion}"
implementation "ai.djl.huggingface:tokenizers:${djlVersion}"

testImplementation "org.mockito:mockito-core"
testImplementation "com.karuslabs:elementary:${elementaryVersion}"

testImplementation "org.springframework.ai:spring-ai-openai:${springAiVersion}"
testImplementation "jakarta.websocket:jakarta.websocket-api"
testImplementation "jakarta.websocket:jakarta.websocket-client-api"
testImplementation "org.springframework.ai:spring-ai-ollama:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-azure-openai:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-vertex-ai-embedding:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-bedrock:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-transformers:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-mistral-ai:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-minimax:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-zhipuai:${springAiVersion}"
testImplementation "org.mockito:mockito-core"
testImplementation "com.karuslabs:elementary:${elementaryVersion}"

testImplementation "org.springframework.ai:spring-ai-openai:${springAiVersion}"
testImplementation "jakarta.websocket:jakarta.websocket-api"
testImplementation "jakarta.websocket:jakarta.websocket-client-api"
testImplementation "org.springframework.ai:spring-ai-ollama:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-azure-openai:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-vertex-ai-embedding:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-bedrock:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-transformers:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-mistral-ai:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-minimax:${springAiVersion}"
testImplementation "org.springframework.ai:spring-ai-zhipuai:${springAiVersion}"
}
Loading