You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by tv...@apache.org on 2024/05/06 19:14:06 UTC

(beam) 01/01: Move lint, yapf and dependency compat tests to from py38 to py39

This is an automated email from the ASF dual-hosted git repository.

tvalentyn pushed a commit to branch tvalentyn-gha-py39
in repository https://gitbox.apache.org/repos/asf/beam.git

commit 550b5d7a172b20d3d791100e22a5a71ae52f03d5
Author: Valentyn Tymofieiev <va...@google.com>
AuthorDate: Mon May 6 11:26:55 2024 -0700

    Move lint, yapf and dependency compat tests to from py38 to py39
---
 .../beam_PostCommit_Python_Dependency.yml          |   4 +-
 .../workflows/beam_PreCommit_PythonFormatter.yml   |   2 +-
 .github/workflows/beam_PreCommit_PythonLint.yml    |   2 +-
 .../workflows/beam_PreCommit_Python_Coverage.yml   |   4 +-
 .github/workflows/beam_PreCommit_Whitespace.yml    |   2 +-
 build.gradle.kts                                   |  14 +-
 sdks/python/test-suites/tox/py38/build.gradle      | 184 ---------------------
 sdks/python/test-suites/tox/py39/build.gradle      | 182 ++++++++++++++++++++
 8 files changed, 196 insertions(+), 198 deletions(-)

diff --git a/.github/workflows/beam_PostCommit_Python_Dependency.yml b/.github/workflows/beam_PostCommit_Python_Dependency.yml
index 51a3a572234..12f353c4152 100644
--- a/.github/workflows/beam_PostCommit_Python_Dependency.yml
+++ b/.github/workflows/beam_PostCommit_Python_Dependency.yml
@@ -77,11 +77,11 @@ jobs:
         uses: ./.github/actions/setup-environment-action
         with:
           java-version: 8
-          python-version: 3.8
+          python-version: 3.9
       - name: Run postCommitPyDep
         uses: ./.github/actions/gradle-command-self-hosted-action
         with:
-          gradle-command: :sdks:python:test-suites:tox:py38:postCommitPyDep
+          gradle-command: :sdks:python:test-suites:tox:py39:postCommitPyDep
       - name: Archive Python Test Results
         uses: actions/upload-artifact@v4
         if: failure()
diff --git a/.github/workflows/beam_PreCommit_PythonFormatter.yml b/.github/workflows/beam_PreCommit_PythonFormatter.yml
index 8eaf99ba83a..79d30b04ba0 100644
--- a/.github/workflows/beam_PreCommit_PythonFormatter.yml
+++ b/.github/workflows/beam_PreCommit_PythonFormatter.yml
@@ -81,7 +81,7 @@ jobs:
         uses: ./.github/actions/setup-environment-action
         with:
           java-version: 8
-          python-version: 3.8
+          python-version: 3.9
       - name: run pythonFormatterPreCommit script
         uses: ./.github/actions/gradle-command-self-hosted-action
         with:
diff --git a/.github/workflows/beam_PreCommit_PythonLint.yml b/.github/workflows/beam_PreCommit_PythonLint.yml
index 2cc469170d5..b69adfdea4c 100644
--- a/.github/workflows/beam_PreCommit_PythonLint.yml
+++ b/.github/workflows/beam_PreCommit_PythonLint.yml
@@ -81,7 +81,7 @@ jobs:
         uses: ./.github/actions/setup-environment-action
         with:
           java-version: 8
-          python-version: 3.8
+          python-version: 3.9
           go-version: 1.16
       - name: run pythonLintPreCommit script
         uses: ./.github/actions/gradle-command-self-hosted-action
diff --git a/.github/workflows/beam_PreCommit_Python_Coverage.yml b/.github/workflows/beam_PreCommit_Python_Coverage.yml
index 9d836ef6332..c71edef8acf 100644
--- a/.github/workflows/beam_PreCommit_Python_Coverage.yml
+++ b/.github/workflows/beam_PreCommit_Python_Coverage.yml
@@ -83,11 +83,11 @@ jobs:
         uses: ./.github/actions/setup-environment-action
         with:
           java-version: 8
-          python-version: 3.8
+          python-version: 3.9
       - name: Run preCommitPyCoverage
         uses: ./.github/actions/gradle-command-self-hosted-action
         with:
-          gradle-command: :sdks:python:test-suites:tox:py38:preCommitPyCoverage
+          gradle-command: :sdks:python:test-suites:tox:py39:preCommitPyCoverage
       - uses: codecov/codecov-action@v3
         with:
           flags: python
diff --git a/.github/workflows/beam_PreCommit_Whitespace.yml b/.github/workflows/beam_PreCommit_Whitespace.yml
index 4eba39f0824..f0b37e9fbd7 100644
--- a/.github/workflows/beam_PreCommit_Whitespace.yml
+++ b/.github/workflows/beam_PreCommit_Whitespace.yml
@@ -81,7 +81,7 @@ jobs:
         uses: ./.github/actions/setup-environment-action
         with:
           java-version: 8
-          python-version: 3.8
+          python-version: 3.9
       - name: run whitespacePreCommit script
         uses: ./.github/actions/gradle-command-self-hosted-action
         with:
diff --git a/build.gradle.kts b/build.gradle.kts
index 0fd98ad3b05..8780131f62b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -492,11 +492,11 @@ tasks.register("pythonDockerBuildPreCommit") {
 
 tasks.register("pythonLintPreCommit") {
   // TODO(https://github.com/apache/beam/issues/20209): Find a better way to specify lint and formatter tasks without hardcoding py version.
-  dependsOn(":sdks:python:test-suites:tox:py38:lint")
+  dependsOn(":sdks:python:test-suites:tox:py39:lint")
 }
 
 tasks.register("pythonFormatterPreCommit") {
-  dependsOn("sdks:python:test-suites:tox:py38:formatter")
+  dependsOn("sdks:python:test-suites:tox:py39:formatter")
 }
 
 tasks.register("python38PostCommit") {
@@ -566,15 +566,15 @@ tasks.register("javaExamplesDataflowPrecommit") {
 
 tasks.register("whitespacePreCommit") {
   // TODO(https://github.com/apache/beam/issues/20209): Find a better way to specify the tasks without hardcoding py version.
-  dependsOn(":sdks:python:test-suites:tox:py38:archiveFilesToLint")
-  dependsOn(":sdks:python:test-suites:tox:py38:unpackFilesToLint")
-  dependsOn(":sdks:python:test-suites:tox:py38:whitespacelint")
+  dependsOn(":sdks:python:test-suites:tox:py39:archiveFilesToLint")
+  dependsOn(":sdks:python:test-suites:tox:py39:unpackFilesToLint")
+  dependsOn(":sdks:python:test-suites:tox:py39:whitespacelint")
 }
 
 tasks.register("typescriptPreCommit") {
   // TODO(https://github.com/apache/beam/issues/20209): Find a better way to specify the tasks without hardcoding py version.
-  dependsOn(":sdks:python:test-suites:tox:py38:eslint")
-  dependsOn(":sdks:python:test-suites:tox:py38:jest")
+  dependsOn(":sdks:python:test-suites:tox:py39:eslint")
+  dependsOn(":sdks:python:test-suites:tox:py39:jest")
 }
 
 tasks.register("pushAllRunnersDockerImages") {
diff --git a/sdks/python/test-suites/tox/py38/build.gradle b/sdks/python/test-suites/tox/py38/build.gradle
index 46388532c1e..81083b6c441 100644
--- a/sdks/python/test-suites/tox/py38/build.gradle
+++ b/sdks/python/test-suites/tox/py38/build.gradle
@@ -26,188 +26,4 @@ applyPythonNature()
 // Required to setup a Python 3 virtualenv and task names.
 pythonVersion = '3.8'
 
-toxTask "formatter", "py3-yapf-check"
-check.dependsOn formatter
-
-// TODO(BEAM-12000): Move tasks that aren't specific to 3.8 to Py 3.9.
-def posargs = project.findProperty("posargs") ?: ""
-
-task lint {}
-check.dependsOn lint
-
-toxTask "lintPy38", "py38-lint", "${posargs}"
-lint.dependsOn lintPy38
-
-toxTask "mypyPy38", "py38-mypy", "${posargs}"
-lint.dependsOn mypyPy38
-
 apply from: "../common.gradle"
-
-
-toxTask "testPy38CloudCoverage", "py38-cloudcoverage", "${posargs}"
-test.dependsOn "testPy38CloudCoverage"
-project.tasks.register("preCommitPyCoverage") {
-      dependsOn = ["testPy38CloudCoverage"]
-}
-
-// Dep Postcommit runs test suites that evaluate compatibility of particular
-// dependencies. It is exercised on a single Python version.
-//
-// Should still leave at least one version in PreCommit unless the marked tests
-// are also exercised by existing PreCommit
-// e.g. pyarrow and pandas also run on PreCommit Dataframe and Coverage
-project.tasks.register("postCommitPyDep") {}
-
-// Create a test task for each supported major version of pyarrow
-toxTask "testPy38pyarrow-3", "py38-pyarrow-3", "${posargs}"
-test.dependsOn "testPy38pyarrow-3"
-postCommitPyDep.dependsOn "testPy38pyarrow-3"
-
-toxTask "testPy38pyarrow-4", "py38-pyarrow-4", "${posargs}"
-test.dependsOn "testPy38pyarrow-4"
-postCommitPyDep.dependsOn "testPy38pyarrow-4"
-
-toxTask "testPy38pyarrow-5", "py38-pyarrow-5", "${posargs}"
-test.dependsOn "testPy38pyarrow-5"
-postCommitPyDep.dependsOn "testPy38pyarrow-5"
-
-toxTask "testPy38pyarrow-6", "py38-pyarrow-6", "${posargs}"
-test.dependsOn "testPy38pyarrow-6"
-postCommitPyDep.dependsOn "testPy38pyarrow-6"
-
-toxTask "testPy38pyarrow-7", "py38-pyarrow-7", "${posargs}"
-test.dependsOn "testPy38pyarrow-7"
-postCommitPyDep.dependsOn "testPy38pyarrow-7"
-
-toxTask "testPy38pyarrow-8", "py38-pyarrow-8", "${posargs}"
-test.dependsOn "testPy38pyarrow-8"
-postCommitPyDep.dependsOn "testPy38pyarrow-8"
-
-toxTask "testPy38pyarrow-9", "py38-pyarrow-9", "${posargs}"
-test.dependsOn "testPy38pyarrow-9"
-postCommitPyDep.dependsOn "testPy38pyarrow-9"
-
-// Create a test task for each minor version of pandas
-toxTask "testPy38pandas-14", "py38-pandas-14", "${posargs}"
-test.dependsOn "testPy38pandas-14"
-postCommitPyDep.dependsOn "testPy38pandas-14"
-
-toxTask "testPy38pandas-15", "py38-pandas-15", "${posargs}"
-test.dependsOn "testPy38pandas-15"
-postCommitPyDep.dependsOn "testPy38pandas-15"
-
-toxTask "testPy38pandas-20", "py38-pandas-20", "${posargs}"
-test.dependsOn "testPy38pandas-20"
-postCommitPyDep.dependsOn "testPy38pandas-20"
-
-// Create a test task for each minor version of pytorch
-toxTask "testPy38pytorch-19", "py38-pytorch-19", "${posargs}"
-test.dependsOn "testPy38pytorch-19"
-postCommitPyDep.dependsOn "testPy38pytorch-19"
-
-toxTask "testPy38pytorch-110", "py38-pytorch-110", "${posargs}"
-test.dependsOn "testPy38pytorch-110"
-postCommitPyDep.dependsOn "testPy38pytorch-110"
-
-toxTask "testPy38pytorch-111", "py38-pytorch-111", "${posargs}"
-test.dependsOn "testPy38pytorch-111"
-postCommitPyDep.dependsOn "testPy38pytorch-111"
-
-toxTask "testPy38pytorch-112", "py38-pytorch-112", "${posargs}"
-test.dependsOn "testPy38pytorch-112"
-postCommitPyDep.dependsOn "testPy38pytorch-112"
-
-toxTask "testPy38pytorch-113", "py38-pytorch-113", "${posargs}"
-test.dependsOn "testPy38pytorch-113"
-postCommitPyDep.dependsOn "testPy38pytorch-113"
-
-// run on precommit
-toxTask "testPy38pytorch-200", "py38-pytorch-200", "${posargs}"
-test.dependsOn "testPy38pytorch-200"
-preCommitPyCoverage.dependsOn "testPy38pytorch-200"
-
-toxTask "testPy38tft-113", "py38-tft-113", "${posargs}"
-test.dependsOn "testPy38tft-113"
-preCommitPyCoverage.dependsOn "testPy38tft-113"
-
-// TODO(https://github.com/apache/beam/issues/25796) - uncomment onnx tox task once onnx supports protobuf 4.x.x
-// Create a test task for each minor version of onnx
-// toxTask "testPy38onnx-113", "py38-onnx-113", "${posargs}"
-// test.dependsOn "testPy38onnx-113"
-// postCommitPyDep.dependsOn "testPy38onnx-113"
-// Create a test task for each minor version of tensorflow
-toxTask "testPy38tensorflow-212", "py38-tensorflow-212", "${posargs}"
-test.dependsOn "testPy38tensorflow-212"
-preCommitPyCoverage.dependsOn "testPy38tensorflow-212"
-
-// Create a test task for each minor version of transformers
-toxTask "testPy38transformers-428", "py38-transformers-428", "${posargs}"
-test.dependsOn "testPy38transformers-428"
-postCommitPyDep.dependsOn "testPy38transformers-428"
-
-toxTask "testPy38transformers-429", "py38-transformers-429", "${posargs}"
-test.dependsOn "testPy38transformers-429"
-postCommitPyDep.dependsOn "testPy38transformers-429"
-
-// run on precommit
-toxTask "testPy38transformers-430", "py38-transformers-430", "${posargs}"
-test.dependsOn "testPy38transformers-430"
-preCommitPyCoverage.dependsOn "testPy38transformers-430"
-
-toxTask "testPy38embeddingsMLTransform", "py38-embeddings", "${posargs}"
-test.dependsOn "testPy38embeddingsMLTransform"
-preCommitPyCoverage.dependsOn "testPy38embeddingsMLTransform"
-
-// Part of MLTransform embeddings test suite but requires tensorflow hub, which we need to test on
-// mutliple versions so keeping this suite separate.
-toxTask "testPy38TensorflowHubEmbeddings-014", "py38-TFHubEmbeddings-014", "${posargs}"
-test.dependsOn "testPy38TensorflowHubEmbeddings-014"
-postCommitPyDep.dependsOn "testPy38TensorflowHubEmbeddings-014"
-
-// run on precommit
-toxTask "testPy38TensorflowHubEmbeddings-015", "py38-TFHubEmbeddings-015", "${posargs}"
-test.dependsOn "testPy38TensorflowHubEmbeddings-015"
-preCommitPyCoverage.dependsOn "testPy38TensorflowHubEmbeddings-015"
-
-toxTask "whitespacelint", "whitespacelint", "${posargs}"
-
-task archiveFilesToLint(type: Zip) {
-  archiveFileName = "files-to-whitespacelint.zip"
-  destinationDirectory = file("$buildDir/dist")
-
-  from ("$rootProject.projectDir") {
-    include "**/*.md"
-    include "**/build.gradle"
-    include '**/build.gradle.kts'
-    exclude '**/build/**' // intermediate build directory
-    exclude 'website/www/site/themes/docsy/**' // fork to google/docsy
-    exclude "**/node_modules/*"
-    exclude "**/.gogradle/*"
-  }
-}
-
-task unpackFilesToLint(type: Copy) {
-  from zipTree("$buildDir/dist/files-to-whitespacelint.zip")
-  into "$buildDir/files-to-whitespacelint"
-}
-
-whitespacelint.dependsOn archiveFilesToLint, unpackFilesToLint
-unpackFilesToLint.dependsOn archiveFilesToLint
-archiveFilesToLint.dependsOn cleanPython
-
-toxTask "jest", "jest", "${posargs}"
-
-toxTask "eslint", "eslint", "${posargs}"
-
-task copyTsSource(type: Copy) {
-  from ("$rootProject.projectDir") {
-    include "sdks/python/apache_beam/runners/interactive/extensions/**/*"
-    exclude "sdks/python/apache_beam/runners/interactive/extensions/**/lib/*"
-    exclude "sdks/python/apache_beam/runners/interactive/extensions/**/node_modules/*"
-  }
-  into "$buildDir/ts"
-}
-
-jest.dependsOn copyTsSource
-eslint.dependsOn copyTsSource
-copyTsSource.dependsOn cleanPython
diff --git a/sdks/python/test-suites/tox/py39/build.gradle b/sdks/python/test-suites/tox/py39/build.gradle
index 5bb73b60a5d..00b7702c0e9 100644
--- a/sdks/python/test-suites/tox/py39/build.gradle
+++ b/sdks/python/test-suites/tox/py39/build.gradle
@@ -27,3 +27,185 @@ applyPythonNature()
 pythonVersion = '3.9'
 
 apply from: "../common.gradle"
+
+toxTask "formatter", "py3-yapf-check"
+check.dependsOn formatter
+
+def posargs = project.findProperty("posargs") ?: ""
+
+task lint {}
+check.dependsOn lint
+
+toxTask "lintPy39", "py39-lint", "${posargs}"
+lint.dependsOn lintPy39
+
+toxTask "mypyPy39", "py39-mypy", "${posargs}"
+lint.dependsOn mypyPy39
+
+toxTask "testPy39CloudCoverage", "py39-cloudcoverage", "${posargs}"
+test.dependsOn "testPy39CloudCoverage"
+project.tasks.register("preCommitPyCoverage") {
+      dependsOn = ["testPy39CloudCoverage"]
+}
+
+// Dep Postcommit runs test suites that evaluate compatibility of particular
+// dependencies. It is exercised on a single Python version.
+//
+// Should still leave at least one version in PreCommit unless the marked tests
+// are also exercised by existing PreCommit
+// e.g. pyarrow and pandas also run on PreCommit Dataframe and Coverage
+project.tasks.register("postCommitPyDep") {}
+
+// Create a test task for each supported major version of pyarrow
+toxTask "testPy39pyarrow-3", "py39-pyarrow-3", "${posargs}"
+test.dependsOn "testPy39pyarrow-3"
+postCommitPyDep.dependsOn "testPy39pyarrow-3"
+
+toxTask "testPy39pyarrow-4", "py39-pyarrow-4", "${posargs}"
+test.dependsOn "testPy39pyarrow-4"
+postCommitPyDep.dependsOn "testPy39pyarrow-4"
+
+toxTask "testPy39pyarrow-5", "py39-pyarrow-5", "${posargs}"
+test.dependsOn "testPy39pyarrow-5"
+postCommitPyDep.dependsOn "testPy39pyarrow-5"
+
+toxTask "testPy39pyarrow-6", "py39-pyarrow-6", "${posargs}"
+test.dependsOn "testPy39pyarrow-6"
+postCommitPyDep.dependsOn "testPy39pyarrow-6"
+
+toxTask "testPy39pyarrow-7", "py39-pyarrow-7", "${posargs}"
+test.dependsOn "testPy39pyarrow-7"
+postCommitPyDep.dependsOn "testPy39pyarrow-7"
+
+toxTask "testPy39pyarrow-8", "py39-pyarrow-8", "${posargs}"
+test.dependsOn "testPy39pyarrow-8"
+postCommitPyDep.dependsOn "testPy39pyarrow-8"
+
+toxTask "testPy39pyarrow-9", "py39-pyarrow-9", "${posargs}"
+test.dependsOn "testPy39pyarrow-9"
+postCommitPyDep.dependsOn "testPy39pyarrow-9"
+
+// Create a test task for each minor version of pandas
+toxTask "testPy39pandas-14", "py39-pandas-14", "${posargs}"
+test.dependsOn "testPy39pandas-14"
+postCommitPyDep.dependsOn "testPy39pandas-14"
+
+toxTask "testPy39pandas-15", "py39-pandas-15", "${posargs}"
+test.dependsOn "testPy39pandas-15"
+postCommitPyDep.dependsOn "testPy39pandas-15"
+
+toxTask "testPy39pandas-20", "py39-pandas-20", "${posargs}"
+test.dependsOn "testPy39pandas-20"
+postCommitPyDep.dependsOn "testPy39pandas-20"
+
+// Create a test task for each minor version of pytorch
+toxTask "testPy39pytorch-19", "py39-pytorch-19", "${posargs}"
+test.dependsOn "testPy39pytorch-19"
+postCommitPyDep.dependsOn "testPy39pytorch-19"
+
+toxTask "testPy39pytorch-110", "py39-pytorch-110", "${posargs}"
+test.dependsOn "testPy39pytorch-110"
+postCommitPyDep.dependsOn "testPy39pytorch-110"
+
+toxTask "testPy39pytorch-111", "py39-pytorch-111", "${posargs}"
+test.dependsOn "testPy39pytorch-111"
+postCommitPyDep.dependsOn "testPy39pytorch-111"
+
+toxTask "testPy39pytorch-112", "py39-pytorch-112", "${posargs}"
+test.dependsOn "testPy39pytorch-112"
+postCommitPyDep.dependsOn "testPy39pytorch-112"
+
+toxTask "testPy39pytorch-113", "py39-pytorch-113", "${posargs}"
+test.dependsOn "testPy39pytorch-113"
+postCommitPyDep.dependsOn "testPy39pytorch-113"
+
+// run on precommit
+toxTask "testPy39pytorch-200", "py39-pytorch-200", "${posargs}"
+test.dependsOn "testPy39pytorch-200"
+preCommitPyCoverage.dependsOn "testPy39pytorch-200"
+
+toxTask "testPy39tft-113", "py39-tft-113", "${posargs}"
+test.dependsOn "testPy39tft-113"
+preCommitPyCoverage.dependsOn "testPy39tft-113"
+
+// TODO(https://github.com/apache/beam/issues/25796) - uncomment onnx tox task once onnx supports protobuf 4.x.x
+// Create a test task for each minor version of onnx
+// toxTask "testPy39onnx-113", "py39-onnx-113", "${posargs}"
+// test.dependsOn "testPy39onnx-113"
+// postCommitPyDep.dependsOn "testPy39onnx-113"
+// Create a test task for each minor version of tensorflow
+toxTask "testPy39tensorflow-212", "py39-tensorflow-212", "${posargs}"
+test.dependsOn "testPy39tensorflow-212"
+preCommitPyCoverage.dependsOn "testPy39tensorflow-212"
+
+// Create a test task for each minor version of transformers
+toxTask "testPy39transformers-428", "py39-transformers-428", "${posargs}"
+test.dependsOn "testPy39transformers-428"
+postCommitPyDep.dependsOn "testPy39transformers-428"
+
+toxTask "testPy39transformers-429", "py39-transformers-429", "${posargs}"
+test.dependsOn "testPy39transformers-429"
+postCommitPyDep.dependsOn "testPy39transformers-429"
+
+// run on precommit
+toxTask "testPy39transformers-430", "py39-transformers-430", "${posargs}"
+test.dependsOn "testPy39transformers-430"
+preCommitPyCoverage.dependsOn "testPy39transformers-430"
+
+toxTask "testPy39embeddingsMLTransform", "py39-embeddings", "${posargs}"
+test.dependsOn "testPy39embeddingsMLTransform"
+preCommitPyCoverage.dependsOn "testPy39embeddingsMLTransform"
+
+// Part of MLTransform embeddings test suite but requires tensorflow hub, which we need to test on
+// mutliple versions so keeping this suite separate.
+toxTask "testPy39TensorflowHubEmbeddings-014", "py39-TFHubEmbeddings-014", "${posargs}"
+test.dependsOn "testPy39TensorflowHubEmbeddings-014"
+postCommitPyDep.dependsOn "testPy39TensorflowHubEmbeddings-014"
+
+// run on precommit
+toxTask "testPy39TensorflowHubEmbeddings-015", "py39-TFHubEmbeddings-015", "${posargs}"
+test.dependsOn "testPy39TensorflowHubEmbeddings-015"
+preCommitPyCoverage.dependsOn "testPy39TensorflowHubEmbeddings-015"
+
+toxTask "whitespacelint", "whitespacelint", "${posargs}"
+
+task archiveFilesToLint(type: Zip) {
+  archiveFileName = "files-to-whitespacelint.zip"
+  destinationDirectory = file("$buildDir/dist")
+
+  from ("$rootProject.projectDir") {
+    include "**/*.md"
+    include "**/build.gradle"
+    include '**/build.gradle.kts'
+    exclude '**/build/**' // intermediate build directory
+    exclude 'website/www/site/themes/docsy/**' // fork to google/docsy
+    exclude "**/node_modules/*"
+    exclude "**/.gogradle/*"
+  }
+}
+
+task unpackFilesToLint(type: Copy) {
+  from zipTree("$buildDir/dist/files-to-whitespacelint.zip")
+  into "$buildDir/files-to-whitespacelint"
+}
+
+whitespacelint.dependsOn archiveFilesToLint, unpackFilesToLint
+unpackFilesToLint.dependsOn archiveFilesToLint
+archiveFilesToLint.dependsOn cleanPython
+
+toxTask "jest", "jest", "${posargs}"
+
+toxTask "eslint", "eslint", "${posargs}"
+
+task copyTsSource(type: Copy) {
+  from ("$rootProject.projectDir") {
+    include "sdks/python/apache_beam/runners/interactive/extensions/**/*"
+    exclude "sdks/python/apache_beam/runners/interactive/extensions/**/lib/*"
+    exclude "sdks/python/apache_beam/runners/interactive/extensions/**/node_modules/*"
+  }
+  into "$buildDir/ts"
+}
+
+jest.dependsOn copyTsSource
+eslint.dependsOn copyTsSource
+copyTsSource.dependsOn cleanPython