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
9 changes: 6 additions & 3 deletions .github/workflows/gradle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,17 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v1
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
- name: Codecov
uses: codecov/codecov-action@v1
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
5 changes: 3 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v1
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Grant execute permission for gradlew
run: chmod +x gradlew
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,14 @@ MongoDB data migration tool for Spring Boot projects
* Support MongoDB transactions
* Support ReactiveMongoTemplate

## Compatibility

| Mongration | Spring Boot |
|------------|-------------|
| 3.x | 4.x |
| 2.x | 3.x |
| 1.x | 2.x |

## Getting started
### Add a dependency
#### Maven
Expand Down
23 changes: 15 additions & 8 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,22 @@ java {
}

group = 'com.github.kuliginstepan'
version = '2.0.1'
version = '3.0.0'

repositories {
mavenCentral()
}

dependencies {
api platform('org.springframework.boot:spring-boot-dependencies:3.0.4')
annotationProcessor platform('org.springframework.boot:spring-boot-dependencies:3.0.4')
testAnnotationProcessor platform('org.springframework.boot:spring-boot-starter-parent:3.0.4')
api platform('org.springframework.boot:spring-boot-dependencies:4.1.0')
annotationProcessor platform('org.springframework.boot:spring-boot-dependencies:4.1.0')
testAnnotationProcessor platform('org.springframework.boot:spring-boot-dependencies:4.1.0')

implementation 'org.springframework.boot:spring-boot-autoconfigure'
api 'io.projectreactor:reactor-core'

compileOnly 'org.springframework.data:spring-data-mongodb'
compileOnly 'org.springframework.boot:spring-boot-data-mongodb'
compileOnly 'org.springframework.boot:spring-boot-actuator-autoconfigure'
compileOnly 'org.mongodb:mongodb-driver-reactivestreams'
compileOnly 'org.projectlombok:lombok'
Expand All @@ -41,14 +42,20 @@ dependencies {

testAnnotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.testcontainers:junit-jupiter:1.17.6'
testImplementation 'org.testcontainers:mongodb:1.17.6'
testImplementation 'org.springframework.data:spring-data-mongodb'
testImplementation 'org.springframework.boot:spring-boot-starter-data-mongodb-test'
testImplementation 'org.springframework.boot:spring-boot-starter-data-mongodb-reactive-test'
testImplementation 'org.springframework.boot:spring-boot-starter-webflux'
testImplementation 'org.springframework.boot:spring-boot-transaction'
testImplementation 'org.testcontainers:testcontainers-junit-jupiter'
testImplementation 'org.testcontainers:testcontainers-mongodb'
testImplementation 'org.mongodb:mongodb-driver-reactivestreams'
testImplementation 'org.mongodb:mongodb-driver-sync'
testImplementation 'io.projectreactor:reactor-core'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.withType(JavaCompile).configureEach {
options.compilerArgs.add('-parameters')
}

test {
Expand Down
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.kuliginstepan.mongration.configuration.MongrationAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnAvailableEndpoint;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
Expand All @@ -12,9 +12,8 @@
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;

@Configuration(proxyBeanMethods = false)
@AutoConfiguration(after = MongrationAutoConfiguration.class)
@ConditionalOnClass(Endpoint.class)
@AutoConfigureAfter(MongrationAutoConfiguration.class)
public class MongrationActuatorAutoConfiguration {

@Configuration(proxyBeanMethods = false)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package com.kuliginstepan.mongration.configuration;

import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
import org.springframework.boot.data.mongodb.autoconfigure.DataMongoAutoConfiguration;
import org.springframework.boot.data.mongodb.autoconfigure.DataMongoReactiveAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration(proxyBeanMethods = false)
@AutoConfigureAfter({MongoDataAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class})
@AutoConfiguration(after = {DataMongoAutoConfiguration.class, DataMongoReactiveAutoConfiguration.class})
@ConditionalOnProperty(value = MongrationProperties.ENABLED_PROPERTY, matchIfMissing = true)
@Import({MongrationConfiguration.class, ReactiveMongrationConfiguration.class})
public class MongrationAutoConfiguration {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ public Mono<Void> createIndexes(Class<?> type) {
@Override
public Mono<Void> createIndexes(Class<?> type, String collection) {
return Flux.fromIterable(indexResolver.resolveIndexFor(type))
.map(index -> indexOperationsProvider.indexOps(collection).ensureIndex(index))
.map(index -> indexOperationsProvider.indexOps(collection).createIndex(index))
.then();
}

@Override
public Mono<Void> createIndexes(List<IndexDefinition> definitions, String collection) {
return Flux.fromIterable(definitions)
.map(index -> indexOperationsProvider.indexOps(collection).ensureIndex(index))
.map(index -> indexOperationsProvider.indexOps(collection).createIndex(index))
.then();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,14 @@ public Mono<Void> createIndexes(Class<?> type) {
@Override
public Mono<Void> createIndexes(Class<?> type, String collection) {
return Flux.fromIterable(indexResolver.resolveIndexFor(type))
.flatMap(index -> indexOperationsProvider.indexOps(collection).ensureIndex(index))
.flatMap(index -> indexOperationsProvider.indexOps(collection).createIndex(index))
.then();
}

@Override
public Mono<Void> createIndexes(List<IndexDefinition> definitions, String collection) {
return Flux.fromIterable(definitions)
.flatMap(index -> indexOperationsProvider.indexOps(collection).ensureIndex(index))
.flatMap(index -> indexOperationsProvider.indexOps(collection).createIndex(index))
.then();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.testcontainers.containers.MongoDBContainer;
import org.testcontainers.mongodb.MongoDBContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

Expand All @@ -19,14 +19,14 @@ public class MongoIntegrationTest {

@DynamicPropertySource
static void mongoProperties(DynamicPropertyRegistry registry) {
registry.add("spring.data.mongodb.uri", MONGO::getReplicaSetUrl);
registry.add("spring.mongodb.uri", MONGO::getReplicaSetUrl);
}

public static class Initializer
implements ApplicationContextInitializer<ConfigurableApplicationContext> {

public void initialize(ConfigurableApplicationContext configurableApplicationContext) {
TestPropertyValues.of("spring.data.mongodb.uri=" + MONGO.getReplicaSetUrl())
TestPropertyValues.of("spring.mongodb.uri=" + MONGO.getReplicaSetUrl())
.applyTo(configurableApplicationContext.getEnvironment());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest;
import org.springframework.context.annotation.Import;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.MongoTemplate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.boot.data.mongodb.autoconfigure.DataMongoAutoConfiguration;
import org.springframework.boot.mongodb.autoconfigure.MongoAutoConfiguration;
import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Import;
import org.springframework.data.annotation.Id;
Expand Down Expand Up @@ -69,7 +69,7 @@ public static class TestDocument {
static void setUp() {
new ApplicationContextRunner()
.withInitializer(new Initializer())
.withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, MongoDataAutoConfiguration.class))
.withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, DataMongoAutoConfiguration.class))
.withPropertyValues("spring.data.mongodb.auto-index-creation=false")
.run(context -> {
MongoTemplate template = context.getBean(MongoTemplate.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.boot.data.mongodb.autoconfigure.DataMongoReactiveAutoConfiguration;
import org.springframework.boot.mongodb.autoconfigure.MongoReactiveAutoConfiguration;
import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Import;
import org.springframework.data.annotation.Id;
Expand Down Expand Up @@ -72,7 +72,7 @@ static void setUp() {
new ApplicationContextRunner()
.withInitializer(new Initializer())
.withConfiguration(
AutoConfigurations.of(MongoReactiveAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class))
AutoConfigurations.of(MongoReactiveAutoConfiguration.class, DataMongoReactiveAutoConfiguration.class))
.withPropertyValues("spring.data.mongodb.auto-index-creation=false")
.run(context -> {
ReactiveMongoTemplate template = context.getBean(ReactiveMongoTemplate.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest;
import org.springframework.boot.data.mongodb.test.autoconfigure.DataMongoTest;
import org.springframework.context.annotation.Import;
import org.springframework.core.annotation.Order;
import org.springframework.data.annotation.Id;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration;
import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration;
import org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration;
import org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration;
import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration;
import org.springframework.boot.data.mongodb.autoconfigure.DataMongoReactiveAutoConfiguration;
import org.springframework.boot.mongodb.autoconfigure.MongoReactiveAutoConfiguration;
import org.springframework.boot.transaction.autoconfigure.TransactionAutoConfiguration;
import org.springframework.boot.webflux.autoconfigure.HttpHandlerAutoConfiguration;
import org.springframework.boot.reactor.netty.autoconfigure.NettyReactiveWebServerAutoConfiguration;
import org.springframework.boot.webflux.autoconfigure.WebFluxAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
Expand All @@ -35,10 +35,10 @@
@ImportAutoConfiguration({
TransactionAutoConfiguration.class,
MongoReactiveAutoConfiguration.class,
MongoReactiveDataAutoConfiguration.class,
DataMongoReactiveAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class,
MongrationAutoConfiguration.class,
ReactiveWebServerFactoryAutoConfiguration.class,
NettyReactiveWebServerAutoConfiguration.class,
HttpHandlerAutoConfiguration.class,
WebFluxAutoConfiguration.class
})
Expand All @@ -62,7 +62,7 @@ void shouldRollbackTransactionalChangeSet() {
new ApplicationContextRunner()
.withInitializer(new Initializer())
.withConfiguration(
AutoConfigurations.of(MongoReactiveAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class))
AutoConfigurations.of(MongoReactiveAutoConfiguration.class, DataMongoReactiveAutoConfiguration.class))
.run(context -> {
ReactiveMongoTemplate template = context.getBean(ReactiveMongoTemplate.class);
assertThat(template.findAll(Document.class, "test").collectList().block().size()).isEqualTo(0);
Expand All @@ -76,7 +76,7 @@ void tearDown() {
new ApplicationContextRunner()
.withInitializer(new Initializer())
.withConfiguration(
AutoConfigurations.of(MongoReactiveAutoConfiguration.class, MongoReactiveDataAutoConfiguration.class))
AutoConfigurations.of(MongoReactiveAutoConfiguration.class, DataMongoReactiveAutoConfiguration.class))
.run(context -> {
ReactiveMongoTemplate template = context.getBean(ReactiveMongoTemplate.class);
template.dropCollection("test").block();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration;
import org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration;
import org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration;
import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration;
import org.springframework.boot.data.mongodb.autoconfigure.DataMongoAutoConfiguration;
import org.springframework.boot.mongodb.autoconfigure.MongoAutoConfiguration;
import org.springframework.boot.transaction.autoconfigure.TransactionAutoConfiguration;
import org.springframework.boot.webflux.autoconfigure.HttpHandlerAutoConfiguration;
import org.springframework.boot.reactor.netty.autoconfigure.NettyReactiveWebServerAutoConfiguration;
import org.springframework.boot.webflux.autoconfigure.WebFluxAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.context.annotation.Bean;
Expand All @@ -33,10 +33,10 @@
@ImportAutoConfiguration({
TransactionAutoConfiguration.class,
MongoAutoConfiguration.class,
MongoDataAutoConfiguration.class,
DataMongoAutoConfiguration.class,
PropertyPlaceholderAutoConfiguration.class,
MongrationAutoConfiguration.class,
ReactiveWebServerFactoryAutoConfiguration.class,
NettyReactiveWebServerAutoConfiguration.class,
HttpHandlerAutoConfiguration.class,
WebFluxAutoConfiguration.class
})
Expand Down Expand Up @@ -87,7 +87,7 @@ void shouldRollbackTransactionalChangeSet() {
});
new ApplicationContextRunner()
.withInitializer(new Initializer())
.withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, MongoDataAutoConfiguration.class))
.withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, DataMongoAutoConfiguration.class))
.run(context -> {
MongoTemplate template = context.getBean(MongoTemplate.class);
assertThat(template.findAll(Document.class, "test").size()).isEqualTo(0);
Expand All @@ -99,7 +99,7 @@ void shouldRollbackTransactionalChangeSet() {
void tearDown() {
new ApplicationContextRunner()
.withInitializer(new Initializer())
.withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, MongoDataAutoConfiguration.class))
.withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, DataMongoAutoConfiguration.class))
.run(context -> {
MongoTemplate template = context.getBean(MongoTemplate.class);
template.dropCollection("test");
Expand Down
Loading
Loading