You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@grails.apache.org by "codeconsole (via GitHub)" <gi...@apache.org> on 2026/06/02 20:37:45 UTC

[PR] Make SiteMesh 3 the default GSP layout [grails-core]

codeconsole opened a new pull request, #15713:
URL: https://github.com/apache/grails-core/pull/15713

   Makes SiteMesh 3 the default GSP layout in generated applications, mutually exclusive with the legacy SiteMesh 2 `grails-layout` feature.
   
   Introduces a `GspLayout` one-of feature group (enforced by `OneOfFeatureValidator`):
   - **`GspLayout`** β€” abstract one-of parent (`Category.VIEW`, WEB/WEB_PLUGIN)
   - **`Sitemesh3`** β€” default member; auto-applied unless another `GspLayout` is selected; adds `grails-sitemesh3`
   - **`GrailsLayout`** β€” opt-in member; adds `grails-layout` (SiteMesh 2)
   
   `GrailsGsp` is intentionally **not** modified: its existing `if (!isFeaturePresent(Sitemesh3))` guard already skips `grails-layout` when SiteMesh 3 applies, so SiteMesh 2 remains available via `GrailsLayout`. Selecting both `sitemesh3` and `grails-layout` now fails fast.
   
   ### Depends on #15710
   Split out from #15710 per review feedback ("making this the default & updating to sitemesh 3 should be separate PRs"). This branch is stacked on #15710, so **until #15710 merges this PR's diff also shows the enable-SiteMesh-3 commits**; it will reduce to just the make-default change once #15710 lands. Please merge #15710 first.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "matrei (via GitHub)" <gi...@apache.org>.
matrei commented on code in PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#discussion_r3380842201


##########
.github/workflows/gradle.yml:
##########
@@ -24,6 +24,11 @@ on:
 concurrency:
   group: ${{ github.workflow }}-${{ github.ref }}
   cancel-in-progress: ${{ github.event_name == 'pull_request' }}
+# Exercise SiteMesh 3 by default in the test apps. The example/suite builds read this
+# flag to choose grails-sitemesh3 over the legacy grails-layout; unset it (or set it to
+# anything other than 'true') to fall back to SiteMesh 2.
+env:
+  SITEMESH3_TESTING_ENABLED: 'true'

Review Comment:
   We should turn this around to default to SiteMesh 3. Otherwise we will run SiteMesh 2 by default locally.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4637534760

   ## 🚨 TestLens detected 2 failed tests 🚨
   
   Here is what you can do:
   
   1) Inspect the test failures carefully.
   2) If you are convinced that some of the tests are flaky, you can mute them below.
   3) Finally, trigger a rerun by checking the rerun checkbox.
   
   ### Test Summary
   
   | Check | Project/Task | Test | Runs |
   |---|---|---|---|
   | [CI / Functional Tests \(Java 21, indy\=true\)](https://github.com/apache/grails-core/actions/runs/27053374628/job/79852928040?pr=15713) | :grails-test-examples-database-cleanup:integrationTest | ClassLevelCleanupSpec > test 1 - insert data and verify it was persisted | ❌ |
   | [CI / Functional Tests \(Java 21, indy\=true\)](https://github.com/apache/grails-core/actions/runs/27053374628/job/79852928040?pr=15713) | :grails-test-examples-database-cleanup:integrationTest | MethodLevelCleanupSpec > test 1 - insert data with \@DatabaseCleanup and explicit type on method | ❌ |
   
   🏷️ Commit: 920c12c9019d879a11f6f42e2066ea9aec5cf72e
   ▢️ Tests:  13955 executed
   🟑 Checks: 23/38 completed
   
   ### Test Failures
   
   <details>
   
   <summary><strong>ClassLevelCleanupSpec > test 1 - insert data and verify it was persisted</strong> (:grails-test-examples-database-cleanup:integrationTest in <a href="https://github.com/apache/grails-core/actions/runs/27053374628/job/79852928040?pr=15713">CI / Functional Tests (Java 21, indy=true)</a>)</summary>
   
   ```
   java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@79ca51cb testClass = dbcleanup.ClassLevelCleanupSpec, locations = [], classes = [dbcleanup.Application], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true", "server.port=0"], contextCustomizers = [org.spockframework.spring.mock.SpockContextCustomizer@0, org.springframework.boot.test.context.PropertyMappingContextCustomizer@0, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@3a7e365, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@64942607, org.springframework.boot.web.server.context.SpringBootTestRandomPortContextCustomizer@158ae284, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.springframework.boot.test.context.
 SpringBootTestAnnotation@d24938c7], resourceBasePath = "src/main/webapp", contextLoader = grails.boot.test.GrailsApplicationContextLoader, parent = null]
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:195)
   	at org.springframework.test.context.cache.DefaultContextCache.put(DefaultContextCache.java:214)
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:160)
   	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:128)
   	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:156)
   	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:111)
   	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260)
   	at org.spockframework.spring.SpringTestContextManager.prepareTestInstance(SpringTestContextManager.java:56)
   	at org.spockframework.spring.SpringInterceptor.interceptInitializerMethod(SpringInterceptor.java:46)
   	at org.spockframework.runtime.extension.AbstractMethodInterceptor.intercept(AbstractMethodInterceptor.java:24)
   	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   	at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'jspViewResolver' is expected to be of type 'org.springframework.context.ApplicationListener' but was actually of type 'org.grails.plugins.sitemesh3.GrailsSiteMeshViewResolver'
   	at org.springframework.beans.factory.support.AbstractBeanFactory.adaptBeanInstance(AbstractBeanFactory.java:418)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:399)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
   	at org.springframework.context.event.AbstractApplicationEventMulticaster.retrieveApplicationListeners(AbstractApplicationEventMulticaster.java:266)
   	at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:222)
   	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:140)
   	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:448)
   	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381)
   	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:1016)
   	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
   	at org.springframework.boot.web.server.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
   	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:756)
   	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:445)
   	at org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
   	at grails.boot.GrailsApp.run(GrailsApp.groovy:100)
   	at grails.boot.GrailsApp.run(GrailsApp.groovy:394)
   	at grails.boot.GrailsApp.run(GrailsApp.groovy:383)
   	at dbcleanup.Application.main(Application.groovy:27)
   	at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:281)
   	at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$1(SpringBootContextLoader.java:148)
   	at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.lambda$runMain$0(SpringBootContextLoader.java:593)
   	at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58)
   	at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46)
   	at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1465)
   	at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:600)
   	at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.runMain(SpringBootContextLoader.java:592)
   	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:143)
   	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:114)
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:247)
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:167)
   	... 13 more
   ```
   
   </details>
   <details>
   
   <summary><strong>MethodLevelCleanupSpec > test 1 - insert data with @DatabaseCleanup and explicit type on method</strong> (:grails-test-examples-database-cleanup:integrationTest in <a href="https://github.com/apache/grails-core/actions/runs/27053374628/job/79852928040?pr=15713">CI / Functional Tests (Java 21, indy=true)</a>)</summary>
   
   ```
   java.lang.IllegalStateException: ApplicationContext failure threshold (1) exceeded: skipping repeated attempt to load context for [WebMergedContextConfiguration@686ae6b3 testClass = dbcleanup.MethodLevelCleanupSpec, locations = [], classes = [dbcleanup.Application], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true", "server.port=0"], contextCustomizers = [org.spockframework.spring.mock.SpockContextCustomizer@0, org.springframework.boot.test.context.PropertyMappingContextCustomizer@0, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@3a7e365, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@64942607, org.springframework.boot.web.server.context.SpringBootTestRandomPortContextCustomizer@158ae284, org.springframework.test.context.support.DynamicPropertie
 sContextCustomizer@0, org.springframework.boot.test.context.SpringBootTestAnnotation@d24938c7], resourceBasePath = "src/main/webapp", contextLoader = grails.boot.test.GrailsApplicationContextLoader, parent = null]
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:157)
   	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:128)
   	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:156)
   	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:111)
   	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260)
   	at org.spockframework.spring.SpringTestContextManager.prepareTestInstance(SpringTestContextManager.java:56)
   	at org.spockframework.spring.SpringInterceptor.interceptInitializerMethod(SpringInterceptor.java:46)
   	at org.spockframework.runtime.extension.AbstractMethodInterceptor.intercept(AbstractMethodInterceptor.java:24)
   	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:101)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   	at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:156)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   ```
   
   </details>
   
   ### Muted Tests
   > [!NOTE]
   > Checks are currently running using the configuration below.
   
   Select tests to mute in this pull request:
   
   πŸ”² ClassLevelCleanupSpec > test 1 - insert data and verify it was persisted <!-- uniqueId=[engine:spock]/[spec:dbcleanup.ClassLevelCleanupSpec]/[feature:$spock_feature_0_0] -->
   πŸ”² MethodLevelCleanupSpec > test 1 - insert data with \@DatabaseCleanup and explicit type on method <!-- uniqueId=[engine:spock]/[spec:dbcleanup.MethodLevelCleanupSpec]/[feature:$spock_feature_0_0] -->
   
   Reuse successful test results:
   
   πŸ”² ♻️ Only rerun the tests that failed or were muted before
   
   Click the checkbox to trigger a rerun:
   
   πŸ”² **Rerun jobs**
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] 8.x Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "jamesfredley (via GitHub)" <gi...@apache.org>.
jamesfredley commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4732882027

   I re-verified my earlier SM2 parity list against the current PR head and addressed the outstanding CI item. Most items have been resolved by the commits pushed since my last review; status below.
   
   ## SM2 parity list - current status
   
   | Item | Status | Notes |
   | --- | --- | --- |
   | `g:applyLayout` attribute parity | βœ… Addressed | `RenderSitemeshTagLib` now handles `name`, `template`/`view`, `url`, `action`+`controller`, `params`, `model`, `contentType`, and `parse` (commit "Support the full applyLayout attribute surface under SiteMesh 3"). |
   | Default layout config + implicit `application` fallback | βœ… Addressed | `Sitemesh3GrailsPlugin` reads `grails.sitemesh.default.layout` then falls back to `grails.views.layout.default`; `Sitemesh3LayoutFinder.resolveDefaultDecorator()` falls back to the implicit `application` layout when none is configured (commit "Match SiteMesh 2's default layout config and application fallback"). |
   | `<title>` stripping robustness | βœ… Addressed | `Sitemesh3CapturedPage.indexOfTitleOpenTag()` now requires the char after `<title` to be `>` or whitespace, so `<titlebar>`/`<title-x>` are no longer mis-sliced (commit "Don't mis-slice head content around title-prefixed elements"). |
   | Test examples default path (Hibernate 7) | βœ… Addressed | The hibernate7 examples now use the `SITEMESH2_TESTING_ENABLED` toggle and default to SM3 when unset, consistent with the rest of the examples. |
   | SM2-only examples without SM3 coverage | βœ… Addressed | `scaffolding` and `jetty` now use the `SITEMESH2_TESTING_ENABLED` toggle (default SM3) rather than being hardcoded to `grails-layout`. |
   | `grails-gsp-spring-boot` publication | βœ… Addressed | Now listed in `gradle/publish-root-config.gradle` alongside `grails-sitemesh3`. |
   | Upstream auto-config suppression guard | ⚠️ Mechanism replaced | The disabled `NoopSitemeshFilter` workaround was dropped. Suppression is now done in `Sitemesh3AutoConfiguration` via `@AutoConfigureBefore(SiteMeshViewResolverAutoConfiguration)` + `@ConditionalOnMissingBean(SiteMeshViewResolverBeanPostProcessor)`, covered by `GrailsSiteMeshViewResolverBeanPostProcessorSpec`. There is still no dedicated test asserting the upstream *filter* auto-config stays suppressed, but the original fragile bean is gone. |
   | `grails.views.layout.enable.nongsp` | ❌ Not addressed | `Sitemesh3LayoutFinder` still resolves only through the GSP locator; the SM2 `enableNonGspViews` / non-GSP (JSP) layout flag has no SM3 equivalent. Low priority - can be a follow-up if non-GSP layouts need to be supported under SM3. |
   | CI coverage for SM2 lane | βœ… Addressed here | See below. |
   
   ## SM2 CI lane
   
   Per @jdaugherty's suggestion (a separate workflow to run the SiteMesh 2 work, since legacy apps may still use it and it isn't exercised by default), I added `.github/workflows/sitemesh2.yml`. It sets `SITEMESH2_TESTING_ENABLED=true` - which flips the starter, the uber unit suite and the functional test examples back onto `:grails-layout` - and runs the core (`-PonlyCoreTests`) and functional (`-PonlyFunctionalTests`) lanes against it. `--rerun-tasks` ensures the tests execute against the grails-layout classpath rather than reusing SM3-cached outputs.
   
   Triggers: `workflow_dispatch`, weekly `schedule`, and `push`/`pull_request` scoped to the GSP / test-suite / test-example / dependency paths where SM2-vs-SM3 behavior lives.
   
   One caveat worth noting: GitHub only runs `schedule` and `workflow_dispatch` from the repository default branch, so the weekly/manual lane will not fire from an 8.x branch until 8.x is the default (PR and push coverage is unaffected). Remaining open items are `grails.views.layout.enable.nongsp` and an explicit upstream-filter-suppression guard test, both of which can be deferred as follow-ups.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4667738901

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: db817ebd2dde7cf2fde3de7ef5becfb346263e84
   ▢️ Tests:  41010 executed
   βšͺ️ Checks: 43/43 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4685030798

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: 536da4d477c47126c328a9eca644fbf783d22115
   ▢️ Tests:  20505 executed
   βšͺ️ Checks: 43/43 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "matrei (via GitHub)" <gi...@apache.org>.
matrei commented on code in PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#discussion_r3355528925


##########
grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GspLayoutSpec.groovy:
##########
@@ -0,0 +1,72 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.grails.forge.feature.view
+
+import org.grails.forge.ApplicationContextSpec
+import org.grails.forge.BuildBuilder
+import org.grails.forge.application.ApplicationType
+import spock.lang.Unroll
+
+class GspLayoutSpec extends ApplicationContextSpec {
+
+    @Unroll
+    void "web #applicationType apps use SiteMesh 3 (grails-sitemesh3) by default"() {
+        when:
+        final String build = new BuildBuilder(beanContext)
+            .features(["gsp"])

Review Comment:
   Can we align on using single quotes for strings (here and below)?



##########
grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GspLayoutSpec.groovy:
##########
@@ -0,0 +1,72 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.grails.forge.feature.view
+
+import org.grails.forge.ApplicationContextSpec
+import org.grails.forge.BuildBuilder
+import org.grails.forge.application.ApplicationType
+import spock.lang.Unroll
+
+class GspLayoutSpec extends ApplicationContextSpec {
+
+    @Unroll
+    void "web #applicationType apps use SiteMesh 3 (grails-sitemesh3) by default"() {
+        when:
+        final String build = new BuildBuilder(beanContext)
+            .features(["gsp"])
+            .applicationType(applicationType)
+            .render()
+
+        then:
+        build.contains('implementation "org.apache.grails:grails-sitemesh3"')
+        !build.contains('implementation "org.apache.grails:grails-layout"')
+
+        and: "a SNAPSHOT build exposes the SiteMesh 3 snapshot repo so org.sitemesh:*-SNAPSHOT resolves"

Review Comment:
   These assertions will be short-lived



##########
grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/sitemesh3/Sitemesh3.java:
##########
@@ -38,12 +44,18 @@ public String getName() {
 
     @Override
     public String getTitle() {
-        return "Sitemesh 3";
+        return "SiteMesh 3";

Review Comment:
   Should this not align with the SiteMesh 2 title: "GSP SiteMesh 3 Layouts"?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4665960589

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: 692ee12d9fef7ce308a2bd5a9c2efc08cc99f328
   ▢️ Tests:  41414 executed
   βšͺ️ Checks: 43/43 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "jamesfredley (via GitHub)" <gi...@apache.org>.
jamesfredley commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4623123693

   I wish github didn't scroll on tables like that in comments, but there are a number of key features that will need to be added to the sitemesh 3 plugin to match sitemesh 2's historical feature set.  When the tests are all run against sitemesh 3 it will surface most of these, but the comment above should be close to comprehensive.  
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4640397761

   ## 🚨 TestLens detected 1 failed test 🚨
   
   Here is what you can do:
   
   1) Inspect the test failures carefully.
   2) If you are convinced that some of the tests are flaky, you can mute them below.
   3) Finally, trigger a rerun by checking the rerun checkbox.
   
   ### Test Summary
   
   | Check | Project/Task | Test | Runs |
   |---|---|---|---|
   | [CI / Functional Tests \(Java 25, indy\=false\)](https://github.com/apache/grails-core/actions/runs/27073724852/job/79907343098?pr=15713) | :grails-test-examples-app1:integrationTest | LayoutWithTemplateSpec > Test that a layout is not applied to a template rendered by a controller by default | ❌ |
   
   🏷️ Commit: 6178aeb3f9d73b0c8f2eeebb9289915f0c521c54
   ▢️ Tests:  20633 executed
   🟑 Checks: 19/38 completed
   
   ### Test Failures
   
   <details>
   
   <summary><strong>LayoutWithTemplateSpec > Test that a layout is not applied to a template rendered by a controller by default</strong> (:grails-test-examples-app1:integrationTest in <a href="https://github.com/apache/grails-core/actions/runs/27073724852/job/79907343098?pr=15713">CI / Functional Tests (Java 25, indy=false)</a>)</summary>
   
   ```
   Condition failed with Exception:
   
   to(PartialPage)
   |  |
   |  class functionaltests.pages.PartialPage
   geb.waiting.WaitTimeoutException: condition did not pass in 10 seconds (failed with exception)
   	at geb.waiting.Wait.waitFor(Wait.groovy:128)
   	at geb.waiting.PotentiallyWaitingExecutor.execute(PotentiallyWaitingExecutor.groovy:31)
   	at geb.Page.verifyThisPageAtOnly(Page.groovy:424)
   	at geb.Page.getAtVerificationResult(Page.groovy:217)
   	at geb.Page.verifyAt(Page.groovy:188)
   	at geb.Browser.doAt(Browser.groovy:1208)
   	at geb.Browser.at(Browser.groovy:410)
   	at geb.Browser.to(Browser.groovy:566)
   	at geb.Browser.to(Browser.groovy:543)
   	at geb.Browser.to(Browser.groovy:532)
   	at grails.plugin.geb.support.delegate.BrowserDelegate$Trait$Helper.to(BrowserDelegate.groovy:160)
   	at functionaltests.layout.LayoutWithTemplateSpec.Test that a layout is not applied to a template rendered by a controller by default(LayoutWithTemplateSpec.groovy:30)
   Caused by: Assertion failed: 
    
   title == pageTitle
   |     |  |
   |     |  'Welcome to My Partial'
   |     false
   'Welcome to Grails'
    
   	at functionaltests.pages.PartialPage._clinit__closure1(PartialPage.groovy:28)
   	at geb.waiting.Wait.waitFor(Wait.groovy:117)
   	... 11 more
   
   	at functionaltests.layout.LayoutWithTemplateSpec.Test that a layout is not applied to a template rendered by a controller by default(LayoutWithTemplateSpec.groovy:30)
   Caused by: geb.waiting.WaitTimeoutException: condition did not pass in 10 seconds (failed with exception)
   	at geb.waiting.Wait.waitFor(Wait.groovy:128)
   	at geb.waiting.PotentiallyWaitingExecutor.execute(PotentiallyWaitingExecutor.groovy:31)
   	at geb.Page.verifyThisPageAtOnly(Page.groovy:424)
   	at geb.Page.getAtVerificationResult(Page.groovy:217)
   	at geb.Page.verifyAt(Page.groovy:188)
   	at geb.Browser.doAt(Browser.groovy:1208)
   	at geb.Browser.at(Browser.groovy:410)
   	at geb.Browser.to(Browser.groovy:566)
   	at geb.Browser.to(Browser.groovy:543)
   	at geb.Browser.to(Browser.groovy:532)
   	at grails.plugin.geb.support.delegate.BrowserDelegate$Trait$Helper.to(BrowserDelegate.groovy:160)
   	... 1 more
   Caused by: Assertion failed: 
   
   title == pageTitle
   |     |  |
   |     |  'Welcome to My Partial'
   |     false
   'Welcome to Grails'
   
   	at functionaltests.pages.PartialPage._clinit__closure1(PartialPage.groovy:28)
   	at geb.waiting.Wait.waitFor(Wait.groovy:117)
   	... 11 more
   ```
   
   </details>
   
   ### Muted Tests
   > [!NOTE]
   > Checks are currently running using the configuration below.
   
   Select tests to mute in this pull request:
   
   πŸ”² LayoutWithTemplateSpec > Test that a layout is not applied to a template rendered by a controller by default <!-- uniqueId=[engine:spock]/[spec:functionaltests.layout.LayoutWithTemplateSpec]/[feature:$spock_feature_1_0] -->
   
   Reuse successful test results:
   
   πŸ”² ♻️ Only rerun the tests that failed or were muted before
   
   Click the checkbox to trigger a rerun:
   
   πŸ”² **Rerun jobs**
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4636535682

   ## 🚨 TestLens detected 1 failed test 🚨
   
   Here is what you can do:
   
   1) Inspect the test failures carefully.
   2) If you are convinced that some of the tests are flaky, you can mute them below.
   3) Finally, trigger a rerun by checking the rerun checkbox.
   
   ### Test Summary
   
   | Check | Project/Task | Test | Runs |
   |---|---|---|---|
   | [CI / Functional Tests \(Java 25, indy\=false\)](https://github.com/apache/grails-core/actions/runs/27046070256/job/79832186689?pr=15713) | :grails-test-examples-app1:integrationTest | ConditionalOnPropertyFromPluginYmlSpec > conditional beans from plugin.yml properties are all present | ❌ |
   
   🏷️ Commit: 021059d03e411e7e19cc6465ec1fdb0505db607b
   ▢️ Tests:  17649 executed
   🟑 Checks: 18/38 completed
   
   ### Test Failures
   
   <details>
   
   <summary><strong>ConditionalOnPropertyFromPluginYmlSpec > conditional beans from plugin.yml properties are all present</strong> (:grails-test-examples-app1:integrationTest in <a href="https://github.com/apache/grails-core/actions/runs/27046070256/job/79832186689?pr=15713">CI / Functional Tests (Java 25, indy=false)</a>)</summary>
   
   ```
   Condition not satisfied:
   
   $('#loadfirst-present').text() == 'true'
   |                       |      |
   []                      null   false
   
   	at functionaltests.ConditionalOnPropertyFromPluginYmlSpec.conditional beans from plugin.yml properties are all present(ConditionalOnPropertyFromPluginYmlSpec.groovy:48)
   ```
   
   |expected|actual|
   |---|---|
   |<s>true</s>|<b>null</b>|
   
   </details>
   
   ### Muted Tests
   > [!NOTE]
   > Checks are currently running using the configuration below.
   
   Select tests to mute in this pull request:
   
   πŸ”² ConditionalOnPropertyFromPluginYmlSpec > conditional beans from plugin.yml properties are all present <!-- uniqueId=[engine:spock]/[spec:functionaltests.ConditionalOnPropertyFromPluginYmlSpec]/[feature:$spock_feature_1_0] -->
   
   Reuse successful test results:
   
   πŸ”² ♻️ Only rerun the tests that failed or were muted before
   
   Click the checkbox to trigger a rerun:
   
   πŸ”² **Rerun jobs**
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4672440388

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: 51d5e883100e07f012374863d63d3cc55fff709b
   ▢️ Tests:  29071 executed
   βšͺ️ Checks: 43/43 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4626576041

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: a553b4724a2ff1f0ea527110cda8767091dbcc4b
   ▢️ Tests:  25075 executed
   βšͺ️ Checks: 43/43 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4684154605

   ## 🚨 TestLens detected 1 failed test 🚨
   
   Here is what you can do:
   
   1) Inspect the test failures carefully.
   2) If you are convinced that some of the tests are flaky, you can mute them below.
   3) Finally, trigger a rerun by checking the rerun checkbox.
   
   ### Test Summary
   
   | Check | Project/Task | Test | Runs |
   |---|---|---|---|
   | [CI / Functional Tests \(Java 21, indy\=true\)](https://github.com/apache/grails-core/actions/runs/27370166467/job/80880087284?pr=15713) | :grails-test-examples-spring-dependency-management:integrationTest | HelloControllerSpec > the application boots with Spring Dependency Management and serves a request | ❌ |
   
   🏷️ Commit: 5e636fdcd5070df69f507942f605f0e4b9412455
   ▢️ Tests:  24301 executed
   🟑 Checks: 21/38 completed
   
   ### Test Failures
   
   <details>
   
   <summary><strong>HelloControllerSpec > the application boots with Spring Dependency Management and serves a request</strong> (:grails-test-examples-spring-dependency-management:integrationTest in <a href="https://github.com/apache/grails-core/actions/runs/27370166467/job/80880087284?pr=15713">CI / Functional Tests (Java 21, indy=true)</a>)</summary>
   
   ```
   java.lang.IllegalStateException: Failed to load ApplicationContext for [WebMergedContextConfiguration@fafbc63 testClass = springdm.HelloControllerSpec, locations = [], classes = [springdm.Application], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true", "server.port=0"], contextCustomizers = [org.springframework.boot.web.server.context.SpringBootTestRandomPortContextCustomizer@1352434e, org.springframework.boot.test.context.PropertyMappingContextCustomizer@0, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@2dc3271b, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6812fa3a, org.springframework.test.context.support.DynamicPropertiesContextCustomizer@0, org.spockframework.spring.mock.SpockContextCustomizer@0, org.springframework.boot.test.context.Spri
 ngBootTestAnnotation@a8449f6f], resourceBasePath = "src/main/webapp", contextLoader = grails.boot.test.GrailsApplicationContextLoader, parent = null]
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:195)
   	at org.springframework.test.context.cache.DefaultContextCache.put(DefaultContextCache.java:214)
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:160)
   	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:128)
   	at org.spockframework.util.ReflectionUtil.invokeMethod(ReflectionUtil.java:277)
   	at org.spockframework.spring.SpringTestContext.getApplicationContext(SpringTestContext.java:49)
   	at org.spockframework.spring.SpringMockTestExecutionListener.injectSpies(SpringMockTestExecutionListener.java:66)
   	at org.spockframework.spring.SpringMockTestExecutionListener.prepareTestInstance(SpringMockTestExecutionListener.java:62)
   	at org.spockframework.spring.AbstractSpringTestExecutionListener.prepareTestInstance(AbstractSpringTestExecutionListener.java:32)
   	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260)
   	at org.spockframework.spring.SpringTestContextManager.prepareTestInstance(SpringTestContextManager.java:56)
   	at org.spockframework.spring.SpringInterceptor.interceptInitializerMethod(SpringInterceptor.java:46)
   	at org.spockframework.runtime.extension.AbstractMethodInterceptor.intercept(AbstractMethodInterceptor.java:24)
   	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:139)
   	at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:157)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   	at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:157)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'jspViewResolver' is expected to be of type 'org.springframework.context.ApplicationListener' but was actually of type 'org.grails.plugins.sitemesh3.GrailsSiteMeshViewResolver'
   	at org.springframework.beans.factory.support.AbstractBeanFactory.adaptBeanInstance(AbstractBeanFactory.java:418)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:399)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
   	at org.springframework.context.event.AbstractApplicationEventMulticaster.retrieveApplicationListeners(AbstractApplicationEventMulticaster.java:266)
   	at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:222)
   	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:140)
   	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:448)
   	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381)
   	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:1016)
   	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
   	at org.springframework.boot.web.server.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143)
   	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:756)
   	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:445)
   	at org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
   	at grails.boot.GrailsApp.run(GrailsApp.groovy:100)
   	at grails.boot.GrailsApp.run(GrailsApp.groovy:394)
   	at grails.boot.GrailsApp.run(GrailsApp.groovy:383)
   	at springdm.Application.main(Application.groovy:27)
   	at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:281)
   	at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$1(SpringBootContextLoader.java:148)
   	at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.lambda$runMain$0(SpringBootContextLoader.java:593)
   	at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58)
   	at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46)
   	at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1465)
   	at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:600)
   	at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.runMain(SpringBootContextLoader.java:592)
   	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:143)
   	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:114)
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:247)
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.lambda$loadContext$0(DefaultCacheAwareContextLoaderDelegate.java:167)
   	... 17 more
   ```
   
   </details>
   
   ### Muted Tests
   > [!NOTE]
   > Checks are currently running using the configuration below.
   
   Select tests to mute in this pull request:
   
   πŸ”² HelloControllerSpec > the application boots with Spring Dependency Management and serves a request <!-- uniqueId=[engine:spock]/[spec:springdm.HelloControllerSpec]/[feature:$spock_feature_0_0] -->
   
   Reuse successful test results:
   
   πŸ”² ♻️ Only rerun the tests that failed or were muted before
   
   Click the checkbox to trigger a rerun:
   
   πŸ”² **Rerun jobs**
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "codeconsole (via GitHub)" <gi...@apache.org>.
codeconsole commented on code in PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#discussion_r3360720915


##########
grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/sitemesh3/Sitemesh3.java:
##########
@@ -38,12 +44,18 @@ public String getName() {
 
     @Override
     public String getTitle() {
-        return "Sitemesh 3";
+        return "SiteMesh 3";

Review Comment:
   Yes β€” renamed to `GSP SiteMesh 3 Layouts` to match the SiteMesh 2 title.



##########
grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GspLayoutSpec.groovy:
##########
@@ -0,0 +1,72 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.grails.forge.feature.view
+
+import org.grails.forge.ApplicationContextSpec
+import org.grails.forge.BuildBuilder
+import org.grails.forge.application.ApplicationType
+import spock.lang.Unroll
+
+class GspLayoutSpec extends ApplicationContextSpec {
+
+    @Unroll
+    void "web #applicationType apps use SiteMesh 3 (grails-sitemesh3) by default"() {
+        when:
+        final String build = new BuildBuilder(beanContext)
+            .features(["gsp"])

Review Comment:
   Done β€” converted the spec to single-quoted strings throughout.



##########
grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/GspLayoutSpec.groovy:
##########
@@ -0,0 +1,72 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.grails.forge.feature.view
+
+import org.grails.forge.ApplicationContextSpec
+import org.grails.forge.BuildBuilder
+import org.grails.forge.application.ApplicationType
+import spock.lang.Unroll
+
+class GspLayoutSpec extends ApplicationContextSpec {
+
+    @Unroll
+    void "web #applicationType apps use SiteMesh 3 (grails-sitemesh3) by default"() {
+        when:
+        final String build = new BuildBuilder(beanContext)
+            .features(["gsp"])
+            .applicationType(applicationType)
+            .render()
+
+        then:
+        build.contains('implementation "org.apache.grails:grails-sitemesh3"')
+        !build.contains('implementation "org.apache.grails:grails-layout"')
+
+        and: "a SNAPSHOT build exposes the SiteMesh 3 snapshot repo so org.sitemesh:*-SNAPSHOT resolves"

Review Comment:
   Agreed β€” dropped the SNAPSHOT-repo assertions; the spec now only verifies the resolved layout dependency.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4683615714

   ## 🚨 TestLens detected 5 failed tests 🚨
   
   Here is what you can do:
   
   1) Inspect the test failures carefully.
   2) If you are convinced that some of the tests are flaky, you can mute them below.
   3) Finally, trigger a rerun by checking the rerun checkbox.
   
   ### Test Summary
   
   | Check | Project/Task | Test | Runs |
   |---|---|---|---|
   | [CI / Functional Tests \(Java 21, indy\=true\)](https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713) | :grails-test-examples-demo33:test | ApplyTemplateWithoutReferringToTagLibPropertySpec | ❌ |
   | [CI / Functional Tests \(Java 21, indy\=true\)](https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713) | :grails-test-examples-app1:test | BookControllerSpec | ❌ |
   | [CI / Functional Tests \(Java 21, indy\=true\)](https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713) | :grails-test-examples-app1:test | BookInterceptorSpec | ❌ |
   | [CI / Functional Tests \(Java 21, indy\=true\)](https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713) | :grails-test-examples-app1:test | ConfigSpec | ❌ |
   | [CI / Functional Tests \(Java 21, indy\=true\)](https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713) | :grails-test-examples-app1:test | UriMatchingInterceptorSpec | ❌ |
   
   🏷️ Commit: c7a29df896b9886333e1702ec9dd688fb5a89211
   ▢️ Tests:  9275 executed
   🟑 Checks: 16/38 completed
   
   ### Test Failures
   
   <details>
   
   <summary><strong>ApplyTemplateWithoutReferringToTagLibPropertySpec</strong> (:grails-test-examples-demo33:test in <a href="https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713">CI / Functional Tests (Java 21, indy=true)</a>)</summary>
   
   ```
   org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jspViewResolver': No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)
   	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1225)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1191)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121)
   	at org.grails.testing.GrailsUnitTest$Trait$Helper.defineBeans(GrailsUnitTest.groovy:107)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.setup(WebSetupSpecInterceptor.groovy:79)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.intercept(WebSetupSpecInterceptor.groovy:66)
   	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:139)
   	at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:157)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:971)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1369)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
   	at org.sitemesh.webmvc.SiteMeshViewResolverBeanPostProcessor.postProcessAfterInitialization(SiteMeshViewResolverBeanPostProcessor.java:109)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:442)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1818)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:603)
   	... 14 more
   ```
   
   </details>
   <details>
   
   <summary><strong>BookControllerSpec</strong> (:grails-test-examples-app1:test in <a href="https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713">CI / Functional Tests (Java 21, indy=true)</a>)</summary>
   
   ```
   org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jspViewResolver': No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)
   	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1225)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1191)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121)
   	at org.grails.testing.GrailsUnitTest$Trait$Helper.defineBeans(GrailsUnitTest.groovy:107)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.setup(WebSetupSpecInterceptor.groovy:79)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.intercept(WebSetupSpecInterceptor.groovy:66)
   	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:139)
   	at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:157)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:971)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1369)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
   	at org.sitemesh.webmvc.SiteMeshViewResolverBeanPostProcessor.postProcessAfterInitialization(SiteMeshViewResolverBeanPostProcessor.java:109)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:442)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1818)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:603)
   	... 14 more
   ```
   
   </details>
   <details>
   
   <summary><strong>BookInterceptorSpec</strong> (:grails-test-examples-app1:test in <a href="https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713">CI / Functional Tests (Java 21, indy=true)</a>)</summary>
   
   ```
   org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jspViewResolver': No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)
   	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1225)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1191)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121)
   	at org.grails.testing.GrailsUnitTest$Trait$Helper.defineBeans(GrailsUnitTest.groovy:107)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.setup(WebSetupSpecInterceptor.groovy:79)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.intercept(WebSetupSpecInterceptor.groovy:66)
   	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:139)
   	at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:157)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:971)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1369)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
   	at org.sitemesh.webmvc.SiteMeshViewResolverBeanPostProcessor.postProcessAfterInitialization(SiteMeshViewResolverBeanPostProcessor.java:109)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:442)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1818)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:603)
   	... 14 more
   ```
   
   </details>
   <details>
   
   <summary><strong>ConfigSpec</strong> (:grails-test-examples-app1:test in <a href="https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713">CI / Functional Tests (Java 21, indy=true)</a>)</summary>
   
   ```
   org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jspViewResolver': No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)
   	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1225)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1191)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121)
   	at org.grails.testing.GrailsUnitTest$Trait$Helper.defineBeans(GrailsUnitTest.groovy:107)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.setup(WebSetupSpecInterceptor.groovy:79)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.intercept(WebSetupSpecInterceptor.groovy:66)
   	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:139)
   	at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:157)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:971)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1369)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
   	at org.sitemesh.webmvc.SiteMeshViewResolverBeanPostProcessor.postProcessAfterInitialization(SiteMeshViewResolverBeanPostProcessor.java:109)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:442)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1818)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:603)
   	... 14 more
   ```
   
   </details>
   <details>
   
   <summary><strong>UriMatchingInterceptorSpec</strong> (:grails-test-examples-app1:test in <a href="https://github.com/apache/grails-core/actions/runs/27366667302/job/80867896657?pr=15713">CI / Functional Tests (Java 21, indy=true)</a>)</summary>
   
   ```
   org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jspViewResolver': No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)
   	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1225)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1191)
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121)
   	at org.grails.testing.GrailsUnitTest$Trait$Helper.defineBeans(GrailsUnitTest.groovy:107)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.setup(WebSetupSpecInterceptor.groovy:79)
   	at org.grails.testing.spock.WebSetupSpecInterceptor.intercept(WebSetupSpecInterceptor.groovy:66)
   	at org.spockframework.runtime.extension.MethodInvocation.proceed(MethodInvocation.java:139)
   	at org.spockframework.runtime.model.MethodInfo.invoke(MethodInfo.java:157)
   	at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
   Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'contentProcessor' available
   	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:971)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1369)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
   	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
   	at org.sitemesh.webmvc.SiteMeshViewResolverBeanPostProcessor.postProcessAfterInitialization(SiteMeshViewResolverBeanPostProcessor.java:109)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:442)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1818)
   	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:603)
   	... 14 more
   ```
   
   </details>
   
   ### Muted Tests
   > [!NOTE]
   > Checks are currently running using the configuration below.
   
   Select tests to mute in this pull request:
   
   πŸ”² ApplyTemplateWithoutReferringToTagLibPropertySpec <!-- uniqueId=[engine:spock]/[spec:demo.ApplyTemplateWithoutReferringToTagLibPropertySpec] -->
   πŸ”² BookControllerSpec <!-- uniqueId=[engine:spock]/[spec:functionaltests.BookControllerSpec] -->
   πŸ”² BookInterceptorSpec <!-- uniqueId=[engine:spock]/[spec:functionaltests.BookInterceptorSpec] -->
   πŸ”² ConfigSpec <!-- uniqueId=[engine:spock]/[spec:functionaltests.ConfigSpec] -->
   πŸ”² UriMatchingInterceptorSpec <!-- uniqueId=[engine:spock]/[spec:demo.UriMatchingInterceptorSpec] -->
   
   Reuse successful test results:
   
   πŸ”² ♻️ Only rerun the tests that failed or were muted before
   
   Click the checkbox to trigger a rerun:
   
   πŸ”² **Rerun jobs**
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4607460381

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: b0e0990395e5def7766381514412abab6cd9c6f2
   ▢️ Tests:  37498 executed
   βšͺ️ Checks: 35/35 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] 8.x Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "codeconsole (via GitHub)" <gi...@apache.org>.
codeconsole merged PR #15713:
URL: https://github.com/apache/grails-core/pull/15713


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "codeconsole (via GitHub)" <gi...@apache.org>.
codeconsole commented on code in PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#discussion_r3384767261


##########
.github/workflows/gradle.yml:
##########
@@ -24,6 +24,11 @@ on:
 concurrency:
   group: ${{ github.workflow }}-${{ github.ref }}
   cancel-in-progress: ${{ github.event_name == 'pull_request' }}
+# Exercise SiteMesh 3 by default in the test apps. The example/suite builds read this
+# flag to choose grails-sitemesh3 over the legacy grails-layout; unset it (or set it to
+# anything other than 'true') to fall back to SiteMesh 2.
+env:
+  SITEMESH3_TESTING_ENABLED: 'true'

Review Comment:
   flipped



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4674934420

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: 6e83b250f1c43a14787dd4d9f5edea757a52b394
   ▢️ Tests:  38124 executed
   βšͺ️ Checks: 43/43 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] 8.x Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "jdaugherty (via GitHub)" <gi...@apache.org>.
jdaugherty commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4731999452

   I confirmed with forge locally that selecting sitemesh2 does what's expected: 
   
   <img width="1365" height="686" alt="image" src="https://github.com/user-attachments/assets/aa5dfda2-bcef-472c-9261-8ccb610a5670" />
   
   Otherwise, it uses sitemesh3 by default.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "codecov[bot] (via GitHub)" <gi...@apache.org>.
codecov[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4614839961

   ## [Codecov](https://app.codecov.io/gh/apache/grails-core/pull/15713?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) Report
   :white_check_mark: All modified and coverable lines are covered by tests.
   :white_check_mark: Project coverage is 48.9968%. Comparing base ([`4836003`](https://app.codecov.io/gh/apache/grails-core/commit/483600313de1cbc3bd71beacabd181de896a4d59?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)) to head ([`9784068`](https://app.codecov.io/gh/apache/grails-core/commit/97840681ee21d06b62fec89d0bb01b60a52e606c?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
   
   <details><summary>Additional details and impacted files</summary>
   
   
   
   [![Impacted file tree graph](https://app.codecov.io/gh/apache/grails-core/pull/15713/graphs/tree.svg?width=650&height=150&src=pr&token=qJrryhpk7u&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)](https://app.codecov.io/gh/apache/grails-core/pull/15713?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   
   ```diff
   @@                Coverage Diff                 @@
   ##                8.0.x     #15713        +/-   ##
   ==================================================
   - Coverage     49.0042%   48.9968%   -0.0074%     
   + Complexity      16759      16755         -4     
   ==================================================
     Files            2014       2014                
     Lines           94747      94747                
     Branches        16547      16547                
   ==================================================
   - Hits            46430      46423         -7     
   - Misses          41019      41024         +5     
   - Partials         7298       7300         +2     
   ```
   [see 4 files with indirect coverage changes](https://app.codecov.io/gh/apache/grails-core/pull/15713/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)
   </details>
   <details><summary> :rocket: New features to boost your workflow: </summary>
   
   - :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
   - :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "codeconsole (via GitHub)" <gi...@apache.org>.
codeconsole commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4628724477

   @matrei good catch on the glitch. Root cause: `sitemesh3` (an invisible default) and `grails-layout` (a selectable feature) were an unbound one-of pair, so `/features/default` kept returning `sitemesh3` even after `grails-layout` was selected β€” hence both showing.
   
   Fixed by modeling the choice as a single `GspLayoutImpl` option (`SITEMESH3` default / `GRAILS_LAYOUT`), the same pattern as the servlet and reloading groups: both decorators are now invisible, option-driven defaults, so exactly one ever resolves. The option is threaded through `Options`/`FeatureFilter`/`ContextFactory`, exposed via `/select-options` (`gspLayout`), and added as a `--gsp-layout` CLI flag.
   
   This needs a companion SiteMesh-version dropdown in `grails-forge-ui` to drive the new `gspLayout` option (the old `grails-layout` feature card goes away).


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "matrei (via GitHub)" <gi...@apache.org>.
matrei commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4661431093

   I think the Forge change actually made it worse, because now I cannot select `grails-layout` at all:
   
   <img width="520" height="353" alt="Screenshot from 2026-06-09 17-37-55" src="https://github.com/user-attachments/assets/a9fbae45-9766-440c-b1a2-b522d40e609b" />
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "jamesfredley (via GitHub)" <gi...@apache.org>.
jamesfredley commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4674291612

   I re-checked the current PR head (`bb94c8c27d`) against the earlier SM2 parity list. A few items look addressed now, but these still look partial or unresolved:
   
   | Item | Status | Notes |
   | --- | --- | --- |
   | `g:applyLayout` attribute parity | Partial | `RenderSitemeshTagLib.groovy:78` now handles body, `name`, and `params` (`:112`, `:122`), but still does not support the SM2 attribute surface: `template`, `url`, `action`, `controller`, `model`, `contentType`, `encoding`, or `parse`. |
   | Default layout config + implicit `application` fallback | Unresolved | SM3 still reads only `grails.sitemesh.default.layout` (`Sitemesh3GrailsPlugin.groovy:83`) and passes `null` when unset (`:102`). It does not consult `grails.views.layout.default`, and does not match SM2's implicit `application` fallback behavior (`GroovyPageLayoutFinder.groovy:180`). |
   | `grails.views.layout.enable.nongsp` | Unresolved | SM2 wires this through `LayoutGrailsPlugin.groovy:38` and `GroovyPageLayoutFinder.groovy:87`. I do not see an SM3 equivalent in `Sitemesh3LayoutFinder.java`, which still only resolves via the GSP locator. |
   | `<title>` stripping robustness | Unresolved | `Sitemesh3CapturedPage.java:232` still searches for `"<title"` without checking the tag boundary, so cases like `<titlebar>` / `<title-x>` can still be misidentified before the real `</title>` is found. |
   | Upstream auto-config suppression guard | Partial | There is improved view-resolver auto-config (`Sitemesh3AutoConfiguration.java:38`), but the plugin still relies on a disabled bean named `sitemesh` with `NoopSitemeshFilter` (`Sitemesh3GrailsPlugin.groovy:112`, `:125`). I do not see a guard test proving the upstream filter auto-config stays suppressed. |
   | Test examples default path | Partial | Most examples now default to SM3 via `SITEMESH2_TESTING_ENABLED`, but the Hibernate 7 examples still use the old/inverted `SITEMESH3_TESTING_ENABLED` toggle and therefore default to SM2 when unset, e.g. `grails-test-examples/hibernate7/grails-hibernate/build.gradle:41`. |
   | SM2-only examples without SM3 coverage | Partial | `database-cleanup`, `scaffolding-fields`, and `test-phases` were fixed, but `scaffolding` and `jetty` remain hardcoded to `grails-layout` only (`scaffolding/build.gradle:49`, `jetty/build.gradle:41`). `gsp-layout` can probably remain the intentional SM2 anchor. |
   | CI coverage for SM2 lane | Unresolved | I do not see `SITEMESH2_TESTING_ENABLED` or `SITEMESH3_TESTING_ENABLED` in `.github/workflows`. The default SM3 path is exercised, but there is no explicit SM2 compatibility lane. |
   | `grails-gsp-spring-boot` publication | Unresolved | The project is included in `settings.gradle:175` and depends on `grails-sitemesh3` (`grails-gsp/spring-boot/build.gradle:37`), but it is still absent from the published projects list in `gradle/publish-root-config.gradle` while `grails-sitemesh3` is listed at `:76`. |


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4616106973

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: 97840681ee21d06b62fec89d0bb01b60a52e606c
   ▢️ Tests:  20430 executed
   βšͺ️ Checks: 40/40 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] 8.x Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4723739570

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: cb6edf763057105cea191b50958e6729f293e9d2
   ▢️ Tests:  21733 executed
   βšͺ️ Checks: 43/43 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "codeconsole (via GitHub)" <gi...@apache.org>.
codeconsole commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4637462946

   https://github.com/apache/grails-core/pull/15585


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] 8.x Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4734248032

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: d7667d5be296f5b9d6ef0fa7751aaf3897e654fd
   ▢️ Tests:  37285 executed
   βšͺ️ Checks: 46/46 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] 8.x Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "jdaugherty (via GitHub)" <gi...@apache.org>.
jdaugherty commented on code in PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#discussion_r3428652771


##########
grails-gsp/grails-sitemesh3/src/main/groovy/org/grails/plugins/web/taglib/RenderSitemeshTagLib.groovy:
##########
@@ -76,27 +110,130 @@ class RenderSitemeshTagLib implements TagLibrary {
     // causing "request is not active anymore" errors.
     Closure applyLayout = { Map attrs, body ->

Review Comment:
   To make this faster, you should use the method version instead of closure.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "jamesfredley (via GitHub)" <gi...@apache.org>.
jamesfredley commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4615532118

   Gaps to review and potentially address before SM3 becomes default
   
   #
   
   | Gap / Open item | SM2 / Current state | SM3 / Needed |
   | --- | --- | --- |
   | `g:applyLayout` attributes (`template`,`url`,`action`,`controller`,`params`,`model`,`contentType`,`encoding`,`parse`) | Full support - `RenderGrailsLayoutTagLib.groovy:100-173` | `name` + body only; other attrs silently ignored - `RenderSitemeshTagLib.groovy:77-106` |
   | Default-layout config + implicit `application` fallback | Reads `grails.views.layout.default` (`LayoutGrailsPlugin:37`); falls back to layout `application` (`GroovyPageLayoutFinder:180`) | Reads only `grails.sitemesh.default.layout` (`Sitemesh3GrailsPlugin:83`); no `application` fallback |
   | Partial/template render suppression (`GrailsRenderViewMutator` + `GrailsLayoutSelector`) | Registers both (`LayoutGrailsPlugin:74-75`); consumed by core `ResponseRenderer:340-341,563` | Registers neither β†’ beans null β†’ behavior lost |
   | `grails.views.layout.enable.nongsp` (non-GSP/JSP layouts) | `LayoutGrailsPlugin:38` + `GroovyPageLayoutFinder` `enableNonGspViews`/`viewMustExist` | `Sitemesh3LayoutFinder:192-194` GSP locator only; flag unsupported |
   | Captured-page isolation across nested/sibling `applyLayout` | N/A (different mechanism) | `GrailsSiteMeshViewContext.dispatch:81` sets fresh page, no restore; taglib saves only `LAYOUT_ATTRIBUTE` (`RenderSitemeshTagLib:78,100-104`) |
   | No-body captured page + `layoutBody` | Handled | `CaptureAwareContentProcessor:82` returns used page without data; `layoutBody` reads only `body` (`RenderSitemeshTagLib:218-225`) |
   | `<title>` strip robustness | Regex-based, well-formed | `extractHead()` matches `"<title"` as prefix - mis-slices `<titlebar>`/`<title-x>` (`Sitemesh3CapturedPage.java:232`) |
   | Aggregate web starter still defaults to SM2 | `starter-web/build.gradle:53` β†’ `:grails-layout` unless `SITEMESH3_TESTING_ENABLED=true` | Default branch must be `:grails-sitemesh3` |
   | ~35 test examples default to SM2 | `else β†’ grails-layout` in every example (e.g. `app1/build.gradle:42-47`) | Default = SM3; SM2 via forced lane |
   | Main unit suite defaults to SM2 | `grails-test-suite-uber/build.gradle:53-58` β†’ `:grails-layout` | Default = SM3 |
   | SM2-only examples with **no** SM3 coverage | Hardcoded `grails-layout`: `test-phases:42`, `scaffolding:49`, `scaffolding-fields:38`, `jetty:41`, `database-cleanup:37`, `gsp-layout:50` | Keep as SM2 anchors; add SM3 variants where parity matters |
   | Default path β‰  tested path | `SITEMESH3_TESTING_ENABLED` gates SM3; default build never runs SM3 | Retire/invert flag so default == tested |
   | No CI lane exercising SM3 as default | Only opt-in env runs SM3 | Add SM3-default lane + SM2 lane |
   | Fragile upstream auto-config suppression | Disabled `NoopSitemeshFilter` named `sitemesh` suppresses upstream `SiteMeshAutoConfiguration` (`Sitemesh3GrailsPlugin:106-124`) | Robust suppression + guard test |
   | Servlet 6.1 / Tomcat 11 forward→include dispatch | SM3 bypasses `RequestDispatcher.forward()` for absolute layout paths (`GrailsSiteMeshViewContext.java:88-93`) | Functional coverage on Tomcat 11 |
   | `grails-gsp-spring-boot` unpublished | In `settings.gradle:174`, depends on SM3 (`spring-boot/build.gradle:37`), but absent from `publish-root-config.gradle` (only `grails-sitemesh3` at `:75`) | Publish or don't rely on it |
   
   ## Not gaps (verified parity)
   
   Resolution order (6 steps), `NONE_LAYOUT`, `layoutTitle`/`layoutHead`, `pageProperty`/`ifPageProperty`, meta extraction, `body.*` attrs, `grailsLayout:parameter`, comma/chained decoration (happy path), unbounded layout cache (SM2 identical).
   
   ## Minor / cosmetic
   
   Cache-interval key differs: SM3 `grails.sitemesh.layout.cache.interval` vs SM2 `grails.gsp.reload.interval`.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4640805790

   ## βœ… All tests passed βœ…
   
   🏷️ Commit: 8a1fbcbcd1e643c302d3f6c465fc69c9c6ab1d25
   ▢️ Tests:  31826 executed
   βšͺ️ Checks: 43/43 completed
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] Make SiteMesh 3 the default GSP layout [grails-core]

Posted by "testlens-app[bot] (via GitHub)" <gi...@apache.org>.
testlens-app[bot] commented on PR #15713:
URL: https://github.com/apache/grails-core/pull/15713#issuecomment-4635215419

   ## 🚨 TestLens detected 1 failed test 🚨
   
   Here is what you can do:
   
   1) Inspect the test failures carefully.
   2) If you are convinced that some of the tests are flaky, you can mute them below.
   3) Finally, trigger a rerun by checking the rerun checkbox.
   
   ### Test Summary
   
   | Check | Project/Task | Test | Runs |
   |---|---|---|---|
   | [CI / Functional Tests \(Java 21, indy\=true\)](https://github.com/apache/grails-core/actions/runs/27037024519/job/79803490336?pr=15713) | :grails-test-examples-app1:integrationTest | ConditionalOnPropertyFromPluginYmlSpec > conditional beans from plugin.yml properties are all present | ❌ |
   
   🏷️ Commit: f8162468cf84cf93751a954472090b218be84452
   ▢️ Tests:  17087 executed
   🟑 Checks: 18/38 completed
   
   ### Test Failures
   
   <details>
   
   <summary><strong>ConditionalOnPropertyFromPluginYmlSpec > conditional beans from plugin.yml properties are all present</strong> (:grails-test-examples-app1:integrationTest in <a href="https://github.com/apache/grails-core/actions/runs/27037024519/job/79803490336?pr=15713">CI / Functional Tests (Java 21, indy=true)</a>)</summary>
   
   ```
   Condition not satisfied:
   
   $('#loadfirst-present').text() == 'true'
   |                       |      |
   []                      null   false
   
   	at functionaltests.ConditionalOnPropertyFromPluginYmlSpec.conditional beans from plugin.yml properties are all present(ConditionalOnPropertyFromPluginYmlSpec.groovy:48)
   ```
   
   |expected|actual|
   |---|---|
   |<s>true</s>|<b>null</b>|
   
   </details>
   
   ### Muted Tests
   > [!NOTE]
   > Checks are currently running using the configuration below.
   
   Select tests to mute in this pull request:
   
   πŸ”² ConditionalOnPropertyFromPluginYmlSpec > conditional beans from plugin.yml properties are all present <!-- uniqueId=[engine:spock]/[spec:functionaltests.ConditionalOnPropertyFromPluginYmlSpec]/[feature:$spock_feature_1_0] -->
   
   Reuse successful test results:
   
   πŸ”² ♻️ Only rerun the tests that failed or were muted before
   
   Click the checkbox to trigger a rerun:
   
   πŸ”² **Rerun jobs**
   
   ---
   _Learn more about TestLens at [testlens.app](https://testlens.app)._
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@grails.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org