Skip to content

Merge 8.1.x into 9.0.x - #16277

Open
jamesfredley wants to merge 1224 commits into
9.0.xfrom
merge/8.1.x-into-9.0.x
Open

Merge 8.1.x into 9.0.x#16277
jamesfredley wants to merge 1224 commits into
9.0.xfrom
merge/8.1.x-into-9.0.x

Conversation

@jamesfredley

Copy link
Copy Markdown
Contributor

Description

Merge current 8.1.x (including the 8.0.x line from #16276) into 9.0.x.

This brings the Forge Gradle 9 Shadow 8.3.11 pin and other already-landed 8.0/8.1 work onto the Groovy 6 line.

Conflict handling kept 9.0-specific Groovy 6 pins and the functional hanging-cell CI workaround, while restoring 8.1 CAS/Neo4j jobs, MongoDB driver-family BOM constraints, and the Neo4j BOM custom versions.

Local Forge validation from grails-forge/:

  • :grails-forge-web-netty:shadowDistTar and :grails-forge-web-netty:awsElasticBeanstalk succeeded
  • AWS zip contains app.jar, Procfile, start.sh, and .platform/nginx/conf.d/proxy.conf
  • Nested Main-Class: org.grails.forge.netty.Application

Contributor Checklist

Issue and Scope

  • This PR is linked to an existing issue that has been acknowledged or approved by the project team. If no approved issue exists, please give background on why this change is necessary. Tickets are preferred for release change log history.
  • This PR addresses the complete scope of the linked issue. Partial implementations or unfinished work should not be submitted for review.
  • This PR contains a single, focused change. Unrelated changes should be submitted as separate pull requests.
  • This PR targets the correct branch for the type of change:
    • Patch release branches (e.g., 7.0.x): Bug fixes only. No new features or API changes.
    • Minor release branches (e.g., 7.1.x): New features are welcome, but breaking existing APIs must be avoided.
    • Major release branches (e.g., 8.0.x): Reserved for major changes. Breaking API changes are permitted.

Code Quality

  • I have added or updated tests that cover the changes introduced in this PR. All code contributions are expected to include appropriate test coverage.
  • I have verified that all existing tests pass by running ./gradlew build --rerun-tasks.
  • My code follows the project's code style guidelines. I have run ./gradlew codeStyle and resolved any violations. See Code Style for details.
  • This PR does not include mass reformatting, style-only changes, or large-scale refactoring unless it was explicitly approved in the linked issue. Unsolicited reformatting will not be accepted.
  • If generative AI tooling was used in preparing this contribution, a quality model was used to ensure contributions are consistent with the project's quality standards.

Licensing and Attribution

Documentation

  • If this PR introduces user-facing changes, I have included or updated the relevant documentation.
  • If this PR adds a new feature, I have updated the What's New section of the Grails Guide.
  • If this PR introduces breaking changes or changes that require user action during an upgrade, I have updated the Upgrade Notes for the corresponding version in the Grails Guide.
  • The PR description clearly explains what was changed and why.

Generative AI (Cursor Grok 4.6) was used to complete the merge, resolve conflicts, and run validation. Oracle reviewed the shipping diff as GREEN; Codex found no blocking regressions in the conflict resolutions.

codeconsole and others added 30 commits August 20, 2026 09:02
The rewrite decides whether a class can call tags by looking for the trait
that gives it the ability. Ordering that after trait injection by priority
holds only among transforms that declare one, and a trait can arrive from a
local transform, which is applied after every global transform has run. A
controller compiled from the conventional directory was read after it carried
the trait; the same source compiled from elsewhere was read before. Which of
the two happened for a given class also varied by platform, so the rewrite
was applied on macOS and skipped on Linux for the same controller.

Reading the class in a later phase makes the question decidable: every trait
has been applied by then, whichever transform supplied it. The priority stays
as a second guarantee for anything ordered within the phase.

This also removes the limitation the rewrite carried, that a controller
declared by annotation outside grails-app/controllers kept the dispatched
call rather than the direct one. Its test now pins the rewrite instead of the
limitation, and a new one pins the phase the correctness now rests on.
The case was asked for in review and dropped as platform-dependent, on the
reading that recognising a controller by its location turns on where the
compilation happens. That reading was wrong: the trait assertion holds on
every platform, so the injector does recognise a controller compiled into a
temporary directory. What varied was the rewrite, for the reason the previous
commit fixed.

This is the shape that carried the bug, so it is worth a test that runs in a
second rather than only a functional one that needs a whole build.
The index describes what a tag library declares when it is compiled, which is
not what a running application registers: a plugin can be excluded, a tag
library can be named in nonEnhancedTagLibClasses, and a unit test can mock
some tag libraries and not others. A call resolved against the index reached
TagOutput directly and raised GrailsTagException there, where the same call
dispatched dynamically raised MissingMethodException. Code catching that
around a tag call, or probing with respondsTo, saw the difference.

An unregistered tag now goes back through the namespace dispatcher, which is
the dispatch the call would have had. That reports what it always reported,
including the type it names, rather than a second copy of the rule here.
…an-object-type-8.0.x

BUGFIX:  message bundles silently failing to resolve in development
…-state

Fix flaky grails-views-gson tests caused by shared static test state
The Gradle flag had a test that it reaches a forked JVM, and the compiler had
tests that a page compiles, but nothing ran an application whose pages were
compiled statically and rendered them. This adds one: a build that sets
grails.compileStatic.gsp, pages that read a declared model, the names the
framework binds, a typed local and a tag library in its own namespace, and an
integration test that renders each through a running server.

Rendering correctly is not on its own evidence, since a page renders the same
either way, so the class each page compiled to is checked as well. The pages
that declare a model are separated from the one that declares nothing: a model
directive implies static compilation on its own, and only the page without one
answers whether the build setting did anything.
…tests

The CAS plugin had no tests at all, and its only exerciser was a bootRun-only
demo pointed at a hand-run CAS server. Two defects were living in that gap.

Fixes:

* casAuthenticationFilter set proxyReceptorUrl unconditionally. Spring Security
  7.1 rejects a null pattern, so an application that did not configure a proxy
  receptor - the default - failed to start. It is now only set when configured,
  which is how CasAuthenticationFilter expresses that proxy support is off.
  Previously the unguarded assignment produced a matcher for the literal path
  '/**null', quietly giving unconfigured applications a live proxy receptor.

* Single sign-out never worked. The plugin set useSessionFixationPrevention to
  false from doWithSpring, but it declares loadAfter = ['springSecurityCore'],
  so the core plugin had already defined sessionAuthenticationStrategy from the
  original value. The session was still replaced on login, so CAS logout
  requests matched no session. The bean is now redefined from the CAS plugin as
  well, through the same BeanTypeResolver the core plugin uses so an
  application's sessionAuthenticationStrategyBeanClass override still wins.

Behaviour change:

* cas.useSingleSignout now defaults to false. Enabling it disables session
  fixation prevention, which an application should choose deliberately rather
  than inherit. The plugin warns at startup when it is enabled. Documented in
  the CAS configuration reference and in the Grails 8 upgrade guide.

Tests:

grails-test-examples-spring-security-cas-test1 now runs against a real Apereo
CAS server started with Testcontainers, gated on Docker availability, and no
longer needs an externally managed CAS server for bootRun either. An
EnvironmentPostProcessor starts the container and supplies the CAS URLs before
the context is built; the service and proxy callback URLs, which depend on the
port the embedded server binds, are set once the server is up.

Three configurations run via the existing TESTCONFIG idiom: 'cas' (proxy
settings unset), 'casProxy' (full proxy-granting-ticket round trip) and
'casNoSingleSignout' (asserts the new default). Coverage spans the login
handshake, ticket validation, role enforcement, proxy tickets obtained through
AttributePrincipal, and single sign-out. Logout requests are posted from a
cookie-less client, as CAS does, so the filter's behaviour cannot be confused
with the session clearing that a failed authentication would cause anyway.

Also fixes an unrelated pre-existing gap: 'Grails BOM Hibernate7 Micronaut.adoc'
is generated and gitignored but was missing from the rat exclusions, so rat
failed after any docs build.
…n metadata

* README: drop two leftover lines from the previous text that survived the
  rewrite, and correct "two configurations" now that there are three.

* Stop running a CAS configuration twice. The specs defaulted to the 'cas'
  configuration when TESTCONFIG was unset, so the broad 'security' job ran it
  in each of its matrix entries on top of the dedicated casSecurityConfig job.
  They now require a configuration to be selected, matching the core
  functional-test-app precedent, so 'security' skips them and each
  configuration runs exactly once. bootRun still needs no TESTCONFIG.

* Plugin metadata: the plugin uses org.apereo.cas.client, so call it Apereo
  rather than Jasig, in the plugin title/description and in the guide, where
  three dead jasig.org links are repointed at apereo.github.io. Bump
  grailsVersion and repoint organization, issueManagement and scm at
  apache/grails-core, matching the convention used elsewhere on this branch.
* Drop the author metadata, per ASF policy.

* Restore log.warn alongside the println for the single signout warning, as
  SpringSecurityCoreGrailsPlugin does. The @slf4j annotation was otherwise
  unused, and an application that captures logs but not stdout would never see
  the warning the docs promise. Trim a whitespace-only line.

* Update the "Single Signout" section of the CAS guide, which still said the
  feature was enabled by default and only documented turning it off.

* Renumber the upgrade-guide section to 48; sections 45 to 47 landed upstream
  while this was open, leaving two sections numbered 46.

* Give the CAS requests in the specs a per-request timeout. Only a connect
  timeout was set, so a container that accepted the connection but never
  answered would block send() indefinitely and hang the job until the CI
  runner killed it.

* Forward TESTCONFIG and casContainerVersion to bootRun, which forks its own
  JVM and so never saw them. /secure/proxyStatus could therefore only ever
  report NO_PROXY_TICKET when running the app by hand. Documented in the
  README, and verified that bootRun -DTESTCONFIG=casProxy now yields a real
  proxy ticket.

* Reuse the base class's execution-token extraction in CasLoginSpec instead of
  duplicating it without its null guard, which turned a missing token into an
  opaque NPE inside URLEncoder.encode.

* Correct the CasSingleSignOutSpec class comment, stale since single signout
  became opt-in.

* Reindent SecureController with spaces to match .editorconfig.
Reusing the assignment form for a name already typed was tracked in one flat
set for the whole page, which is not what a block scope is. Two sibling
blocks are two scopes, so a name typed in each was declared in the first and
assigned in the second, where nothing had declared it: it resolved through
the page's setProperty and lost its type, and reading it reported that the
type was not known.

The names are held one frame per emitted block now. A name an enclosing frame
declared is assigned to, which is what the same-scope case needs, and a name
only a sibling declared is declared again, which is what that case needs.

Also reports strictness as false while pages are not compiled statically, so
that toggling it does not invalidate a task whose output cannot change, and
drops a comment left above an empty block when its dependencies moved to
testImplementation.
The views and the configuration went in without one, which the RAT audit
reports. The pages carry it as a GSP comment, so it is not rendered, and it
sits ahead of the model directive without displacing it.
Class.cast accepts only what is already an instance, so every conversion
Groovy would have made was rejected -- and rejected at render, after the page
had compiled. A long or a double declared from an integer literal, a String
from a GString, all of them threw. Casting through the wrapper had narrowed
that to exact boxing rather than removed it. Both tags emit a Groovy cast
now, which is what the framework-supplied accessors in this branch already
emitted, and the tests that passed were the shapes Class.cast happened to
accept, so they say what they mean now.

A g:def value mixing text and an expression emitted source that did not
parse: the attribute is a GString, and only a lone expression is Groovy on
its own. It is quoted where it is neither that nor plain text, which leaves
naming a variable untouched.

Also points the page compilers at the option object rather than at a provider
reaching through the project, which put the project behind a task input, and
moves a javadoc block onto the method it describes.
The type attribute was not in the guide at all, though the error a page gets
tells the reader to use it -- "give it a type where it is introduced" -- and
led to a section that did not mention it. It is described there now, beside
g:def, and listed on the set tag's reference page with the restriction that
it is only meaningful alongside value.

Two statements predate the non-strict default and had stopped being true. A
page reading a variable it never declared compiles, so enabling this does not
require every view to declare its model first; what an existing application
actually meets is an operator applied to a value of no known type, which is
reported either way. And static compilation of pages is no longer independent
of the grails { compileStatic { } } block, since that is now how it is asked
for; what remains true is the narrower point that all = true excludes it.
The existing assertions went through the template engine, which resolves a
page at render time, so what they proved depended on what happened to be on
the runtime classpath rather than on what the build produced. The claim being
made is that the option reaches both places a page is compiled, and only one
of them was covered.

The task's output directory is read directly now. Nothing in the integration
test's own task graph produces it, so the dependency is stated: without that
the directory is empty on a clean build and the assertion is vacuous.
SchedulerFactoryBean and AdaptableJobFactory come from spring-context-support,
which the plugin creates unconditionally, but it was not declared. It is also
not reliably inherited from the rest of the stack -- grails-gsp excludes it from
its transitive graph -- so an application depending only on this plugin failed
to start with a NoClassDefFoundError.
Documents Spring's @scheduled support and its lack of cluster awareness,
introduces Quartz as the clustered alternative, and covers Quartz clustering
requirements and pitfalls in full.
Restructures the guide so Background Jobs is the entry point, with Basic
Scheduling (Spring @scheduled) as the recommended default and Clustered
Scheduling (Quartz) presented as the answer to problems Spring's scheduler
cannot solve -- principally multi-instance deployments.
Clustering is one capability of the Quartz plugin, not what adding it gives you.
Renames the section accordingly and states explicitly, in the chapter intro and
on the section landing page, that Quartz defaults to an in-memory job store and
must be configured before it is cluster-safe.
jamesfredley and others added 24 commits August 28, 2026 16:20
Elastic Beanstalk UpdateEnvironment failed from GitHub Actions:
cloudformation:DescribeStackResource and s3:GetObjectAcl.
Merge 7.2.x Forge AWS docs into 8.0.x
Copy the AWS Elastic Beanstalk workflow, packaging, and release docs from
8.0.x. Delete the GCP Cloud Run Forge workflows. Leave 8.1.x application
code otherwise unchanged.
feat: Forge AWS Elastic Beanstalk on 8.1.x
* Use SLF4J for runtime diagnostics

Assisted-by: opencode:gpt-5.6-sol

* Fix import order and isolate user.home in runner spec

Assisted-by: opencode:gpt-5.6-sol

* Document and de-duplicate the multi-SLF4J-provider test classpath

Copilot flagged that grails-shell-cli's test classpath carries both
slf4j-simple and logback-classic simultaneously, which SLF4J 2.x treats
as an ambiguous binding. Verified this is real: `dependencies
--configuration testRuntimeClasspath` resolves both providers together,
and neither can simply be dropped - slf4j-simple is needed at runtime
for the actual `grails` CLI executable's production logging, and
logback-classic is needed by the new Logback-appender-based forked
regression specs (SpringApplicationRunnerSpec, GrailsCliSpec).

Confirmed no current regression from this (full :grails-shell-cli:test
run is green, no "multiple SLF4J providers" warning appears in any test
output) because both new specs that need a specific provider already
pin it explicitly via -Dslf4j.provider=... in their forked child
process. This commit removes the now-fully-redundant duplicate
`testImplementation 'org.slf4j:slf4j-simple'` line (already pulled in
via the runtimeOnly dependency, so this doesn't change the resolved
classpath) and documents the coexistence so a future forked-process
fixture doesn't skip the explicit pin and hit non-deterministic
provider selection.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Fix broken imports in SchemaExportCommandSpec after upstream CLI package move

The 8.0.x branch relocated ApplicationCommand/ExecutionContext and each
SchemaExportCommand into a dedicated cli source set with new packages
(grails.dev.commands.ExecutionContext -> org.apache.grails.core.cli.
ExecutionContext, grails.plugin.hibernate.commands.SchemaExportCommand
-> org.apache.grails.data.hibernate{5,7}.cli.SchemaExportCommand) as
part of unrelated work that landed after this PR's base commit.

Merging origin/8.0.x picked this up cleanly via rename tracking for the
production SchemaExportCommand.groovy files (already updated to the new
package on merge), but the two new SchemaExportCommandSpec.groovy test
files added by this PR had no prior history for git to track the rename
through, so they were merged in unchanged - still importing the old
ExecutionContext package and referencing SchemaExportCommand unqualified
(previously fine only because the spec shared its production class's old
package). Both left compileTestGroovy failing after the merge. Fixed by
importing both classes from their new locations.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* test: record coverage for SLF4J diagnostics paths

Codecov reported 13.88% patch coverage because the fixture specs verify
the new logging behavior in forked JVMs that JaCoCo never instruments.
Forward the test JVM's JaCoCo -javaagent argument into the forked
processes so their execution data appends to the module exec file, and
exercise the remaining ProfilingGrailsPluginManager configuration
phases in-process with a probe plugin.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Walter Duque de Estrada <wbduque@mac.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
GitHub Actions UpdateEnvironment failed with s3:PutObjectAcl and
s3:DeleteObject on elasticbeanstalk-<region>-<account>. Grant those
on the artifact bucket and the Elastic Beanstalk storage bucket.
fix: grant Forge AWS deploy role S3 ACL on EB bucket
GitHub Actions UpdateEnvironment failed with
autoscaling:DescribeAutoScalingGroups. Grant describe on Auto Scaling
and EC2 instances so Elastic Beanstalk can inspect the environment.
fix: grant Forge AWS deploy role Auto Scaling describe
Attach AWSElasticBeanstalkWebTier, ManagedUpdates, and
AdministratorAccess-AWSElasticBeanstalk to the deploy role, matching
what einaregilsson/beanstalk-deploy documents. Create application
versions without --process and fail fast on Elastic Beanstalk ERROR
events instead of waiting out the poll loop.
fix: Elastic Beanstalk managed policies for GitHub deploys
Copy forge-deploy-aws.yml (no --process, fail fast on EB errors) and
shared.yaml GitHubDeployRole managed policies from 8.0.x.
fix: sync Forge AWS GitHub deploy with working 8.0.x
chore: merge 8.0.0-M6->8.0.x; bump to 8.0.0-SNAPSHOT
DEFAULT_RESOURCES_INCLUDES generates eight mappings (index, create,
save, show, edit, update, patch, delete) and DEFAULT_RESOURCE_INCLUDES
generates seven, but the guide listed only seven and six. PATCH has
been generated since the action was introduced and was never documented,
including in the "Explicit REST Mappings" equivalence list.

Also corrects the nested resources table, which gave the edit URI as
/books/${bookId}/authors/edit/${id}. The generated mapping appends
/edit after the id, as asserted by RestfulResourceMappingSpec.
Document the PATCH mapping generated by resources and single
The static initializer added by #15800 builds its Caffeine cache through
three dynamic call sites:

    ldc           class com/github/benmanes/caffeine/cache/Caffeine
    invokedynamic invoke:(Ljava/lang/Class;)Ljava/lang/Object;   // newBuilder()
    invokedynamic invoke:(Ljava/lang/Object;)Ljava/lang/Object;  // weakKeys()
    invokedynamic invoke:(Ljava/lang/Object;)Ljava/lang/Object;  // build()

In a GraalVM native image there is no method handle to link, so Groovy
falls back to IndyInterface.aotDispatch and resolves through the
metaclass, which is built from Caffeine.getDeclaredMethods() -- empty
unless the class is registered for reflection. The class initializer
fails with

    No signature of static method: newBuilder for class:
    com.github.benmanes.caffeine.cache.Caffeine

and codecLookup, gspTagLibraryLookup and groovyPagesTemplateEngine fail
with it, so the application never starts.

Six of the ten methods already carried @CompileStatic. Moving it to the
class turns those three call sites into invokestatic/invokevirtual and
needs no reachability metadata at all. addMetaMethod stays dynamic: it
resolves a metamethod by GString property name, which is the one thing
static compilation cannot express.
Shadow 8.3.6's ShadowApplicationPlugin configures the startShadowScripts
task through conventionMapping.map('mainClassName'). Gradle 9 removed the
deprecated CreateStartScripts.mainClassName in favour of the mainClass
Property, so the task can no longer be created and the Forge build fails
at configuration time:

    Could not determine the dependencies of task
    ':grails-forge-web-netty:shadowDistTar'.
    > Could not create task ':grails-forge-web-netty:startShadowScripts'.
       > You can't map a property that does not exist: propertyName=mainClassName

Shadow is only applied to grails-forge-web-netty because the AWS Elastic
Beanstalk packaging came over from 7.2.x, which builds Forge on Gradle
8.14.5 where mainClassName still exists. Shadow 8.3.7 backported Gradle 9
support and 8.3.11 is the latest 8.3.x; the 8.x line is maintenance-only
upstream, so Forge's own build should follow the generated applications to
Shadow 9 (already 9.2.2 in the Forge dependency catalog) in a later change,
which needs the Transformer -> ResourceTransformer migration in buildSrc.
…e-static-8.0.x

Fix Grails Forge build on Gradle 9 by bumping Shadow to 8.3.11
Resolve GormEntityTransformation by keeping 8.1.x's three-argument
JPA association helper and carrying 8.0.x native identity injection.

Assisted-by: Cursor Grok 4.6
Bring current 8.0.x/8.1.x work onto 9.0.x, including Shadow 8.3.11.
Keep Groovy 6.0.0-beta-2 and 9.0 CI hang handling; restore 8.1 CAS
and Neo4j jobs plus MongoDB/Neo4j BOM constraints.

Assisted-by: Cursor Grok 4.6
Copilot AI lite review requested due to automatic review settings August 30, 2026 16:36

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR merges the current 8.1.x line into 9.0.x, carrying forward previously landed build, test, and framework changes onto the Groovy 6 line while resolving conflicts to preserve 9.0.x-specific pins and CI workarounds.

Changes:

  • Add/expand Spring AOT native support via new aot.factories registrations across multiple Grails modules.
  • Rework test dependency wiring in many modules (notably adopting testFixtures(...) usage and adjusting parallel test configuration).
  • Restore/extend Neo4j/MongoDB/CAS-related build and test coverage, plus a variety of correctness/doc updates across framework modules, examples, and Gradle test fixtures.

Reviewed changes

Copilot reviewed 275 out of 1344 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
grails-web-url-mappings/src/main/resources/META-INF/spring/aot.factories Register URL mappings runtime hints for Spring AOT.
grails-web-url-mappings/build.gradle Adjust test dependencies (incl. web-common fixtures).
grails-web-mvc/build.gradle Remove compileOnly spring-test; adjust test dependencies.
grails-web-databinding/src/main/resources/META-INF/spring/aot.factories Register databinding runtime hints for Spring AOT.
grails-web-databinding/build.gradle Remove compileOnly spring-test block.
grails-web-core/build.gradle Add web-common fixtures to tests; remove compileOnly spring-test.
grails-web-boot/build.gradle Remove compileOnly spring-test block.
grails-views-gson/src/test/groovy/grails/plugin/json/view/TemplateInheritanceSpec.groovy Clarify test model class usage for imported templates.
grails-views-gson/src/test/groovy/grails/plugin/json/view/IncludeAssociationsSpec.groovy Use explicit imports for association test classes.
grails-views-gson/src/test/groovy/grails/plugin/json/view/api/JsonApiHandleAssociationsSpec.groovy Import concrete Author type; tidy file end.
grails-views-gson/build.gradle Enable java-test-fixtures; add BOM to fixtures.
grails-validation/build.gradle Remove compileOnly spring-test block.
grails-url-mappings/build.gradle Remove compileOnly spring-test block.
grails-testing-support-web/src/main/groovy/grails/testing/web/GrailsWebUnitTest.groovy Document why taglib metaclass enhancement remains for tests.
grails-testing-support-web/build.gradle Add web-common fixtures to main implementation.
grails-testing-support-views-gson/build.gradle Depend on grails-views-gson test fixtures as API.
grails-testing-support-redis/build.gradle Enable vulnerability scan plugin.
grails-testing-support-mongodb/build.gradle Add compileOnly embedded Mongo module for transaction-capable specs.
grails-test-suite-uber/src/test/groovy/org/grails/plugins/PluginTests.java Update messageSource expectation to Spring Boot’s bean type.
grails-test-suite-uber/src/test/groovy/grails/test/mixin/RestfulControllerSpec.groovy Tighten constraints for title nullability/blankness.
grails-test-suite-uber/src/test/groovy/grails/test/mixin/ResourceAnnotationRestfulControllerSpec.groovy Tighten constraints for title nullability/blankness.
grails-test-suite-persistence/build.gradle Use test fixtures for shared test utilities; fix parallel setting reference.
grails-test-examples/spring-security/core/misc-functional-test-app/roles/src/integration-test/groovy/demo/LoginPage.groovy Wait for navigation after login submit to avoid flakiness.
grails-test-examples/spring-security/core/misc-functional-test-app/group/src/integration-test/groovy/demo/LoginPage.groovy Wait for navigation after login submit to avoid flakiness.
grails-test-examples/spring-security/cas/test1/src/main/resources/cas/services/grailsTest-10000001.json Add CAS registered service definition fixture.
grails-test-examples/spring-security/cas/test1/grails-app/init/grails/plugin/springsecurity/cas/test/BootStrap.groovy Fix package to match app structure; remove old imports.
grails-test-examples/spring-security/cas/test1/grails-app/init/grails/plugin/springsecurity/cas/test/Application.groovy Fix package to match app structure.
grails-test-examples/spring-security/cas/test1/grails-app/domain/grails/plugin/springsecurity/cas/test/UserRole.groovy Move domain package into app namespace.
grails-test-examples/spring-security/cas/test1/grails-app/domain/grails/plugin/springsecurity/cas/test/User.groovy Move domain package into app namespace.
grails-test-examples/spring-security/cas/test1/grails-app/domain/grails/plugin/springsecurity/cas/test/Role.groovy Move domain package into app namespace.
grails-test-examples/spring-security/cas/test1/grails-app/controllers/grails/plugin/springsecurity/cas/test/UrlMappings.groovy Fix package name.
grails-test-examples/scaffolding/grails-app/init/com/example/BootStrap.groovy Seed Book data via BookService.
grails-test-examples/scaffolding/build.gradle Enable compileStatic for GSP compilation validation.
grails-test-examples/quartz/grails-app/init/quartzapp/BootStrap.groovy Replace accidental controller content with Quartz bootstrap logic.
grails-test-examples/plugins/loadfirst/grails-app/i18n/loadfirst.properties Add plugin i18n bundle fixture.
grails-test-examples/plugins/loadfirst/grails-app/i18n/loadfirst_en_US.properties Add locale-specific plugin i18n bundle fixture.
grails-test-examples/plugins/issue-11767/src/main/groovy/issue11767/plugin/MyPluginGrailsPlugin.groovy Update author metadata.
grails-test-examples/neo4j/test-data-service/src/main/groovy/example/LoginAuthenticationSucessHandler.groovy Migrate servlet imports to Jakarta.
grails-test-examples/neo4j/test-data-service/grails-app/services/example/StudentService.groovy Adjust imports (includes an unused one).
grails-test-examples/neo4j/test-data-service/grails-app/init/example/BootStrap.groovy Minor formatting tweak.
grails-test-examples/neo4j/test-data-service/grails-app/init/example/Application.groovy Remove trailing whitespace and normalize closing brace.
grails-test-examples/neo4j/hibernate5/grails-app/views/error.gsp Switch error attribute key to Jakarta.
grails-test-examples/neo4j/hibernate5/grails-app/assets/images/skin/shadow.jpg Add missing asset.
grails-test-examples/neo4j/base/grails-app/views/error.gsp Switch error attribute key to Jakarta.
grails-test-examples/neo4j/base/grails-app/assets/images/skin/shadow.jpg Add missing asset.
grails-test-examples/hibernate7/grails-schema-per-tenant/build.gradle Add grails-web-common fixtures for tests.
grails-test-examples/hibernate7/grails-partitioned-multi-tenancy/build.gradle Add grails-web-common fixtures for tests.
grails-test-examples/hibernate7/grails-database-per-tenant/build.gradle Add grails-web-common fixtures for tests.
grails-test-examples/hibernate7/gorm/build.gradle Add web-common fixtures for integration tests.
grails-test-examples/hibernate5/grails-schema-per-tenant/build.gradle Add grails-web-common fixtures for tests.
grails-test-examples/hibernate5/grails-partitioned-multi-tenancy/build.gradle Add BOM to tests; add web-common fixtures.
grails-test-examples/hibernate5/grails-database-per-tenant/build.gradle Add BOM to tests; add web-common fixtures.
grails-test-examples/gsp-layout/build.gradle Add BOM to tests; add core/web-common fixtures for tests.
grails-test-examples/gsp-compile-static/grails-app/taglib/gspstatic/DemoTagLib.groovy Replace incorrect content with a statically-compiled demo taglib.
grails-test-examples/gsp-compile-static/grails-app/controllers/gspstatic/Book.groovy Replace incorrect content with a simple statically-compiled POGO.
grails-test-examples/graphql/grails-test-app/src/main/groovy/grails/test/app/pogo/Profile.groovy Add constraints to enforce non-null fields.
grails-test-examples/graphql/grails-test-app/src/integration-test/groovy/grails/test/app/UserRoleIntegrationSpec.groovy Filter stdout capture to SQL only.
grails-test-examples/graphql/grails-test-app/src/integration-test/groovy/grails/test/app/TagIntegrationSpec.groovy Filter stdout capture to SQL only.
grails-test-examples/graphql/grails-test-app/src/integration-test/groovy/grails/test/app/CommentIntegrationSpec.groovy Filter stdout capture to SQL only.
grails-test-examples/graphql/grails-test-app/grails-app/domain/grails/test/app/UserRole.groovy Add non-null constraints for associations.
grails-test-examples/graphql/grails-test-app/grails-app/domain/grails/test/app/User.groovy Make embedded profile/address non-null by default.
grails-test-examples/graphql/grails-test-app/grails-app/domain/grails/test/app/Address.groovy Add non-null constraints to fields.
grails-test-examples/gorm/build.gradle Add BOM to tests; add web-common fixtures to integration tests.
grails-test-examples/app1/grails-app/controllers/functionaltests/IncludesController.groovy Add probe action used by compiled-tag-call verification.
grails-test-core/build.gradle Move groovy dependency; add web-common fixtures; remove compileOnly spring-test.
grails-spring/build.gradle Apply shared test-config.gradle.
grails-spring-security/oauth2/plugin/src/main/groovy/grails/plugin/springsecurity/oauth2/SpringSecurityOauth2GrailsPlugin.groovy Update author metadata.
grails-spring-security/cas/plugin/grails-app/conf/DefaultCasSecurityConfig.groovy Change single signout default to opt-in with rationale.
grails-shell-cli/src/test/resources/org/grails/cli/compiler/dependencies/spring-boot-dependencies-effective-bom.xml Add minimal effective BOM fixture.
grails-shell-cli/build.gradle Swap test logger dependency to logback-classic; document SLF4J provider behavior.
grails-services/build.gradle Remove compileOnly spring-test block.
grails-scaffolding/src/main/templates/scaffolding/show.gsp Add typed model directive for static compilation.
grails-scaffolding/src/main/templates/scaffolding/index.gsp Add typed model directive; fix id interpolation.
grails-scaffolding/src/main/templates/scaffolding/edit.gsp Add typed model directive for static compilation.
grails-scaffolding/src/main/templates/scaffolding/create.gsp Add typed model directive for static compilation.
grails-scaffolding/src/main/templates/scaffolding/Controller.groovy Use Serializable id parameters in generated controller actions.
grails-scaffolding/src/main/resources/META-INF/spring/aot.factories Register scaffolding runtime hints for Spring AOT.
grails-scaffolding/src/main/groovy/grails/plugin/scaffolding/GormService.groovy Remove ReadOnly annotation usage.
grails-rest-transforms/build.gradle Add web-common fixtures; remove compileOnly spring-test.
grails-redis/build.gradle Enable vulnerability scan plugin.
grails-quartz/src/main/templates/Job.groovy Add Quartz job template.
grails-quartz/grails-app/conf/plugin.yml Replace legacy properties with YAML config.
grails-profiles/rest-api/templates/artifacts/scaffolding/Controller.groovy Align REST profile scaffolding controller IDs to Serializable.
grails-mimetypes/src/main/resources/META-INF/spring/aot.factories Register mimetypes runtime hints for Spring AOT.
grails-mimetypes/build.gradle Add web-common fixtures to tests; remove compileOnly spring-test.
grails-micronaut/build.gradle Enable vulnerability scan plugin.
grails-mail/src/main/groovy/grails/plugins/mail/PlainTextMailTagLib.groovy Change tag implementation signature to method form.
grails-mail/build.gradle Enable vulnerability scan plugin.
grails-interceptors/build.gradle Add BOM to tests; add web-common fixtures; remove compileOnly spring-test.
grails-i18n/src/test/resources/META-INF/grails/i18n.properties Add generated i18n descriptor test fixture.
grails-i18n/src/test/resources/beta-plugin.properties Add plugin message bundle fixture.
grails-i18n/src/test/resources/alpha-plugin.properties Add plugin message bundle fixture.
grails-i18n/src/main/resources/META-INF/spring.factories Register environment post-processor.
grails-i18n/build.gradle Remove compileOnly spring-test block.
grails-gsp/plugin/src/test/groovy/org/grails/web/pages/ParseSpec.groovy Update generated constants expectations.
grails-gsp/plugin/src/main/resources/META-INF/spring/aot.factories Register taglib runtime hints for Spring AOT.
grails-gsp/plugin/src/ast/resources/META-INF/services/org.codehaus.groovy.transform.ASTTransformation Register compiled-tag-call AST transformation.
grails-gsp/plugin/build.gradle Add AST dependency; add core/web-common fixtures for tests.
grails-gsp/grails-web-taglib/src/main/groovy/org/grails/web/taglib/WebRequestTemplateVariableBinding.java Add servletContext binding alias.
grails-gsp/grails-web-gsp/src/test/groovy/org/grails/web/gsp/io/GrailsConventionGroovyPageLocatorSpec.groovy Remove lastModified assignment for generated page parser.
grails-gsp/grails-taglib/src/main/groovy/org/grails/taglib/TagLibNamespaceMethodDispatcher.groovy Route tag dispatch through CompiledTagInvocation.
grails-gsp/grails-sitemesh3/src/main/groovy/org/grails/plugins/sitemesh3/Sitemesh3GrailsPlugin.groovy Update author metadata; remove developers list.
grails-gsp/grails-layout/build.gradle Add core fixtures for tests.
grails-gsp/core/src/main/resources/META-INF/spring/aot.factories Register precompiled page runtime hints.
grails-gsp/core/src/main/groovy/org/grails/gsp/CompileStaticGroovyPage.groovy Add notes about model variable naming source.
grails-gsp/core/build.gradle Add core fixtures and servlet/web-common test-only deps.
grails-gradle/plugins/src/test/resources/test-projects/taglib-index-wiring/settings.gradle Add new TestKit fixture project settings.
grails-gradle/plugins/src/test/resources/test-projects/native-metadata-ordering/settings.gradle Add new TestKit fixture project settings.
grails-gradle/plugins/src/test/resources/test-projects/native-metadata-ordering/grails-app/views/index.gsp Add view fixture for native metadata recording.
grails-gradle/plugins/src/test/resources/test-projects/native-metadata-ordering/gradle.properties Add fixture project properties.
grails-gradle/plugins/src/test/resources/test-projects/native-defaults-on/settings.gradle Add fixture project settings.
grails-gradle/plugins/src/test/resources/test-projects/native-defaults-on/gradle.properties Add fixture project properties.
grails-gradle/plugins/src/test/resources/test-projects/native-defaults-on/build.gradle Add fixture to inspect native defaults.
grails-gradle/plugins/src/test/resources/test-projects/native-defaults-off/settings.gradle Add fixture project settings.
grails-gradle/plugins/src/test/resources/test-projects/native-defaults-off/gradle.properties Add fixture project properties.
grails-gradle/plugins/src/test/resources/test-projects/native-defaults-off/build.gradle Add fixture to ensure no implicit native config.
grails-gradle/plugins/src/test/resources/test-projects/native-defaults-aot/settings.gradle Add fixture project settings.
grails-gradle/plugins/src/test/resources/test-projects/native-defaults-aot/gradle.properties Add fixture project properties.
grails-gradle/plugins/src/test/resources/test-projects/native-defaults-aot/build.gradle Add fixture to inspect AOT system properties.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin/src/main/groovy/demo/SpringSecurityDemoGrailsPlugin.groovy Add plugin fixture class.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin/settings.gradle Add fixture project settings.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin/grails-app/i18n/spring-security-demo.properties Add fixture i18n bundle.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin/grails-app/i18n/spring-security-demo-validation.properties Add fixture i18n bundle.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin/grails-app/i18n/spring-security-demo_fr.properties Add fixture i18n bundle.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin/gradle.properties Add fixture project properties.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin/build.gradle Add fixture build script.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin-collision/src/main/groovy/demo/SpringSecurityDemoGrailsPlugin.groovy Add collision fixture plugin class.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin-collision/settings.gradle Add collision fixture settings.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin-collision/grails-app/i18n/messages.properties Add collision fixture messages.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin-collision/gradle.properties Add collision fixture properties.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-plugin-collision/build.gradle Add collision fixture build script.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-declared/settings.gradle Add declared basenames fixture settings.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-declared/grails-app/i18n/api.properties Add declared basenames fixture bundle.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-declared/grails-app/i18n/api_errors.properties Add declared basenames fixture bundle.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-declared/gradle.properties Add declared basenames fixture properties.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-declared/build.gradle Add declared basenames fixture config.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-app/settings.gradle Add app descriptor fixture settings.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-app/grails-app/i18n/messages.properties Add app fixture messages bundle.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-app/grails-app/i18n/messages_pt_BR.properties Add app fixture localized messages.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-app/grails-app/i18n/messages_de.properties Add app fixture localized messages.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-app/grails-app/i18n/api_errors.properties Add app fixture bundle.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-app/gradle.properties Add app fixture properties.
grails-gradle/plugins/src/test/resources/test-projects/i18n-descriptor-app/build.gradle Add app fixture build script.
grails-gradle/plugins/src/test/resources/test-projects/gsp-compile-static/settings.gradle Add compile-static fixture settings.
grails-gradle/plugins/src/test/resources/test-projects/gsp-compile-static/gradle.properties Add compile-static fixture properties.
grails-gradle/plugins/src/test/resources/test-projects/gsp-compile-classpath/build.gradle Add diagnostic outputs for GSP compile classpath.
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type/settings.gradle Add gorm id-type fixture settings.
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type/grails-app/conf/application.yml Add gorm id-type fixture config.
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type/gradle.properties Add gorm id-type fixture properties.
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/settings.gradle Add plugin-consumer composite fixture settings.
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/plugin/src/main/java/example/PortableBook.java Add portable domain type fixture.
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/plugin/build.gradle Add plugin fixture build script.
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/gradle.properties Add plugin-consumer fixture properties.
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/app/grails-app/conf/application.yml Add app fixture config for native id.
grails-gradle/plugins/src/test/resources/test-projects/gorm-default-id-type-plugin-consumer/app/build.gradle Add app fixture build script for native id.
grails-gradle/plugins/src/test/resources/test-projects/asset-classpath-packaging/settings.gradle Add asset fixture settings.
grails-gradle/plugins/src/test/resources/test-projects/asset-classpath-packaging/gradle.properties Add asset fixture properties.
grails-gradle/plugins/src/test/groovy/org/grails/gradle/plugin/views/gsp/GroovyPageToolchainSpec.groovy Update test wording for toolchain input behavior.
grails-gradle/plugins/build.gradle Set test env var to validate inherited environment stripping behavior.
grails-gradle/gradle/test-config.gradle Fix parallel forks property reference.
grails-gradle/bom/build.gradle Remove Log4j import comment/line; keep Spring Boot platform import.
grails-geb/src/main/groovy/grails/plugin/geb/GebGrailsPlugin.groovy Update author metadata.
grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/GormImplSpec.groovy Enable Neo4j as a supported option.
grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/GrailsDataMongoDBSpec.groovy Add exclusivity test for MongoDB vs Neo4j feature selection.
grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java Add NEO4J enum option.
grails-forge/grails-forge-core/build.gradle Move logback-classic to testImplementation.
grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GrailsForgeConfiguration.java Make redirect URI optional when redirect URL is null.
grails-forge/gradle/test-config.gradle Align maxParallelForks with configuredTestParallel.
grails-forge/gradle.properties Bump Shadow plugin version to 8.3.11.
grails-domain-class/build.gradle Remove compileOnly spring-test block.
grails-doc/src/en/ref/Tags - GSP/set.adoc Document type attribute for static GSP compilation.
grails-doc/src/en/ref/Database Mapping/type.adoc Clarify semantics of type: "text" mapping.
grails-doc/src/en/guide/theWebLayer/gson/gsonTesting.adoc Document using grails-views-gson test fixtures.
grails-doc/src/en/guide/security/securityPlugins/springSecurity/ui/customization.adoc Fix plugin i18n bundle path and precedence notes.
grails-doc/src/en/guide/security/securityPlugins/springSecurity/cas/introduction.adoc Update CAS link to Apereo site.
grails-doc/src/en/guide/REST/restfulControllers/restControllersStepByStep.adoc Add PATCH route to REST table.
grails-doc/src/en/guide/REST/restfulControllers/extendingRestfulController.adoc Add PATCH route to REST table.
grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/transactions/SessionHolder.java Expose unmodifiable view of bound sessions.
grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/model/AbstractMappingContext.java Propagate default nullable into mapping factory.
grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/connections/ConnectionSourceSettings.groovy Add defaultIdType setting for portable domains.
grails-datasource/build.gradle Remove compileOnly spring-test block.
grails-datamapping-validation/src/main/resources/META-INF/spring/aot.factories Register constrained-property hints for Spring AOT.
grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PagedResultSpec.groovy Ignore criteria paging test for Neo4j suite (ordering).
grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/GormTransformer.java Make transformer ordered with highest precedence.
grails-datamapping-core/src/test/resources/META-INF/services/org.grails.datastore.gorm.services.ServiceImplementerAdapter Add test SPI adapters.
grails-datamapping-core/src/test/resources/META-INF/services/org.grails.datastore.gorm.services.ServiceImplementer Add test SPI implementer.
grails-datamapping-core/src/test/groovy/grails/gorm/services/MethodValidationTransformSpec.groovy Exclude trait datastore accessors from Generated assertion.
grails-datamapping-core/src/test/groovy/grails/gorm/services/CompileStaticServiceInjectionSpec.groovy Remove expectation of datastore field presence.
grails-datamapping-core/src/main/resources/META-INF/spring/aot.factories Register GORM runtime hints.
grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/MappingContextTraversableResolver.groovy Skip cascades when cascade validation is disabled.
grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/OrderedGormTransformation.groovy Use init() instead of manual AST node type checks.
grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/UpdateStringQueryImplementer.groovy Adjust implementer ordering to prefer update handling.
grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionStringQueryImplementer.groovy Slight order tweak relative to base implementer.
grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormValidateable.groovy Throw clearer error if no GORM implementation configured.
grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindByFinder.java Add ctor supporting DatastoreResolver + MappingContext.
grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/AutoTimestampEventListener.java Add logger for event listener.
grails-datamapping-core/build.gradle Add grails-data-simple to tests.
grails-datamapping-core-test/src/test/groovy/org/grails/datastore/gorm/CoreTestSuite.groovy Add FindByExampleSpec to suite selection.
grails-databinding/build.gradle Remove compileOnly spring-test block.
grails-data-simple/build.gradle Add spock-core for tests.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/ZonedDateTimeToLongConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/StringToPeriodConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/PeriodToStringConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/OffsetTimeToLongConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/OffsetDateTimeToLongConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LongToZonedDateTimeConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LongToOffsetTimeConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LongToOffsetDateTimeConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LongToLocalTimeConverter.groovy Whitespace + brace formatting.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LongToLocalDateTimeConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LongToLocalDateConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LongToInstantConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LocalTimeToLongConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LocalDateToLongConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/LocalDateTimeToLongConverter.groovy Formatting tweak.
grails-data-neo4j/grails-plugin/src/main/groovy/org/grails/datastore/gorm/neo4j/converters/InstantToLongConverter.groovy Formatting tweak.
grails-data-neo4j/docs/src/docs/asciidoc/gettingStarted/standalone.adoc Update dependency coordinates.
grails-data-neo4j/docs/src/docs/asciidoc/gettingStarted/springBoot.adoc Update dependency coordinates.
grails-data-neo4j/core/src/test/resources/spy.properties Add spy.properties fixture (license header).
grails-data-neo4j/core/src/test/resources/META-INF/services/org.apache.grails.data.testing.tck.base.GrailsDataTckManager Register Neo4j TCK manager SPI.
grails-data-neo4j/core/src/test/groovy/grails/gorm/tests/WithTransactionSpec.groovy Switch to Neo4j datastore spec + register domains via manager.
grails-data-neo4j/core/src/test/groovy/grails/gorm/tests/Pet.groovy Import shared TCK domain types.
grails-data-neo4j/core/src/test/groovy/grails/gorm/tests/PagedResultSpec.groovy Switch to Neo4j datastore spec + register domain via manager.
grails-data-neo4j/core/src/test/groovy/grails/gorm/tests/NullValueEqualSpec.groovy Switch to Neo4j datastore spec + register domain via manager.
grails-data-neo4j/core/src/test/groovy/grails/gorm/tests/ManyToManyQuerySpec.groovy Switch to Neo4j datastore spec + register domains via manager.
grails-data-neo4j/core/src/test/groovy/grails/gorm/tests/cypher/OneToManyCreateSpec.groovy Mark spec pending with explanatory reason.
grails-data-neo4j/core/src/main/resources/META-INF/services/org.grails.datastore.gorm.services.ServiceImplementer Register Neo4j service implementers.
grails-data-neo4j/core/src/main/resources/META-INF/services/org.grails.compiler.gorm.GormEntityTraitProvider Register Neo4j entity trait provider.
grails-data-neo4j/core/src/main/resources/META-INF/services/org.codehaus.groovy.runtime.ExtensionModule Register Neo4j Groovy extension module.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/SessionFlushedEvent.java Reorder imports.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/proxy/Neo4jProxyFactory.java Import ordering cleanup.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/mapping/config/RelationshipConfig.groovy Import/format cleanup.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/mapping/config/NodeConfig.groovy Fix semicolons/import formatting.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/mapping/config/DynamicToManyAssociation.java Formatting cleanup.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/mapping/config/DynamicAssociation.java Add blank line for formatting.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/mapping/config/Attribute.groovy Import cleanup.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/IdGenerator.java Move nextId() into interface; clean enum structure.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/engine/Neo4jModificationTrackingEntityAccess.groovy Add blank line between imports.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/connections/Neo4jConnectionSourceSettingsBuilder.groovy Import order cleanup.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/config/Settings.java Formatting cleanup; spacing.
grails-data-neo4j/core/src/main/groovy/org/grails/datastore/gorm/neo4j/collection/Neo4jRelationship.groovy Import cleanup; formatting tweak.
grails-data-neo4j/core/src/main/groovy/grails/neo4j/services/Cypher.groovy Add trailing newline/format cleanup.
grails-data-neo4j/core/src/main/groovy/grails/neo4j/Direction.groovy Formatting cleanup.
grails-data-mongodb/spring-data/build.gradle Add embedded Mongo + flapdoodle for replica set transaction tests.
grails-data-mongodb/grails-plugin/src/main/groovy/grails/plugins/mongodb/MongodbGrailsPlugin.groovy Rename org name; fix issueManagement system casing.
grails-data-mongodb/embedded/src/main/java/org/grails/datastore/gorm/mongodb/embedded/RunningEmbeddedMongo.java Add isRunning() contract.
grails-data-mongodb/embedded/src/main/java/org/grails/datastore/gorm/mongodb/embedded/EmbeddedMongoBackend.java Remove outdated author line.
grails-data-mongodb/embedded/build.gradle Add compileOnly mongo driver for replica set init; keep tests.
grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoGormEnhancer.groovy Register API factory with GormRegistry.
grails-data-mongodb/core/build.gradle Add embedded Mongo + flapdoodle and simple datastore test branch coverage.
grails-data-hibernate7/grails-plugin/build.gradle Add slf4j-simple for test runtime.
grails-data-hibernate7/dbmigration/src/test-cli/groovy/org/apache/grails/data/hibernate7/dbmigration/cli/ApplicationContextDatabaseMigrationCommandSpec.groovy Tighten constraints for migration test domains.
grails-data-hibernate7/dbmigration/build.gradle Remove compileOnly spring-test.
grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/SchemaTenantGormEnhancerSpec.groovy Remove CurrentTenant annotation usage.
grails-data-hibernate7/core/src/test/groovy/org/grails/orm/hibernate/cfg/GrailsHibernatePersistentEntitySpec.groovy Add non-null constraint for embedded address.
grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java Propagate default nullable into mapping factory.
grails-data-hibernate7/core/src/main/groovy/org/grails/orm/hibernate/cfg/domainbinding/binder/GrailsPropertyBinder.java Avoid binding enum collections as basic enum properties.
grails-data-hibernate5/grails-plugin/build.gradle Add slf4j-simple for test runtime.
grails-data-hibernate5/dbmigration/src/test-cli/groovy/org/apache/grails/data/hibernate5/dbmigration/cli/ApplicationContextDatabaseMigrationCommandSpec.groovy Tighten constraints for migration test domains.
grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationGrailsPlugin.groovy Update author metadata.
grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormEnhancer.groovy Register API factory with GormRegistry.
grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java Propagate default nullable into mapping factory.
grails-data-graphql/core/src/test/groovy/org/grails/gorm/graphql/types/input/EmbeddedInputObjectTypeBuilderSpec.groovy Update nullable assertion to match new default behavior.
grails-data-graphql/core/src/test/groovy/org/grails/gorm/graphql/SchemaSpec.groovy Adjust type assertions to match schema type shapes.
grails-data-graphql/core/build.gradle Enable java-test-fixtures; add BOM to fixtures.
grails-core/src/test/resources/grails/boot/version-in-a-resource.properties Add version resource test fixture.
grails-core/src/main/resources/META-INF/spring/aot.factories Register Grails core AOT processors and runtime hints.
grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareInjectionOperation.java Sort injectors by order before applying.
grails-core/src/main/groovy/org/grails/compiler/injection/DefaultGrailsDomainClassInjector.java Clarify injector ordering relative to GORM transforms.
grails-core/build.gradle Remove compileOnly spring-test.
grails-converters/build.gradle Remove compileOnly spring-test block.
grails-controllers/src/main/resources/META-INF/spring/aot.factories Register controller runtime hints for Spring AOT.
grails-controllers/build.gradle Add web-common fixtures for tests; remove compileOnly spring-test.
grails-common/src/main/groovy/org/apache/grails/common/compiler/GroovyTransformOrder.groovy Add transform order constant for compiled tag calls.
grails-codecs/build.gradle Remove compileOnly spring-test block.
grails-cache/src/main/groovy/grails/plugin/cache/CacheGrailsPlugin.groovy Clear authorEmail metadata.
grails-bom/micronaut/build.gradle Remove explicit Log4j BOM import.
grails-bom/hibernate7/build.gradle Remove explicit Log4j BOM import.
grails-bom/hibernate7-micronaut/build.gradle Remove explicit Log4j BOM import.
grails-bom/hibernate5/build.gradle Remove explicit Log4j BOM import.
grails-bom/hibernate5-micronaut/build.gradle Remove explicit Log4j BOM import.
grails-bom/base/build.gradle Remove explicit Log4j BOM import; rely on platform iteration.
grails-async/plugin/build.gradle Add web-common fixtures for tests.
gradle/test-config.gradle Add onlyNeo4jTests flag; fix parallel setting reference.
gradle/publish-root-config.gradle Add neo4j-bom and quartz projects to published list.
gradle/mongodb-test-config.gradle Propagate mongodbContainerVersion into test JVM when present.
gradle/mongodb-forked-test-config.gradle Fix parallel setting reference; propagate mongodbContainerVersion.
gradle/grails-data-tck-config.gradle Add only/skip Neo4j test selection logic.
gradle.properties Add geantyrefVersion property.
etc/bin/Dockerfile Bump Liberica JDK patch version.
end-to-end/settings.gradle Add taglib-index-incremental end-to-end project.
end-to-end/README.md Document new taglib index incremental suite.
DEVELOPMENT.md Document onlyNeo4jTests/skipNeo4jTests flags.
build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/PublishPlugin.groovy Add emeritus contributor entry.
.sdkmanrc Bump pinned Java patch version.
.gitignore Ignore generated Neo4j BOM docs file.
.github/workflows/release-publish-docs.yml Bump Java patch version for docs publishing workflow.
.github/workflows/codeql.yml Update CodeQL action SHAs.
.github/scripts/groovy-snapshot-canary-build.init.gradle Update comments and referenced init-script name.
.git-blame-ignore-revs Add quartz import reformat commit to ignore list.
Suppressed comments (2)

grails-bom/base/build.gradle:57

  • The Log4j BOM needs to be imported before Spring Boot’s BOM so Maven consumers keep the Log4j family pinned to the intended secure version (see dependencies.gradle combinedPlatforms comment). Importing Spring Boot first can allow its older Log4j constraints to win for Maven users.
    grails-bom/hibernate5/build.gradle:58
  • This BOM imports Spring Boot’s BOM after importing grails-bom. For Maven consumers, import order can allow Spring Boot’s older Log4j constraints to override the intended Log4j pin; other build logic (dependencies.gradle combinedPlatforms) relies on Log4j’s BOM being imported ahead of Spring Boot to keep the secure version effective.

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines 22 to +24
import grails.gorm.services.Service
import grails.gorm.transactions.Transactional
import org.springframework.beans.factory.annotation.Autowired
Comment on lines +4 to +6
static triggers = {
simple repeatInterval: 5000l // execute job once in 5 seconds
}
@codecov

codecov Bot commented Aug 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 30.1329%. Comparing base (1ad4efe) to head (8c47f15).

Additional details and impacted files

Impacted file tree graph

@@                 Coverage Diff                 @@
##                9.0.x     #16277         +/-   ##
===================================================
- Coverage     53.1045%   30.1329%   -22.9715%     
+ Complexity      19363        517      -18846     
===================================================
  Files            2081         81       -2000     
  Lines           99018       4739      -94279     
  Branches        17375        817      -16558     
===================================================
- Hits            52583       1428      -51155     
+ Misses          38875       3068      -35807     
+ Partials         7560        243       -7317     

see 2036 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@testlens-app

testlens-app Bot commented Aug 30, 2026

Copy link
Copy Markdown

✅ All tests passed ✅

🏷️ Commit: 8c47f15
▶️ Tests: 33610 executed
⚪️ Checks: 87/87 completed


Learn more about TestLens at testlens.app/docs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: No status

Development

Successfully merging this pull request may close these issues.

7 participants