+ * May use only auth, collection, store (checked by {@code ModularityTests}). */ +@ApplicationModule(allowedDependencies = { "auth", "collection", "store" }) package com.mccprogrammer.extpulse.alerts; + +import org.springframework.modulith.ApplicationModule; diff --git a/src/main/java/com/mccprogrammer/extpulse/auth/package-info.java b/src/main/java/com/mccprogrammer/extpulse/auth/package-info.java index b3bc506..512a23c 100644 --- a/src/main/java/com/mccprogrammer/extpulse/auth/package-info.java +++ b/src/main/java/com/mccprogrammer/extpulse/auth/package-info.java @@ -1,4 +1,9 @@ /** * Accounts, login and JWT tokens (Spring Security). + *
+ * Depends on nothing else in ExtPulse. */ +@ApplicationModule(allowedDependencies = {}) package com.mccprogrammer.extpulse.auth; + +import org.springframework.modulith.ApplicationModule; diff --git a/src/main/java/com/mccprogrammer/extpulse/catalog/package-info.java b/src/main/java/com/mccprogrammer/extpulse/catalog/package-info.java index 2f66b60..cb58d06 100644 --- a/src/main/java/com/mccprogrammer/extpulse/catalog/package-info.java +++ b/src/main/java/com/mccprogrammer/extpulse/catalog/package-info.java @@ -1,5 +1,10 @@ /** * What ExtPulse tracks: publishers, their extensions and each extension's listings on the * stores. The other packages read listings from here. + *
+ * May use only auth, store (checked by {@code ModularityTests}). */ +@ApplicationModule(allowedDependencies = { "auth", "store" }) package com.mccprogrammer.extpulse.catalog; + +import org.springframework.modulith.ApplicationModule; diff --git a/src/main/java/com/mccprogrammer/extpulse/collection/package-info.java b/src/main/java/com/mccprogrammer/extpulse/collection/package-info.java index a879801..d71962c 100644 --- a/src/main/java/com/mccprogrammer/extpulse/collection/package-info.java +++ b/src/main/java/com/mccprogrammer/extpulse/collection/package-info.java @@ -1,5 +1,10 @@ /** * Daily collection: the scheduled job that asks every store adapter for stats and * reviews, saves one snapshot per listing per day and records each run. + *
+ * May use only catalog, reviews, store (checked by {@code ModularityTests}). */ +@ApplicationModule(allowedDependencies = { "catalog", "reviews", "store" }) package com.mccprogrammer.extpulse.collection; + +import org.springframework.modulith.ApplicationModule; diff --git a/src/main/java/com/mccprogrammer/extpulse/publicpage/package-info.java b/src/main/java/com/mccprogrammer/extpulse/publicpage/package-info.java index c0ccb5d..3fa939e 100644 --- a/src/main/java/com/mccprogrammer/extpulse/publicpage/package-info.java +++ b/src/main/java/com/mccprogrammer/extpulse/publicpage/package-info.java @@ -1,4 +1,9 @@ /** * Public portfolio page and the combined installs badge, served without login. + *
+ * May use only auth, stats (checked by {@code ModularityTests}). */ +@ApplicationModule(allowedDependencies = { "auth", "stats" }) package com.mccprogrammer.extpulse.publicpage; + +import org.springframework.modulith.ApplicationModule; diff --git a/src/main/java/com/mccprogrammer/extpulse/reviews/package-info.java b/src/main/java/com/mccprogrammer/extpulse/reviews/package-info.java index 66a0b04..fca1286 100644 --- a/src/main/java/com/mccprogrammer/extpulse/reviews/package-info.java +++ b/src/main/java/com/mccprogrammer/extpulse/reviews/package-info.java @@ -1,4 +1,9 @@ /** * Reviews from every store in one inbox, with answered / unanswered status. + *
+ * May use only auth, store (checked by {@code ModularityTests}). */ +@ApplicationModule(allowedDependencies = { "auth", "store" }) package com.mccprogrammer.extpulse.reviews; + +import org.springframework.modulith.ApplicationModule; diff --git a/src/main/java/com/mccprogrammer/extpulse/stats/package-info.java b/src/main/java/com/mccprogrammer/extpulse/stats/package-info.java index 4b05a3e..75d7bca 100644 --- a/src/main/java/com/mccprogrammer/extpulse/stats/package-info.java +++ b/src/main/java/com/mccprogrammer/extpulse/stats/package-info.java @@ -1,5 +1,10 @@ /** * Statistics read from the saved snapshots: combined totals, daily and weekly gains, * split by store. + *
+ * May use only auth, catalog, store (checked by {@code ModularityTests}). */ +@ApplicationModule(allowedDependencies = { "auth", "catalog", "store" }) package com.mccprogrammer.extpulse.stats; + +import org.springframework.modulith.ApplicationModule; diff --git a/src/main/java/com/mccprogrammer/extpulse/store/package-info.java b/src/main/java/com/mccprogrammer/extpulse/store/package-info.java index c2b6c5f..57a13ef 100644 --- a/src/main/java/com/mccprogrammer/extpulse/store/package-info.java +++ b/src/main/java/com/mccprogrammer/extpulse/store/package-info.java @@ -1,5 +1,10 @@ /** * Store adapters: one {@code StoreSource} per store (VS Code Marketplace, Open VSX, * Chrome Web Store). The only code that talks to the stores. + *
+ * Depends on nothing else in ExtPulse. */ +@ApplicationModule(allowedDependencies = {}) package com.mccprogrammer.extpulse.store; + +import org.springframework.modulith.ApplicationModule; diff --git a/src/test/java/com/mccprogrammer/extpulse/ModularityTests.java b/src/test/java/com/mccprogrammer/extpulse/ModularityTests.java new file mode 100644 index 0000000..d69c3c6 --- /dev/null +++ b/src/test/java/com/mccprogrammer/extpulse/ModularityTests.java @@ -0,0 +1,20 @@ +package com.mccprogrammer.extpulse; + +import org.junit.jupiter.api.Test; + +import org.springframework.modulith.core.ApplicationModules; + +/** + * The package-per-feature structure, checked by Spring Modulith: each top-level package + * is a module, modules form no cycle, and a module uses only the ones its package-info + * allows ({@code @ApplicationModule(allowedDependencies = ...)}). A new dependency + * between features is then a change to that list, made on purpose and reviewed. + */ +class ModularityTests { + + @Test + void modulesUseOnlyTheModulesTheyAreAllowedTo() { + ApplicationModules.of(ExtpulseApplication.class).verify(); + } + +}