This is an automated email from the ASF dual-hosted git repository. benw pushed a commit to branch gradle-improvements in repository https://gitbox.apache.org/repos/asf/tapestry-5.git
commit 2b95839b9498c1aeac060b7b1effd43f4427cdc0 Merge: 0d1861866 f32d32d49 Author: Ben Weidig <[email protected]> AuthorDate: Sat Aug 16 10:05:12 2025 +0200 Merge branch 'master' into gradle-improvements 5_10_RELEASE_NOTES.md | 18 +- build.gradle | 71 +- .../main/groovy/t5build/CompileCoffeeScript.groovy | 58 - .../groovy/t5build/PreprocessCoffeeScript.groovy | 103 - tapestry-beanvalidator/build.gradle | 14 - .../beanvalidator/beanvalidator-validation.coffee | 70 - .../beanvalidator/modules/BeanValidatorModule.java | 26 +- tapestry-core/build.gradle | 95 +- tapestry-core/compile-coffeescript | 11 - tapestry-core/compile-test-coffeescript | 11 - .../META-INF/modules/t5/core/ajax.coffee | 95 - .../META-INF/modules/t5/core/ajaxformloop.coffee | 87 - .../META-INF/modules/t5/core/alert.coffee | 142 -- .../META-INF/modules/t5/core/autocomplete.coffee | 48 - .../META-INF/modules/t5/core/bootstrap.coffee | 29 - .../META-INF/modules/t5/core/confirm-click.coffee | 96 - .../META-INF/modules/t5/core/console.coffee | 218 --- .../META-INF/modules/t5/core/datefield.coffee | 180 -- .../META-INF/modules/t5/core/events.coffee | 187 -- .../modules/t5/core/exception-display.coffee | 30 - .../modules/t5/core/exception-frame.coffee | 64 - .../META-INF/modules/t5/core/fields.coffee | 195 -- .../META-INF/modules/t5/core/form-fragment.coffee | 98 - .../META-INF/modules/t5/core/forms.coffee | 211 -- .../META-INF/modules/t5/core/graphviz.coffee | 29 - .../META-INF/modules/t5/core/init.coffee | 30 - .../META-INF/modules/t5/core/localdate.coffee | 37 - .../META-INF/modules/t5/core/messages.coffee | 55 - .../META-INF/modules/t5/core/moment.coffee | 25 - .../META-INF/modules/t5/core/pageinit.coffee | 241 --- .../META-INF/modules/t5/core/palette.coffee | 300 --- .../META-INF/modules/t5/core/select.coffee | 32 - .../META-INF/modules/t5/core/time-interval.coffee | 55 - .../META-INF/modules/t5/core/tree.coffee | 114 -- .../META-INF/modules/t5/core/utils.coffee | 59 - .../META-INF/modules/t5/core/validation.coffee | 178 -- .../META-INF/modules/t5/core/zone-refresh.coffee | 68 - .../META-INF/modules/t5/core/zone.coffee | 160 -- .../java/org/apache/tapestry5/SymbolConstants.java | 23 +- .../corelib/base/AbstractComponentEventLink.java | 8 +- .../tapestry5/corelib/base/AbstractField.java | 6 +- .../tapestry5/corelib/components/AjaxFormLoop.java | 10 +- .../tapestry5/corelib/components/Alerts.java | 6 +- .../tapestry5/corelib/components/DateField.java | 10 +- .../tapestry5/corelib/components/DevTool.java | 14 +- .../tapestry5/corelib/components/Errors.java | 5 +- .../corelib/components/ExceptionDisplay.java | 8 +- .../apache/tapestry5/corelib/components/Form.java | 6 +- .../tapestry5/corelib/components/FormFragment.java | 20 +- .../tapestry5/corelib/components/Graphviz.java | 10 +- .../apache/tapestry5/corelib/components/Grid.java | 8 +- .../apache/tapestry5/corelib/components/Label.java | 6 +- .../tapestry5/corelib/components/LinkSubmit.java | 24 +- .../tapestry5/corelib/components/LocalDate.java | 13 +- .../tapestry5/corelib/components/Palette.java | 24 +- .../corelib/components/ProgressiveDisplay.java | 12 +- .../tapestry5/corelib/components/Select.java | 49 +- .../tapestry5/corelib/components/Submit.java | 22 +- .../tapestry5/corelib/components/TimeInterval.java | 13 +- .../apache/tapestry5/corelib/components/Tree.java | 36 +- .../apache/tapestry5/corelib/components/Zone.java | 23 +- .../tapestry5/corelib/mixins/Autocomplete.java | 28 +- .../apache/tapestry5/corelib/mixins/Confirm.java | 8 +- .../tapestry5/corelib/mixins/TriggerFragment.java | 10 +- .../tapestry5/corelib/mixins/ZoneRefresh.java | 9 +- .../internal/alerts/AlertManagerImpl.java | 20 +- .../internal/services/DocumentLinkerImpl.java | 41 +- .../internal/services/EsModuleInitsManager.java | 93 +- .../services/PartialMarkupDocumentLinker.java | 14 +- .../internal/services/ajax/BaseInitialization.java | 10 + .../services/ajax/EsModuleInitializationImpl.java | 33 +- .../internal/services/ajax/EsShimManagerImpl.java | 66 + .../services/ajax/JavaScriptSupportImpl.java | 48 +- .../services/ajax/RequireJsModeHelper.java | 41 + .../services/ajax/RequireJsModeHelperImpl.java | 49 + .../javascript/ConfigureHTMLElementFilter.java | 13 +- .../services/javascript/EsModuleManagerImpl.java | 165 +- .../services/javascript/EsShimDispatcher.java | 141 ++ .../services/javascript/ModuleManagerImpl.java | 18 +- .../translator/NumericTranslatorSupportImpl.java | 20 +- .../internal/util/MessageCatalogResource.java | 15 +- .../apache/tapestry5/modules/JavaScriptModule.java | 220 ++- .../apache/tapestry5/modules/TapestryModule.java | 8 +- .../services/javascript/EsModuleManager.java | 54 +- .../tapestry5/services/javascript/EsShim.java | 189 ++ .../services/javascript/EsShimManager.java | 49 + .../javascript/ExtensibleJavaScriptStack.java | 18 +- .../services/javascript/JavaScriptStack.java | 8 + .../services/javascript/JavaScriptSupport.java | 8 + .../services/javascript/StackExtension.java | 10 + .../services/javascript/StackExtensionType.java | 7 + .../tapestry5/validator/CheckboxValidator.java | 10 +- .../java/org/apache/tapestry5/validator/Email.java | 11 +- .../java/org/apache/tapestry5/validator/Max.java | 9 +- .../org/apache/tapestry5/validator/MaxLength.java | 9 +- .../java/org/apache/tapestry5/validator/Min.java | 10 +- .../org/apache/tapestry5/validator/MinLength.java | 9 +- .../org/apache/tapestry5/validator/Regexp.java | 9 +- .../org/apache/tapestry5/validator/Required.java | 9 +- .../org/apache/tapestry5/t5-core-dom.coffee | 993 ---------- .../META-INF/assets/es-modules/t5/.gitignore | 2 + .../META-INF/assets/es-modules/underscore.js | 5 + .../META-INF/assets/tapestry5/moment-2.15.1.js | 2 +- .../META-INF/assets/tapestry5/underscore-1.13.6.js | 2042 -------------------- .../META-INF/assets/tapestry5/underscore-1.13.7.js | 6 + .../main/resources/META-INF/modules/t5/.gitignore | 2 + .../resources/org/apache/tapestry5/core.properties | 2 +- tapestry-core/src/main/typescript/.gitignore | 2 + .../src/main/typescript/package-lock.json | 450 +++++ tapestry-core/src/main/typescript/package.json | 32 + .../t5/beanvalidator/beanvalidator-validation.ts | 97 + .../src/main/typescript/src/t5/core/ajax.ts | 109 ++ .../main/typescript/src/t5/core/ajaxformloop.ts | 105 + .../src/main/typescript/src/t5/core/alert.ts | 176 ++ .../main/typescript/src/t5/core/autocomplete.ts | 62 + .../typescript/src/t5/core/bootstrap.ts} | 25 +- .../main/typescript/src/t5/core/confirm-click.ts | 127 ++ .../src/main/typescript/src/t5/core/console.ts | 251 +++ .../src/main/typescript/src/t5/core/datefield.ts | 231 +++ .../src/t5/core/datepicker.ts} | 7 +- .../src/main/typescript/src/t5/core/dom.ts | 152 ++ .../src/main/typescript/src/t5/core/events.ts | 197 ++ .../typescript/src/t5/core/exception-display.ts | 35 + .../main/typescript/src/t5/core/exception-frame.ts | 78 + .../src/main/typescript/src/t5/core/fields.ts | 240 +++ .../main/typescript/src/t5/core/form-fragment.ts | 121 ++ .../src/main/typescript/src/t5/core/forms.ts | 254 +++ .../src/main/typescript/src/t5/core/graphviz.ts | 35 + .../main/typescript/src/t5/core/html-sanitizer.ts | 84 + .../src/main/typescript/src/t5/core/init.ts | 36 + .../src/main/typescript/src/t5/core/localdate.ts | 38 + .../main/typescript/src/t5/core/messages-amd.ts | 60 + .../typescript/src/t5/core/messages-es-module.ts | 68 + .../src/main/typescript/src/t5/core/messages.ts | 39 + .../typescript/src/t5/core/moment.ts} | 28 +- .../src/main/typescript/src/t5/core/pageinit.ts | 363 ++++ .../src/main/typescript/src/t5/core/palette.ts | 425 ++++ .../src/main/typescript/src/t5/core/select.ts | 41 + .../typescript/src/t5/core/t5-core-dom-jquery.ts | 547 ++++++ .../src/t5/core/t5-core-dom-prototype.ts | 662 +++++++ .../typescript/src/t5/core/t53-compatibility.ts | 56 + .../main/typescript/src/t5/core/time-interval.ts | 62 + .../src/main/typescript/src/t5/core/tree.ts | 144 ++ .../src/main/typescript/src/t5/core/typeahead.ts | 1782 +++++++++++++++++ .../src/main/typescript/src/t5/core/types.ts | 529 +++++ .../src/main/typescript/src/t5/core/utils.ts | 72 + .../src/main/typescript/src/t5/core/validation.ts | 247 +++ .../main/typescript/src/t5/core/zone-refresh.ts | 82 + .../src/main/typescript/src/t5/core/zone.ts | 217 +++ tapestry-core/src/main/typescript/tsconfig.json | 53 + tapestry-core/src/test/app1/ConfirmDemo.tml | 2 +- .../coffeescript/META-INF/assets/zonedemo.coffee | 5 - .../META-INF/modules/app/test-support.coffee | 14 - .../META-INF/modules/client-console-demo.coffee | 8 - .../META-INF/modules/palette-demo.coffee | 11 - .../META-INF/modules/validate-in-error.coffee | 7 - .../integration/app1/pages/qunit-config.coffee | 2 - .../integration/app1/pages/qunit-driver.coffee | 1 - .../integration/app1/pages/test-dom.coffee | 72 - .../integration/app1/pages/test-messages.coffee | 22 - .../integration/app1/pages/test-utils.coffee | 10 - .../integration/app1/pages/test-validation.coffee | 35 - .../integration/app1/ConfirmMixinTests.groovy | 3 + .../app1/ModuleConfigurationCallbackTests.groovy | 13 +- .../services/DocumentLinkerImplTest.groovy | 59 +- .../ajax/JavaScriptSupportAutofocusTests.groovy | 2 +- .../services/ajax/JavaScriptSupportImplTest.groovy | 34 +- .../tapestry5/integration/app1/AjaxTests.java | 12 + .../tapestry5/integration/app1/App1TestCase.java | 8 + .../tapestry5/integration/app1/AssetTests.java | 8 +- .../integration/app1/CoreBehaviorsTests.java | 2 +- .../tapestry5/integration/app1/EsModuleTests.java | 1 - .../integration/app1/components/Border.java | 14 +- .../integration/app1/pages/ClientConsoleDemo.java | 12 +- .../integration/app1/pages/ConfirmDemo.java | 5 + .../integration/app1/pages/EsModuleDemo.java | 2 +- .../pages/ModuleConfigurationCallbackDemo.java | 2 + .../integration/app1/pages/ModuleInitDemo.java | 10 +- .../app1/pages/MultiZoneUpdateDemo.java | 12 +- .../integration/app1/pages/PaletteDemo.java | 9 +- .../integration/app1/pages/PaletteGroupedDemo.java | 11 +- .../integration/app1/pages/PublishEventDemo.java | 33 +- .../app1/pages/ValidateInErrorEvent.java | 12 +- .../integration/app1/services/AppModule.java | 7 +- .../javascript/EsModuleManagerImplTest.java | 39 +- .../META-INF/assets/ExpressionInJsFunction.js | 13 +- .../resources/META-INF/assets/PublishEventDemo.js | 3 + .../assets/es-modules/app/multi-zone-update.js | 5 + .../META-INF/assets/es-modules/app/test-support.js | 14 + .../assets/es-modules/client-console-demo.js | 6 + .../META-INF/assets/es-modules/palette-demo.js | 14 + .../assets/es-modules/publish-event-demo.js | 23 + .../assets/es-modules/validate-in-error.js | 8 + .../src/test/resources/META-INF/assets/zonedemo.js | 25 + .../META-INF/modules/app/multi-zone-update.js | 2 +- .../resources/META-INF/modules/app/test-support.js | 18 + .../META-INF/modules/client-console-demo.js | 11 + .../resources/META-INF/modules/palette-demo.js | 17 + .../META-INF/modules/validate-in-error.js | 7 + .../integration/app1/components/Border.tml | 9 + .../integration/app1/pages/nested/AssetDemo.js | 16 +- .../integration/app1/pages/qunit-config.js | 2 + .../integration/app1/pages/qunit-driver.js | 1 + .../tapestry5/integration/app1/pages/test-dom.js | 87 + .../integration/app1/pages/test-messages.js | 20 + .../tapestry5/integration/app1/pages/test-utils.js | 16 + .../integration/app1/pages/test-validation.js | 32 + .../apache/tapestry5/test/SeleniumTestCase.java | 77 +- .../apache/tapestry5/upload/components/Upload.java | 18 +- 209 files changed, 10757 insertions(+), 7046 deletions(-) diff --cc 5_10_RELEASE_NOTES.md index 227915b73,4a942b709..764aff6db --- a/5_10_RELEASE_NOTES.md +++ b/5_10_RELEASE_NOTES.md @@@ -20,11 -21,20 +21,26 @@@ Scratch pad for changes destined for th # Non-backward-compatible changes (but that probably won't cause problems) + # Non-backward-compatible changes + + * When using Require.js and AMD modules, from Tapestry 5.10.0 on, + the previously returned objects, functions or values are now + the `default` property of the object received from `require()`. + This is a consequence we couldn't avoid from the CoffeeScript + to JavaScript to TypeScript conversion. + + + # Notes about Require.js disabled mode + * Underscore.js, jQuery and Require.js are not included in the default stack + (i.e. the set of JavaScript files which are included in pages by default). + If you need to use Underscore.js or jQuery, they're automatically available for + import as `underscore` and `jquery`, respectively. + # Overall notes + +* Gradle overhaul + * 8.5 -> 8.14.2 + * Version catalogs + * Conventions + * ... diff --cc build.gradle index 213809578,bde9ee18d..6a03cbbfb --- a/build.gradle +++ b/build.gradle @@@ -303,148 -500,114 +303,137 @@@ tasks.register('aggregateJavadoc', Java } } - tasks.register('coffeeScriptDocs', Exec) { - group 'Documentation' - description 'Build docco documentation for all CoffeeScript sources' - dependsOn project(':tapestry-core').tasks.preprocessCoffeeScript - - def outputDir = file('$buildDir/documentation/coffeescript') - - def sources = files() - - subprojects.each { sub -> - def coffeeDir = sub.file('src/main/coffeescript') - if (coffeeDir.exists()) { - sources += sub.fileTree(coffeeDir) { - include '**/*.coffee' - } - } - } - - sources += project(':tapestry-core').tasks.preprocessCoffeeScript.outputs.files.asFileTree -task typeScriptDocs() { - group "Documentation" - description "Builds typedoc documentation for all TypeScript sources" - dependsOn project(":tapestry-core").tasks.generateTypeScriptDocs ++tasks.register('typeScriptDocs') { ++ group = 'Documentation' ++ description = 'Builds typedoc documentation for all TypeScript sources' + - // Needs to be installed via 'npm install -g [email protected]' - executable TapestryBuildLogic.isWindows() ? 'docco.cmd' : 'docco' - args '--output', outputDir - args sources.files.sort({ a, b -> - a.name.compareTo b.name - }) ++ dependsOn(project(':tapestry-core').tasks.named('generateTypeScriptDocs')) } - dependencies { - if (JavaVersion.current() != JavaVersion.VERSION_1_8) { + if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) { meta aggregateJavadoc.outputs.files } } -task combinedJacocoReport(type:JacocoReport){ - def subprojectsToConsider = subprojects.findAll {it.name != 'quickstart' && it.name != 'beanmodel' && it.name != 'commons' && it.name != 'genericsresolver-guava' && it.name != 'tapestry5-annotations' && it.name != 'tapestry-internal-test' && it.name != 'tapestry-runner' && it.name != 'tapestry-test-constants' && it.name != 'tapestry-test-data' && it.name != 'tapestry-ioc-jcache'} - dependsOn = subprojectsToConsider.test - additionalSourceDirs.from(files(subprojectsToConsider.sourceSets.main.allSource.srcDirs)) - sourceDirectories.from(files(subprojectsToConsider.sourceSets.main.allSource.srcDirs)) - classDirectories.from(files(subprojectsToConsider.sourceSets.main.output)) - executionData.from(files(subprojectsToConsider.jacocoTestReport.executionData).filter { it.exists() }) - jacocoClasspath = files(subprojectsToConsider.jacocoTestReport.jacocoClasspath) - reports { - html { - required = true - destination = file("$buildDir/reports/jacoco") - } - xml { - required = false - } - csv { - required = false - } - } - onlyIf = { - true - } +tasks.register('combinedJacocoReport', JacocoReport) { + def excludedProjects = [ + 'quickstart', + 'beanmodel', + 'commons', + 'genericsresolver-guava', + 'tapestry5-annotations', + 'tapestry-internal-test', + 'tapestry-runner', + 'tapestry-test-constants', + 'tapestry-test-data', + 'tapestry-ioc-jcache' + ] + + def subprojectsToConsider = subprojects.findAll { + !excludedProjects.contains(it.name) + } + + dependsOn = subprojectsToConsider.test + + additionalSourceDirs.from(files(subprojectsToConsider.sourceSets.main.allSource.srcDirs)) + sourceDirectories.from(files(subprojectsToConsider.sourceSets.main.allSource.srcDirs)) + classDirectories.from(files(subprojectsToConsider.sourceSets.main.output)) + executionData.from(files(subprojectsToConsider.jacocoTestReport.executionData).filter { + it.exists() + }) + jacocoClasspath = files(subprojectsToConsider.jacocoTestReport.jacocoClasspath) + + reports { + html { + required = true + destination = file("${buildDir}/reports/jacoco") + } + xml.required = false + csv.required = false + } } -task continuousIntegration { +tasks.register('continuousIntegration') { + group = 'Verification' + description 'Runs a full CI build: assembles all artifacts, runs all checks, and generates aggregate reports.' + - dependsOn subprojects.check - dependsOn ':tapestry-core:testWithPrototype' - dependsOn combinedJacocoReport - dependsOn subprojects.assemble + def dependants = [ - 'tapestry-core:testWithPrototypeAndRequireJsDisabled', - 'tapestry-core:testWithJqueryAndRequireJsDisabled', - subprojects.build, // jQuery and Require.js enabled - 'tapestry-core:testWithPrototypeAndRequireJsEnabled', - combinedJacocoReport] ++ 'tapestry-core:testWithPrototypeAndRequireJsDisabled', ++ 'tapestry-core:testWithJqueryAndRequireJsDisabled', ++ 'tapestry-core:testWithPrototypeAndRequireJsEnabled', ++ subprojects.check, // jQuery and Require.js enabled ++ combinedJacocoReport ++ ] ++ + // tapestry-javadoc doesn't work with Java 8 anymore. That's why it's only added if != 8. + if (JavaVersion.current() != JavaVersion.VERSION_1_8) { + dependants << aggregateJavadoc + } - dependsOn dependants - description "Task executed on Jenkins CI server after Git commits" ++ ++ dependsOn(dependants) } -task zippedSources(type: Zip) { + +tasks.register('zippedSources', Zip) { description "Creates a combined Zip file of all sub-project's sources" - group "Release artifact" + group 'Release artifact' - - dependsOn('tapestry-beanvalidator:compileCoffeeScript') - dependsOn('tapestry-core:compileCoffeeScript') - dependsOn('tapestry-core:compileProcessedCoffeescript') + - dependsOn("tapestry-core:compileTypeScript") ++ dependsOn('tapestry-core:compileTypeScript') destinationDirectory = buildDir - archiveBaseName = "apache-tapestry" + archiveBaseName = 'apache-tapestry' version project.version - archiveClassifier = "sources" + archiveClassifier = 'sources' from project.projectDir - exclude "out/**" - exclude "**/*.iml" - exclude "**/*.ipr" - exclude "**/*.iws" - exclude "**/.*/**" - exclude "**/bin/**" - exclude "**/target/**" - exclude "**/build/**" - exclude "**/test-output/**" // Left around by TestNG sometimes - exclude "**/modules/***.js" - exclude "**/es-modules/***.js" + exclude 'out/**' + exclude '**/*.iml' + exclude '**/*.ipr' + exclude '**/*.iws' + exclude '**/.*/**' + exclude '**/bin/**' + exclude '**/target/**' + exclude '**/build/**' - exclude '**/test-output/**' // Left around by TestNG sometimes ++ exclude '**/test-output/**' // Left around by TestNG sometime ++ exclude '**/modules/***.js' ++ exclude '**/es-modules/***.js' } - tasks.register('zippedApidoc', Zip) { - dependsOn aggregateJavadoc - description "Zip archive of the project's aggregate JavaDoc and CoffeeScript documentation" + task zippedApidoc(type: Zip) { - dependsOn typeScriptDocs - dependsOn aggregateJavadoc + description "Zip archive of the project's aggregate JavaDoc and TypeScript documentation" - group "Release artifact" + group 'Release artifact' + ++ dependsOn(typeScriptDocs) ++ dependsOn(aggregateJavadoc) + destinationDirectory = buildDir - archiveBaseName = "apache-tapestry" + archiveBaseName = 'apache-tapestry' version project.version - archiveClassifier = "apidocs" + archiveClassifier = 'apidocs' - from file("src/docroot-template"), { + from file('src/docroot-template'), { filter ReplaceTokens, tokens: [version: project.version] - include "*.html" + include '*.html' } - from file("src/docroot-template"), { - exclude "*.html" + from file('src/docroot-template'), { + exclude '*.html' } - into "apidocs", { from aggregateJavadoc.outputs.files } - - - into "typescript", { from typeScriptDocs.outputs.files } + into 'apidocs', { + from aggregateJavadoc.outputs.files + } - - into 'coffeescript', { - from coffeeScriptDocs.outputs.files ++ into 'typescript', { ++ from typeScriptDocs.outputs.files + } } -task zippedBinaries(type: Zip) { - description "Zip archive of binaries of each sub-project" +tasks.register('zippedBinaries', Zip) { + description 'Zip archive of binaries of each sub-project' // TODO: Plus dependencies? - group "Release artifact" + group 'Release artifact' // This may create a few unwanted dependencies, but does // seem to ensure that the subprojects are created inputs.files subprojects*.configurations*.archives.artifacts.files diff --cc tapestry-beanvalidator/build.gradle index ebeaaa127,7c20eb3ea..cebf92705 --- a/tapestry-beanvalidator/build.gradle +++ b/tapestry-beanvalidator/build.gradle @@@ -1,44 -1,27 +1,30 @@@ +plugins { + id 'tapestry.testng-convention' +} + import t5build.* -description = "Support for JSR-303 Bean Validation via the Hibernate validator implementation" +description = 'Support for JSR-303 Bean Validation via the Hibernate validator implementation' dependencies { - implementation project(':tapestry-core') + implementation project(':tapestry-core') - implementation "jakarta.validation:jakarta.validation-api:3.0.2" - implementation "org.hibernate:hibernate-validator:8.0.1.Final" + implementation libs.jakarta.validation.api + implementation libs.hibernate.validator - testImplementation project(':tapestry-test') - implementation "org.seleniumhq.selenium:selenium-leg-rc:${versions.selenium}", { - exclude group: "org.seleniumhq.selenium", module: "jetty-repacked" - exclude group: "org.testng", module: "testng" - } - testImplementation "org.junit.jupiter:junit-jupiter:${versions.junitJupiter}" + implementation(libs.selenium.legrc) { + exclude group: 'org.seleniumhq.selenium', module: 'jetty-repacked' + exclude group: 'org.testng', module: 'testng' + } + testImplementation project(':tapestry-test') } - def generatedOutputBaseDir = 'src/main/generated' - - task compileCoffeeScript(type: CompileCoffeeScript) { - outputDir = "${generatedOutputBaseDir}/compiled-coffeescript" - } - // Start up the test app, useful when debugging failing integration tests task runTestApp303(type:JavaExec) { - main = 'org.apache.tapestry5.test.JettyRunner' - args "-d", "src/test/webapp", "-p", "8080" - classpath += project.sourceSets.test.runtimeClasspath + mainClass = 'org.apache.tapestry5.test.JettyRunner' + args '-d', 'src/test/webapp', '-p', '8080' + classpath += project.sourceSets.test.runtimeClasspath } - clean.delete generatedOutputBaseDir - - sourceSets { - main { - output.dir(compileCoffeeScript.outputDir, builtBy: compileCoffeeScript) - } - } - jar.manifest.attributes 'Tapestry-Module-Classes': 'org.apache.tapestry5.beanvalidator.modules.BeanValidatorModule' diff --cc tapestry-core/build.gradle index 0754de77d,1e66536cd..fb0c442ef --- a/tapestry-core/build.gradle +++ b/tapestry-core/build.gradle @@@ -1,15 -1,16 +1,15 @@@ -import org.gradle.plugins.ide.idea.model.* +plugins { + id 'tapestry.junit5-convention' + id 'tapestry.testng-convention' +} ++import t5build.TapestryBuildLogic import org.apache.tools.ant.filters.ReplaceTokens - import t5build.* -//import t5build.* - -description = "Central module for Tapestry, containing all core services and components" -project.ext { - mainGeneratedDir = "src/main/generated" - testGeneratedDir = "src/test/generated" -} +description = 'Central module for Tapestry, containing all core services and components' -clean.delete mainGeneratedDir, testGeneratedDir +def mainGeneratedDir = 'src/main/generated' +def testGeneratedDir = 'src/test/generated' dependencies { api project(':tapestry-ioc') @@@ -17,72 -18,145 +17,127 @@@ api project(':beanmodel') api project(':tapestry-http') - api "org.apache.commons:commons-lang3:${versions.commonsLang}" - - - implementation 'jakarta.annotation:jakarta.annotation-api:2.0.0' - implementation 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.2' + implementation libs.jakarta.annotation.api + implementation libs.jakarta.xml.bind.api - provided project(":tapestry-test") - provided project(":tapestry-test-constants") + implementation libs.commons.codec + implementation libs.commons.lang3 - provided "jakarta.servlet:jakarta.servlet-api:${versions.servletapi}" + provided project(':tapestry-test') + provided project(':tapestry-test-constants') - implementation "commons-codec:commons-codec:1.13" + provided libs.jakarta.servlet.api - testImplementation "org.junit.jupiter:junit-jupiter:${versions.junitJupiter}" - testImplementation "org.apache.httpcomponents:httpclient:4.5.14" - testRuntimeOnly project(':tapestry-spock') + testImplementation libs.httpcomponents.httpclient + testImplementation project(":tapestry-spock") - testRuntimeOnly "org.hsqldb:hsqldb:${versions.hsqldb}" - testRuntimeOnly 'com.google.inject:guice:3.0' + testRuntimeOnly("${libs.hsqldb.get().module.group}:${libs.hsqldb.get().module.name}:${libs.hsqldb.get().version}:jdk8") + testRuntimeOnly libs.guice } - tasks.register('preprocessCoffeeScript', PreprocessCoffeeScript) -def npmWorkingDir = "src/main/typescript/" ++def npmWorkingDir = 'src/main/typescript/' ++def npmExec = TapestryBuildLogic.isWindows() ? 'npm.cmd' : 'npm' - tasks.register('compileCoffeeScript', CompileCoffeeScript) { - outputDir = file("${mainGeneratedDir}/compiled-coffeescript") -task npmInstall(type: Exec) { - group "TypeScript" ++tasks.register('npmInstall', Exec) { ++ group 'TypeScript' + description "Runs npm install" + + workingDir = npmWorkingDir - commandLine isWindows() ? "npm.cmd" : "npm", 'install' ++ commandLine npmExec, 'install' } - tasks.register('compileProcessedCoffeescript', CompileCoffeeScript) { - dependsOn tasks.named('preprocessCoffeeScript') - srcDir tasks.named('preprocessCoffeeScript').map { it.outputDir } - outputDir = file("${mainGeneratedDir}/compiled-processed-coffeescript") -task compileTypeScriptToAmd(type: Exec) { ++tasks.register('compileTypeScriptToAmd', Exec) { ++ group 'TypeScript' ++ + dependsOn npmInstall + + workingDir = npmWorkingDir - commandLine isWindows() ? "npm.cmd" : "npm", 'run', 'build-amd' ++ commandLine npmExec, 'run', 'build-amd' } - tasks.register('compileTestCoffeeScript', CompileCoffeeScript) { - srcDir = file('src/test/coffeescript') - outputDir = file("${testGeneratedDir}/compiled-coffeescript") -task compileTypeScriptToEsModule(type: Exec) { ++tasks.register('compileTypeScriptToEsModule', Exec) { ++ group 'TypeScript' ++ + dependsOn npmInstall + + workingDir = npmWorkingDir - commandLine isWindows() ? "npm.cmd" : "npm", 'run', 'build-es-module' ++ commandLine npmExec, 'run', 'build-es-module' } - tasks.named('processResources') { - from tasks.named('compileCoffeeScript') - from tasks.named('compileProcessedCoffeescript') -task compileTypeScript() { - dependsOn compileTypeScriptToAmd - dependsOn compileTypeScriptToEsModule ++tasks.register('compileTypeScript', Delete) { ++ group = 'TypeScript' ++ ++ dependsOn(compileTypeScriptToAmd) ++ dependsOn(compileTypeScriptToEsModule) } - tasks.named('processTestResources') { - from tasks.named('compileTestCoffeeScript') -task generateTypeScriptDocs(type: Exec) { ++tasks.register('generateTypeScriptDocs', Exec) { ++ group 'TypeScript' ++ + dependsOn npmInstall + + workingDir = npmWorkingDir - commandLine isWindows() ? "npm.cmd" : "npm", 'run', 'docs' ++ commandLine npmExec, 'run', 'docs' } - clean { - delete mainGeneratedDir, testGeneratedDir -task cleanTypeScriptFiles(type: Delete) { ++tasks.register('cleanTypeScriptFiles', Delete) { + delete fileTree("src/main/resources/META-INF/assets/es-modules/t5/core") { + include '**.js' + } + delete fileTree("src/main/resources/META-INF/modules/t5/core") { + include '**.js' + } + delete "src/main/typescript/docs" } - tasks.register('testWithPrototype', Test) { - systemProperties['tapestry.javascript-infrastructure-provider'] = 'prototype' + processResources.dependsOn compileTypeScript + clean.dependsOn cleanTypeScriptFiles + + // Not sure why this is necessary: + compileTestGroovy.dependsOn compileTestJava + + test { - // Needed to have XMLTokenStreamTests.testStreamEncoding() passing on Java 9+ ++ // Needed to have XMLTokenStreamTests.testStreamEncoding() passing on Java 9+ + if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_1_9)) { - jvmArgs("--add-opens=java.base/java.nio.charset=ALL-UNNAMED"); ++ jvmArgs('--add-opens=java.base/java.nio.charset=ALL-UNNAMED') + } - // TAP5-2722 - systemProperty 'user.language', 'en' -} + -task runTestApp1(type:JavaExec) { - description 'Start app1 integration test app, useful when debugging failing integration tests' - main = 'org.apache.tapestry5.test.JettyRunner' - args "-d", "src/test/app1", "-p", "8080" - classpath += project.sourceSets.test.runtimeClasspath -} -task runTestApp2(type:JavaExec) { - description 'Start app2 integration test app, useful when debugging failing integration tests' - main = 'org.apache.tapestry5.test.JettyRunner' - args "-d", "src/test/app2", "-p", "8080" - classpath += project.sourceSets.test.runtimeClasspath -} -task runTestApp3(type:JavaExec) { - description 'Start app3 integration test app, useful when debugging failing integration tests' - main = 'org.apache.tapestry5.test.JettyRunner' - args "-d", "src/test/app3", "-p", "8080" - classpath += project.sourceSets.test.runtimeClasspath -} -task runTestApp4(type:JavaExec) { - description 'Start app4 integration test app, useful when debugging failing integration tests' - main = 'org.apache.tapestry5.test.JettyRunner' - args "-d", "src/test/app4", "-p", "8080" - classpath += project.sourceSets.test.runtimeClasspath -} -task runTestApp5(type:JavaExec) { - description 'Start app5 integration test app, useful when debugging failing integration tests' - main = 'org.apache.tapestry5.test.JettyRunner' - args "-d", "src/test/app5", "-p", "8080" - classpath += project.sourceSets.test.runtimeClasspath -} -task runTestApp7(type:JavaExec) { - description 'Start app7 integration test app, useful when debugging failing integration tests' - main = 'org.apache.tapestry5.test.JettyRunner' - args "-d", "src/test/app7", "-p", "8080" - classpath += project.sourceSets.test.runtimeClasspath -} -task runTestAppfolder(type:JavaExec) { - description 'Start appFolder integration test app, useful when debugging failing integration tests' - main = 'org.apache.tapestry5.test.JettyRunner' - args "-d", "src/test/appfolder", "-p", "8080" - classpath += project.sourceSets.test.runtimeClasspath ++ // TAP5-2722 ++ systemProperty 'user.language', 'en' +} + +[ + 'app1', + 'app2', + 'app3', + 'app4', + 'app5', + 'app7', + 'appfolder' +].each { appName -> + tasks.register("runTest${appName.capitalize()}", JavaExec) { + group = 'Application' + description = "Starts the ${appName} integration test app, useful when debugging." + mainClass = 'org.apache.tapestry5.test.JettyRunner' + args '-d', "src/test/${appName}", '-p', '8080' + classpath = sourceSets.test.runtimeClasspath + } } + + // Default is jQuery and Require.js enabled, so here are the tests for the + // other combinations + -task testWithJqueryAndRequireJsDisabled(type:Test) { - systemProperties."tapestry.javascript-infrastructure-provider" = "jquery" - systemProperties."tapestry.require-js-enabled" = "false" ++task testWithJqueryAndRequireJsDisabled(type: Test) { ++ systemProperties."tapestry.javascript-infrastructure-provider" = 'jquery' ++ systemProperties."tapestry.require-js-enabled" = 'false' + } + -task testWithPrototypeAndRequireJsEnabled(type:Test) { - systemProperties."tapestry.javascript-infrastructure-provider" = "prototype" - systemProperties."tapestry.require-js-enabled" = "true" ++task testWithPrototypeAndRequireJsEnabled(type: Test) { ++ systemProperties."tapestry.javascript-infrastructure-provider" = 'prototype' ++ systemProperties."tapestry.require-js-enabled" = 'true' + } + -task testWithPrototypeAndRequireJsDisabled(type:Test) { - systemProperties."tapestry.javascript-infrastructure-provider" = "prototype" - systemProperties."tapestry.require-js-enabled" = "false" -} ++task testWithPrototypeAndRequireJsDisabled(type: Test) { ++ systemProperties."tapestry.javascript-infrastructure-provider" = 'prototype' ++ systemProperties."tapestry.require-js-enabled" = 'false' ++} diff --cc tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java index fd2dd3e2c,56dd77954..55ca74927 --- a/tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java +++ b/tapestry-test/src/main/java/org/apache/tapestry5/test/SeleniumTestCase.java @@@ -12,12 -12,10 +12,14 @@@ package org.apache.tapestry5.test; -import com.thoughtworks.selenium.CommandProcessor; -import com.thoughtworks.selenium.Selenium; -import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium; -import com.thoughtworks.selenium.webdriven.WebDriverCommandProcessor; +import java.io.File; +import java.lang.reflect.Method; +import java.time.Duration; +import java.util.ArrayList; ++import java.util.HashMap; +import java.util.List; ++import java.util.Map; +import java.util.concurrent.TimeUnit; import org.apache.tapestry5.test.constants.TapestryRunnerConstants; import org.openqa.selenium.By;
