You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by "hussein-awala (via GitHub)" <gi...@apache.org> on 2026/02/04 00:16:15 UTC

[PR] Make Mypy plugins installable [airflow]

hussein-awala opened a new pull request, #61422:
URL: https://github.com/apache/airflow/pull/61422

   closes: #38796
   
   TODO:
   - Implement release preparation commands
   - Create `README_RELEASE_MYPY.md` to describe the release process


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

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

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


Re: [PR] Make Mypy plugins installable [airflow]

Posted by "Copilot (via GitHub)" <gi...@apache.org>.
Copilot commented on code in PR #61422:
URL: https://github.com/apache/airflow/pull/61422#discussion_r3070079752


##########
dev/breeze/src/airflow_breeze/commands/release_management_commands.py:
##########
@@ -759,6 +763,35 @@ def prepare_airflow_ctl_distributions(
     )
 
 
+@release_management_group.command(
+    name="prepare-mypy-distributions",
+    help="Prepare sdist/whl distributions of Apache Airflow Mypy.",
+)
+@option_distribution_format
+@option_version_suffix
+@option_use_local_hatch
+@option_verbose
+@option_dry_run
+def prepare_mypy_distributions(
+    distribution_format: str,
+    version_suffix: str,
+    use_local_hatch: bool,
+):
+    _prepare_non_core_distributions(
+        # Argument parameters
+        distribution_format=distribution_format,
+        version_suffix=version_suffix,
+        use_local_hatch=use_local_hatch,
+        # Distribution specific parameters
+        root_path=MYPY_ROOT_PATH,
+        init_file_path=MYPY_SOURCES_PATH / "airflow_mypy" / "__init__.py",
+        distribution_path=MYPY_DIST_PATH,
+        distribution_name="mypy",

Review Comment:
   `prepare-mypy-distributions` passes `distribution_name="mypy"` into `_prepare_non_core_distributions`, but that helper uses `distribution_name` to set the Docker workdir and copy path (`/opt/airflow/{distribution_name}`); the mypy project lives under `dev/mypy`, so Docker builds/copies will look in a non-existent `/opt/airflow/mypy` directory and fail unless `--use-local-hatch` is used. Consider passing the repo-relative path (e.g. `dev/mypy`) to the Docker workdir/copy logic (or extending `_prepare_non_core_distributions` with a separate `distribution_directory`/`workdir` parameter) while keeping a stable short name for container IDs/logging.
   ```suggestion
           distribution_name="dev/mypy",
   ```



##########
dev/README_RELEASE_MYPY.md:
##########
@@ -0,0 +1,243 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update -->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+**Table of contents**
+
+- [What the apache-airflow-mypy distribution is](#what-the-apache-airflow-mypy-distribution-is)
+- [Decide when to release](#decide-when-to-release)
+- [Versioning](#versioning)
+- [Prepare Regular apache-airflow-mypy distributions (RC)](#prepare-regular-apache-airflow-mypy-distributions-rc)
+  - [Generate release notes](#generate-release-notes)
+  - [Build apache-airflow-mypy distributions for SVN apache upload](#build-apache-airflow-mypy-distributions-for-svn-apache-upload)
+  - [Build and sign the source and convenience packages](#build-and-sign-the-source-and-convenience-packages)
+  - [Add tags in git](#add-tags-in-git)
+  - [Commit the source packages to Apache SVN repo](#commit-the-source-packages-to-apache-svn-repo)
+  - [Publish the distributions to PyPI (release candidates)](#publish-the-distributions-to-pypi-release-candidates)
+  - [Prepare voting email](#prepare-voting-email)
+  - [Verify the release candidate](#verify-the-release-candidate)
+- [Publish release](#publish-release)
+  - [Summarize the voting](#summarize-the-voting)
+  - [Publish release to SVN](#publish-release-to-svn)
+  - [Publish the packages to PyPI](#publish-the-packages-to-pypi)
+  - [Add tags in git](#add-tags-in-git-1)
+  - [Notify developers of release](#notify-developers-of-release)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+------------------------------------------------------------------------------------------------------------
+
+# What the apache-airflow-mypy distribution is
+
+The `apache-airflow-mypy` package provides Mypy plugins for Apache Airflow to enhance type checking capabilities.
+It includes plugins for typed decorators and operator output type handling.
+
+The Release Manager prepares `apache-airflow-mypy` packages separately from the main Airflow Release, using
+`breeze` commands and accompanying scripts. This document provides an overview of the command line tools
+needed to prepare the packages.
+
+# Decide when to release
+
+You can release `apache-airflow-mypy` distributions separately from the main Airflow on an ad-hoc basis,
+whenever we find that the mypy plugins need to be released - due to new features, bug fixes, or improvements
+to type checking support.
+
+# Versioning
+
+We are using the [SEMVER](https://semver.org/) versioning scheme for the `apache-airflow-mypy` distributions.
+This is to give users confidence about maintaining backwards compatibility in new releases.
+
+- **Major version** (X.0.0): Breaking changes to plugin interfaces or behavior
+- **Minor version** (0.X.0): New features, new plugins, or significant enhancements
+- **Patch version** (0.0.X): Bug fixes and minor improvements
+
+# Prepare Regular apache-airflow-mypy distributions (RC)
+
+## Generate release notes
+
+Before releasing, update the `RELEASE_NOTES.rst` file with the changes since the last release.
+You can use towncrier to generate release notes from newsfragments:
+
+```bash
+cd dev/mypy
+towncrier build --version <VERSION>
+```
+
+To preview the release notes without writing to the file:
+
+```bash
+towncrier build --version <VERSION> --draft
+```
+
+Review and edit the generated release notes as needed.
+
+## Build apache-airflow-mypy distributions for SVN apache upload
+
+The Release Manager can use the `breeze` tool to build the package:
+
+```bash
+breeze release-management prepare-mypy-distributions \
+    --distribution-format both \
+    --version-suffix-for-pypi rc1
+```
+
+## Build and sign the source and convenience packages
+
+Follow the same signing process as other Airflow packages:
+
+```bash
+cd dist
+for file in *.tar.gz *.whl; do
+    gpg --armor --detach-sign $file
+    sha512sum $file > $file.sha512
+done
+```
+
+## Add tags in git
+
+Tag the release candidate in git:
+
+```bash
+git tag -s apache-airflow-mypy-<VERSION>rc<RC> -m "Apache Airflow Mypy <VERSION>rc<RC>"
+git push origin apache-airflow-mypy-<VERSION>rc<RC>
+```
+
+## Commit the source packages to Apache SVN repo
+
+Follow the standard Apache release process for committing to the SVN repository.
+
+## Publish the distributions to PyPI (release candidates)
+
+Release candidates should be published to TestPyPI first:
+
+```bash
+twine upload --repository testpypi dist/apache_airflow.mypy-<VERSION>rc<RC>*
+```
+
+## Prepare voting email
+
+Send a voting email to dev@airflow.apache.org with the following template:
+
+```
+Subject: [VOTE] Release Apache Airflow Mypy <VERSION> based on <VERSION>rc<RC>
+
+Hello Apache Airflow Community,
+
+This is a call for the vote to release Apache Airflow Mypy version <VERSION>.
+
+The release candidate is available at:
+https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy-<VERSION>rc<RC>/
+
+The packages are available at TestPyPI:
+https://test.pypi.org/project/apache-airflow-mypy/<VERSION>rc<RC>/
+
+The vote will be open for at least 72 hours.
+
+[ ] +1 Approve the release
+[ ] +0 No opinion
+[ ] -1 Do not release (please provide specific comments)
+
+Only PMC votes are binding, but everyone is welcome to check and vote.
+
+Best regards,
+<YOUR NAME>
+```
+
+## Verify the release candidate
+
+Verify the release by:
+
+1. Installing from TestPyPI:
+
+   ```bash
+   pip install --index-url https://test.pypi.org/simple/ apache-airflow-mypy==<VERSION>rc<RC>
+   ```
+
+2. Testing the plugins in a mypy configuration:
+
+   ```ini
+   [mypy]
+   plugins = airflow.mypy.plugins.decorators, airflow.mypy.plugins.outputs
+   ```
+
+3. Running the test suite if available
+
+# Publish release
+
+## Summarize the voting
+
+Once the vote passes, summarize the results in a reply to the voting thread.
+
+## Publish release to SVN
+
+Move the release from dev to release in SVN:
+
+```bash
+svn mv https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy-<VERSION>rc<RC> \
+       https://dist.apache.org/repos/dist/release/airflow/apache-airflow-mypy-<VERSION> \
+       -m "Release Apache Airflow Mypy <VERSION>"
+```
+
+## Publish the packages to PyPI
+
+Publish the final release to PyPI:
+
+```bash
+twine upload dist/apache_airflow.mypy-<VERSION>-py3-none-any.whl
+twine upload dist/apache_airflow.mypy-<VERSION>.tar.gz

Review Comment:
   The final-release `twine upload` commands also use `apache_airflow.mypy-...` filenames; these should match the actual wheel/sdist names produced for `apache-airflow-mypy` (typically `apache_airflow_mypy-...`).
   ```suggestion
   twine upload dist/apache_airflow_mypy-<VERSION>-py3-none-any.whl
   twine upload dist/apache_airflow_mypy-<VERSION>.tar.gz
   ```



##########
dev/breeze/src/airflow_breeze/commands/release_management_commands.py:
##########
@@ -759,6 +763,35 @@ def prepare_airflow_ctl_distributions(
     )
 
 
+@release_management_group.command(
+    name="prepare-mypy-distributions",
+    help="Prepare sdist/whl distributions of Apache Airflow Mypy.",
+)
+@option_distribution_format
+@option_version_suffix
+@option_use_local_hatch
+@option_verbose
+@option_dry_run
+def prepare_mypy_distributions(
+    distribution_format: str,
+    version_suffix: str,
+    use_local_hatch: bool,
+):
+    _prepare_non_core_distributions(
+        # Argument parameters
+        distribution_format=distribution_format,
+        version_suffix=version_suffix,
+        use_local_hatch=use_local_hatch,
+        # Distribution specific parameters
+        root_path=MYPY_ROOT_PATH,
+        init_file_path=MYPY_SOURCES_PATH / "airflow_mypy" / "__init__.py",
+        distribution_path=MYPY_DIST_PATH,
+        distribution_name="mypy",
+        distribution_pretty_name="Mypy",
+        full_distribution_pretty_name="Apache Airflow Mypy",
+    )

Review Comment:
   When `--use-local-hatch` is enabled, `_prepare_non_core_distributions` calls `DistributionPackageInfo.dist_packages(... build_type=DistributionBuildType(distribution_name))`. With `distribution_name="mypy"`, this becomes `DistributionBuildType.MYPY`, but `dist_packages()` doesn’t special-case that build type and falls back to provider glob patterns, so it won’t discover the built `apache_airflow_mypy*` artifacts for the sdist→wheel checks/listing. Add MYPY handling in `dist_packages()` (glob prefix `apache_airflow_mypy`).



##########
dev/README_RELEASE_MYPY.md:
##########
@@ -0,0 +1,243 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update -->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+**Table of contents**
+
+- [What the apache-airflow-mypy distribution is](#what-the-apache-airflow-mypy-distribution-is)
+- [Decide when to release](#decide-when-to-release)
+- [Versioning](#versioning)
+- [Prepare Regular apache-airflow-mypy distributions (RC)](#prepare-regular-apache-airflow-mypy-distributions-rc)
+  - [Generate release notes](#generate-release-notes)
+  - [Build apache-airflow-mypy distributions for SVN apache upload](#build-apache-airflow-mypy-distributions-for-svn-apache-upload)
+  - [Build and sign the source and convenience packages](#build-and-sign-the-source-and-convenience-packages)
+  - [Add tags in git](#add-tags-in-git)
+  - [Commit the source packages to Apache SVN repo](#commit-the-source-packages-to-apache-svn-repo)
+  - [Publish the distributions to PyPI (release candidates)](#publish-the-distributions-to-pypi-release-candidates)
+  - [Prepare voting email](#prepare-voting-email)
+  - [Verify the release candidate](#verify-the-release-candidate)
+- [Publish release](#publish-release)
+  - [Summarize the voting](#summarize-the-voting)
+  - [Publish release to SVN](#publish-release-to-svn)
+  - [Publish the packages to PyPI](#publish-the-packages-to-pypi)
+  - [Add tags in git](#add-tags-in-git-1)
+  - [Notify developers of release](#notify-developers-of-release)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+------------------------------------------------------------------------------------------------------------
+
+# What the apache-airflow-mypy distribution is
+
+The `apache-airflow-mypy` package provides Mypy plugins for Apache Airflow to enhance type checking capabilities.
+It includes plugins for typed decorators and operator output type handling.
+
+The Release Manager prepares `apache-airflow-mypy` packages separately from the main Airflow Release, using
+`breeze` commands and accompanying scripts. This document provides an overview of the command line tools
+needed to prepare the packages.
+
+# Decide when to release
+
+You can release `apache-airflow-mypy` distributions separately from the main Airflow on an ad-hoc basis,
+whenever we find that the mypy plugins need to be released - due to new features, bug fixes, or improvements
+to type checking support.
+
+# Versioning
+
+We are using the [SEMVER](https://semver.org/) versioning scheme for the `apache-airflow-mypy` distributions.
+This is to give users confidence about maintaining backwards compatibility in new releases.
+
+- **Major version** (X.0.0): Breaking changes to plugin interfaces or behavior
+- **Minor version** (0.X.0): New features, new plugins, or significant enhancements
+- **Patch version** (0.0.X): Bug fixes and minor improvements
+
+# Prepare Regular apache-airflow-mypy distributions (RC)
+
+## Generate release notes
+
+Before releasing, update the `RELEASE_NOTES.rst` file with the changes since the last release.
+You can use towncrier to generate release notes from newsfragments:
+
+```bash
+cd dev/mypy
+towncrier build --version <VERSION>
+```
+
+To preview the release notes without writing to the file:
+
+```bash
+towncrier build --version <VERSION> --draft
+```
+
+Review and edit the generated release notes as needed.
+
+## Build apache-airflow-mypy distributions for SVN apache upload
+
+The Release Manager can use the `breeze` tool to build the package:
+
+```bash
+breeze release-management prepare-mypy-distributions \
+    --distribution-format both \
+    --version-suffix-for-pypi rc1
+```
+
+## Build and sign the source and convenience packages
+
+Follow the same signing process as other Airflow packages:
+
+```bash
+cd dist
+for file in *.tar.gz *.whl; do
+    gpg --armor --detach-sign $file
+    sha512sum $file > $file.sha512
+done
+```
+
+## Add tags in git
+
+Tag the release candidate in git:
+
+```bash
+git tag -s apache-airflow-mypy-<VERSION>rc<RC> -m "Apache Airflow Mypy <VERSION>rc<RC>"
+git push origin apache-airflow-mypy-<VERSION>rc<RC>
+```
+
+## Commit the source packages to Apache SVN repo
+
+Follow the standard Apache release process for committing to the SVN repository.
+
+## Publish the distributions to PyPI (release candidates)
+
+Release candidates should be published to TestPyPI first:
+
+```bash
+twine upload --repository testpypi dist/apache_airflow.mypy-<VERSION>rc<RC>*
+```
+
+## Prepare voting email
+
+Send a voting email to dev@airflow.apache.org with the following template:
+
+```
+Subject: [VOTE] Release Apache Airflow Mypy <VERSION> based on <VERSION>rc<RC>
+
+Hello Apache Airflow Community,
+
+This is a call for the vote to release Apache Airflow Mypy version <VERSION>.
+
+The release candidate is available at:
+https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy-<VERSION>rc<RC>/
+
+The packages are available at TestPyPI:
+https://test.pypi.org/project/apache-airflow-mypy/<VERSION>rc<RC>/
+
+The vote will be open for at least 72 hours.
+
+[ ] +1 Approve the release
+[ ] +0 No opinion
+[ ] -1 Do not release (please provide specific comments)
+
+Only PMC votes are binding, but everyone is welcome to check and vote.
+
+Best regards,
+<YOUR NAME>
+```
+
+## Verify the release candidate
+
+Verify the release by:
+
+1. Installing from TestPyPI:
+
+   ```bash
+   pip install --index-url https://test.pypi.org/simple/ apache-airflow-mypy==<VERSION>rc<RC>
+   ```
+
+2. Testing the plugins in a mypy configuration:
+
+   ```ini
+   [mypy]
+   plugins = airflow.mypy.plugins.decorators, airflow.mypy.plugins.outputs
+   ```

Review Comment:
   The mypy configuration examples reference `airflow.mypy.plugins.*`, but the package/modules introduced in this PR are `airflow_mypy.plugins.*` (as also configured in the repo’s `pyproject.toml`). Update the docs so users can actually import/load the plugins after `pip install apache-airflow-mypy`.



##########
dev/README_RELEASE_MYPY.md:
##########
@@ -0,0 +1,243 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update -->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+**Table of contents**
+
+- [What the apache-airflow-mypy distribution is](#what-the-apache-airflow-mypy-distribution-is)
+- [Decide when to release](#decide-when-to-release)
+- [Versioning](#versioning)
+- [Prepare Regular apache-airflow-mypy distributions (RC)](#prepare-regular-apache-airflow-mypy-distributions-rc)
+  - [Generate release notes](#generate-release-notes)
+  - [Build apache-airflow-mypy distributions for SVN apache upload](#build-apache-airflow-mypy-distributions-for-svn-apache-upload)
+  - [Build and sign the source and convenience packages](#build-and-sign-the-source-and-convenience-packages)
+  - [Add tags in git](#add-tags-in-git)
+  - [Commit the source packages to Apache SVN repo](#commit-the-source-packages-to-apache-svn-repo)
+  - [Publish the distributions to PyPI (release candidates)](#publish-the-distributions-to-pypi-release-candidates)
+  - [Prepare voting email](#prepare-voting-email)
+  - [Verify the release candidate](#verify-the-release-candidate)
+- [Publish release](#publish-release)
+  - [Summarize the voting](#summarize-the-voting)
+  - [Publish release to SVN](#publish-release-to-svn)
+  - [Publish the packages to PyPI](#publish-the-packages-to-pypi)
+  - [Add tags in git](#add-tags-in-git-1)
+  - [Notify developers of release](#notify-developers-of-release)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+------------------------------------------------------------------------------------------------------------
+
+# What the apache-airflow-mypy distribution is
+
+The `apache-airflow-mypy` package provides Mypy plugins for Apache Airflow to enhance type checking capabilities.
+It includes plugins for typed decorators and operator output type handling.
+
+The Release Manager prepares `apache-airflow-mypy` packages separately from the main Airflow Release, using
+`breeze` commands and accompanying scripts. This document provides an overview of the command line tools
+needed to prepare the packages.
+
+# Decide when to release
+
+You can release `apache-airflow-mypy` distributions separately from the main Airflow on an ad-hoc basis,
+whenever we find that the mypy plugins need to be released - due to new features, bug fixes, or improvements
+to type checking support.
+
+# Versioning
+
+We are using the [SEMVER](https://semver.org/) versioning scheme for the `apache-airflow-mypy` distributions.
+This is to give users confidence about maintaining backwards compatibility in new releases.
+
+- **Major version** (X.0.0): Breaking changes to plugin interfaces or behavior
+- **Minor version** (0.X.0): New features, new plugins, or significant enhancements
+- **Patch version** (0.0.X): Bug fixes and minor improvements
+
+# Prepare Regular apache-airflow-mypy distributions (RC)
+
+## Generate release notes
+
+Before releasing, update the `RELEASE_NOTES.rst` file with the changes since the last release.
+You can use towncrier to generate release notes from newsfragments:
+
+```bash
+cd dev/mypy
+towncrier build --version <VERSION>
+```
+
+To preview the release notes without writing to the file:
+
+```bash
+towncrier build --version <VERSION> --draft
+```
+
+Review and edit the generated release notes as needed.
+
+## Build apache-airflow-mypy distributions for SVN apache upload
+
+The Release Manager can use the `breeze` tool to build the package:
+
+```bash
+breeze release-management prepare-mypy-distributions \
+    --distribution-format both \
+    --version-suffix-for-pypi rc1
+```
+
+## Build and sign the source and convenience packages
+
+Follow the same signing process as other Airflow packages:
+
+```bash
+cd dist
+for file in *.tar.gz *.whl; do
+    gpg --armor --detach-sign $file
+    sha512sum $file > $file.sha512
+done
+```
+
+## Add tags in git
+
+Tag the release candidate in git:
+
+```bash
+git tag -s apache-airflow-mypy-<VERSION>rc<RC> -m "Apache Airflow Mypy <VERSION>rc<RC>"
+git push origin apache-airflow-mypy-<VERSION>rc<RC>
+```
+
+## Commit the source packages to Apache SVN repo
+
+Follow the standard Apache release process for committing to the SVN repository.
+
+## Publish the distributions to PyPI (release candidates)
+
+Release candidates should be published to TestPyPI first:
+
+```bash
+twine upload --repository testpypi dist/apache_airflow.mypy-<VERSION>rc<RC>*
+```
+
+## Prepare voting email
+
+Send a voting email to dev@airflow.apache.org with the following template:
+
+```
+Subject: [VOTE] Release Apache Airflow Mypy <VERSION> based on <VERSION>rc<RC>
+
+Hello Apache Airflow Community,
+
+This is a call for the vote to release Apache Airflow Mypy version <VERSION>.
+
+The release candidate is available at:
+https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy-<VERSION>rc<RC>/
+
+The packages are available at TestPyPI:
+https://test.pypi.org/project/apache-airflow-mypy/<VERSION>rc<RC>/
+
+The vote will be open for at least 72 hours.
+
+[ ] +1 Approve the release
+[ ] +0 No opinion
+[ ] -1 Do not release (please provide specific comments)
+
+Only PMC votes are binding, but everyone is welcome to check and vote.
+
+Best regards,
+<YOUR NAME>
+```
+
+## Verify the release candidate
+
+Verify the release by:
+
+1. Installing from TestPyPI:
+
+   ```bash
+   pip install --index-url https://test.pypi.org/simple/ apache-airflow-mypy==<VERSION>rc<RC>
+   ```
+
+2. Testing the plugins in a mypy configuration:
+
+   ```ini
+   [mypy]
+   plugins = airflow.mypy.plugins.decorators, airflow.mypy.plugins.outputs
+   ```
+
+3. Running the test suite if available
+
+# Publish release
+
+## Summarize the voting
+
+Once the vote passes, summarize the results in a reply to the voting thread.
+
+## Publish release to SVN
+
+Move the release from dev to release in SVN:
+
+```bash
+svn mv https://dist.apache.org/repos/dist/dev/airflow/apache-airflow-mypy-<VERSION>rc<RC> \
+       https://dist.apache.org/repos/dist/release/airflow/apache-airflow-mypy-<VERSION> \
+       -m "Release Apache Airflow Mypy <VERSION>"
+```
+
+## Publish the packages to PyPI
+
+Publish the final release to PyPI:
+
+```bash
+twine upload dist/apache_airflow.mypy-<VERSION>-py3-none-any.whl
+twine upload dist/apache_airflow.mypy-<VERSION>.tar.gz
+```
+
+## Add tags in git
+
+Tag the final release:
+
+```bash
+git tag -s apache-airflow-mypy-<VERSION> -m "Apache Airflow Mypy <VERSION>"
+git push origin apache-airflow-mypy-<VERSION>
+```
+
+## Notify developers of release
+
+Send an announcement email to dev@airflow.apache.org and announce@apache.org:
+
+```
+Subject: [ANNOUNCE] Apache Airflow Mypy <VERSION> released
+
+The Apache Airflow team is pleased to announce the release of Apache Airflow Mypy <VERSION>.
+
+Apache Airflow Mypy provides Mypy plugins for Apache Airflow to enhance type checking capabilities.
+
+The release is available at:
+https://pypi.org/project/apache-airflow-mypy/<VERSION>/
+
+Release notes:
+https://github.com/apache/airflow/blob/main/dev/mypy/RELEASE_NOTES.rst
+
+Installation:
+pip install apache-airflow-mypy
+
+Usage:
+Add to your mypy configuration:
+[mypy]
+plugins = airflow.mypy.plugins.decorators, airflow.mypy.plugins.outputs

Review Comment:
   The announce-email template repeats the `airflow.mypy.plugins.*` module path; it should use `airflow_mypy.plugins.*` to match the installable package created by this PR.
   ```suggestion
   plugins = airflow_mypy.plugins.decorators, airflow_mypy.plugins.outputs
   ```



##########
dev/README_RELEASE_MYPY.md:
##########
@@ -0,0 +1,243 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update -->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+**Table of contents**
+
+- [What the apache-airflow-mypy distribution is](#what-the-apache-airflow-mypy-distribution-is)
+- [Decide when to release](#decide-when-to-release)
+- [Versioning](#versioning)
+- [Prepare Regular apache-airflow-mypy distributions (RC)](#prepare-regular-apache-airflow-mypy-distributions-rc)
+  - [Generate release notes](#generate-release-notes)
+  - [Build apache-airflow-mypy distributions for SVN apache upload](#build-apache-airflow-mypy-distributions-for-svn-apache-upload)
+  - [Build and sign the source and convenience packages](#build-and-sign-the-source-and-convenience-packages)
+  - [Add tags in git](#add-tags-in-git)
+  - [Commit the source packages to Apache SVN repo](#commit-the-source-packages-to-apache-svn-repo)
+  - [Publish the distributions to PyPI (release candidates)](#publish-the-distributions-to-pypi-release-candidates)
+  - [Prepare voting email](#prepare-voting-email)
+  - [Verify the release candidate](#verify-the-release-candidate)
+- [Publish release](#publish-release)
+  - [Summarize the voting](#summarize-the-voting)
+  - [Publish release to SVN](#publish-release-to-svn)
+  - [Publish the packages to PyPI](#publish-the-packages-to-pypi)
+  - [Add tags in git](#add-tags-in-git-1)
+  - [Notify developers of release](#notify-developers-of-release)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+------------------------------------------------------------------------------------------------------------
+
+# What the apache-airflow-mypy distribution is
+
+The `apache-airflow-mypy` package provides Mypy plugins for Apache Airflow to enhance type checking capabilities.
+It includes plugins for typed decorators and operator output type handling.
+
+The Release Manager prepares `apache-airflow-mypy` packages separately from the main Airflow Release, using
+`breeze` commands and accompanying scripts. This document provides an overview of the command line tools
+needed to prepare the packages.
+
+# Decide when to release
+
+You can release `apache-airflow-mypy` distributions separately from the main Airflow on an ad-hoc basis,
+whenever we find that the mypy plugins need to be released - due to new features, bug fixes, or improvements
+to type checking support.
+
+# Versioning
+
+We are using the [SEMVER](https://semver.org/) versioning scheme for the `apache-airflow-mypy` distributions.
+This is to give users confidence about maintaining backwards compatibility in new releases.
+
+- **Major version** (X.0.0): Breaking changes to plugin interfaces or behavior
+- **Minor version** (0.X.0): New features, new plugins, or significant enhancements
+- **Patch version** (0.0.X): Bug fixes and minor improvements
+
+# Prepare Regular apache-airflow-mypy distributions (RC)
+
+## Generate release notes
+
+Before releasing, update the `RELEASE_NOTES.rst` file with the changes since the last release.
+You can use towncrier to generate release notes from newsfragments:
+
+```bash
+cd dev/mypy
+towncrier build --version <VERSION>
+```
+
+To preview the release notes without writing to the file:
+
+```bash
+towncrier build --version <VERSION> --draft
+```
+
+Review and edit the generated release notes as needed.
+
+## Build apache-airflow-mypy distributions for SVN apache upload
+
+The Release Manager can use the `breeze` tool to build the package:
+
+```bash
+breeze release-management prepare-mypy-distributions \
+    --distribution-format both \
+    --version-suffix-for-pypi rc1
+```
+
+## Build and sign the source and convenience packages
+
+Follow the same signing process as other Airflow packages:
+
+```bash
+cd dist
+for file in *.tar.gz *.whl; do
+    gpg --armor --detach-sign $file
+    sha512sum $file > $file.sha512
+done
+```
+
+## Add tags in git
+
+Tag the release candidate in git:
+
+```bash
+git tag -s apache-airflow-mypy-<VERSION>rc<RC> -m "Apache Airflow Mypy <VERSION>rc<RC>"
+git push origin apache-airflow-mypy-<VERSION>rc<RC>
+```
+
+## Commit the source packages to Apache SVN repo
+
+Follow the standard Apache release process for committing to the SVN repository.
+
+## Publish the distributions to PyPI (release candidates)
+
+Release candidates should be published to TestPyPI first:
+
+```bash
+twine upload --repository testpypi dist/apache_airflow.mypy-<VERSION>rc<RC>*

Review Comment:
   The documented artifact names use `apache_airflow.mypy-...` (dot) in the `twine upload` examples, but the distribution name `apache-airflow-mypy` will produce files like `apache_airflow_mypy-...` (underscore). Update the glob/filenames so the upload commands match the actual build outputs.
   ```suggestion
   twine upload --repository testpypi dist/apache_airflow_mypy-<VERSION>rc<RC>*
   ```



##########
dev/breeze/doc/09_release_management_tasks.rst:
##########
@@ -894,6 +894,32 @@ If you pass ``--tag`` fag, the distribution will create a source tarball release
   :width: 100%
   :alt: Breeze release-management prepare-airflow-ctl-distributions
 
+Preparing Apache Airflow Mypy distributions
+""""""""""""""""""""""""""""""""""""""""""""
+
+You can prepare Apache Airflow Mypy distributions using Breeze:
+
+.. code-block:: bash
+
+     breeze release-management prepare-mypy-distributions
+
+This prepares Apache Airflow Mypy .whl package in the dist folder.
+
+Again, you can specify optional ``--distribution-format`` flag to build selected formats of the Mypy distributions,
+default is to build ``both`` type of distributions ``sdist`` and ``wheel``.
+
+.. code-block:: bash
+
+     breeze release-management prepare-mypy-distributions --distribution-format=wheel
+
+If you pass ``--tag`` fag, the distribution will create a source tarball release along with sdist.
+``--tag`` flag corresponds to actual tag in git.
+

Review Comment:
   This section says the default `--distribution-format` is `both`, but Breeze’s `--distribution-format` default is `wheel` (see `ALLOWED_DISTRIBUTION_FORMATS = ["wheel", "sdist", "both"]`). Also, `--tag` is mentioned here but `prepare-mypy-distributions` doesn’t define a `--tag` option, and `fag` appears to be a typo for `flag`. Please align the docs with the actual CLI options/behavior.
   ```suggestion
   Again, you can specify the optional ``--distribution-format`` flag to build selected formats of the
   Mypy distributions. The default is ``wheel``.
   
   .. code-block:: bash
   
        breeze release-management prepare-mypy-distributions --distribution-format=wheel
   ```



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

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

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


Re: [PR] Make Mypy plugins installable [airflow]

Posted by "shahar1 (via GitHub)" <gi...@apache.org>.
shahar1 commented on PR #61422:
URL: https://github.com/apache/airflow/pull/61422#issuecomment-4294239782

   @hussein-awala I rebased onto `main` after merging this PR, and I got this failure in the pre-commit while working on the providers' release:
   
   <details>
   <summary>Show details</summary>
   
   ```bash
   Run mypy for devel-common.................................................................................Failed
   - hook id: mypy-devel-common
   - exit code: 2
   
     Running mypy for folders: ['devel-common']
     Syncing dedicated mypy virtualenv (/home/shahar/repos/apache/airflow/.build/mypy-venvs/devel-common) for project devel-common: /home/shahar/repos/apache/airflow/.venv/bin/uv sync --frozen --project devel-common --group mypy
     warning: `VIRTUAL_ENV=/home/shahar/.cache/prek/hooks/python-uO0RxKsCTbx67Vo9wtvd` does not match the project environment path `.build/mypy-venvs/devel-common` and will be ignored; use `--active` to target the active environment instead
     Checked 208 packages in 3ms
     You can check the list of files in: /home/shahar/repos/apache/airflow/files/mypy_files_devel-common.txt
     warning: `VIRTUAL_ENV=/home/shahar/.cache/prek/hooks/python-uO0RxKsCTbx67Vo9wtvd` does not match the project environment path `.build/mypy-venvs/devel-common` and will be ignored; use `--active` to target the active environment instead
     pyproject.toml:1: error: Error importing plugin
     "airflow_mypy.plugins.decorators": No module named 'airflow_mypy'  [misc]
         # Licensed to the Apache Software Foundation (ASF) under one
         ^
     Found 1 error in 1 file (errors prevented further checking)
     Mypy check failed. You can run mypy locally with:
       prek run mypy-devel-common --all-files
     The hook uses dedicated virtualenv(s) and mypy cache(s) under .build/ so it does
     not touch your regular project .venv. You can clear both with:
       breeze down --cleanup-mypy-cache
   Every shared/<dist> has a mypy-shared-<dist> prek hook................................(no files to check)Skipped
   Check templated fields mapped in operators/sensors....................................(no files to check)Skipped
   Check execution API datamodel changes have corresponding version updates..............(no files to check)Skipped
   Generate Datamodels for TaskSDK client................................................(no files to check)Skipped
   Generate Datamodels for AirflowCTL....................................................(no files to check)Skipped
   Check for problematic context manager class decorators................................(no files to check)Skipped
   (airflow) shahar@DESKTOP-ENO7CM8:~/repos/apache/airflow$ breeze down --cleanup-mypy-cache
   Docker container engine detected.
   Good version of Docker: 29.1.3.
   Good version of docker-compose: 5.0.0
   Good version of uv: 0.11.7.
   Host python version is 3.10.17 (main, Apr  9 2025, 04:03:39) [Clang 20.1.0 ]
   WARN[0000] Warning: No resource found to remove for project "breeze". 
   mypy-cache-volume
   
   Removing dedicated mypy mypy-venvs: /home/shahar/repos/apache/airflow/.build/mypy-venvs
   
   
   Removing dedicated mypy mypy-caches: /home/shahar/repos/apache/airflow/.build/mypy-caches
   
   (airflow) shahar@DESKTOP-ENO7CM8:~/repos/apache/airflow$ prek run mypy-devel-common --all-files
   Run mypy for devel-common................................................
   Run mypy for devel-common................................................Failed
   - hook id: mypy-devel-common
   - exit code: 2
   
     Running mypy for folders: ['devel-common']
     Syncing dedicated mypy virtualenv (/home/shahar/repos/apache/airflow/.build/mypy-venvs/devel-common) for project devel-common: /home/shahar/repos/apache/airflow/.venv/bin/uv sync --frozen --project devel-common --group mypy
     warning: `VIRTUAL_ENV=/home/shahar/.cache/prek/hooks/python-uO0RxKsCTbx67Vo9wtvd` does not match the project environment path `.build/mypy-venvs/devel-common` and will be ignored; use `--active` to target the active environment instead
     Using CPython 3.13.0
     Creating virtual environment at: .build/mypy-venvs/devel-common
   Installed 208 packages in 325ms
      + a2wsgi==1.10.10
      + aiohappyeyeballs==2.6.1
      + aiohttp==3.13.5
      + aioresponses==0.7.8
      + aiosignal==1.4.0
      + aiosmtplib==5.1.0
      + aiosqlite==0.21.0
      + alembic==1.18.4
      + annotated-doc==0.0.4
      + annotated-types==0.7.0
      + anyio==4.13.0
      + apache-airflow==3.3.0 (from file:///home/shahar/repos/apache/airflow)
      + apache-airflow-core==3.3.0 (from file:///home/shahar/repos/apache/airflow/airflow-core)
      + apache-airflow-devel-common==0.1.0 (from file:///home/shahar/repos/apache/airflow/devel-common)
      + apache-airflow-providers-common-compat==1.14.3 (from file:///home/shahar/repos/apache/airflow/providers/common/compat)
      + apache-airflow-providers-common-io==1.7.2 (from file:///home/shahar/repos/apache/airflow/providers/common/io)
      + apache-airflow-providers-common-sql==1.35.0 (from file:///home/shahar/repos/apache/airflow/providers/common/sql)
      + apache-airflow-providers-smtp==3.0.0 (from file:///home/shahar/repos/apache/airflow/providers/smtp)
      + apache-airflow-providers-standard==1.12.3 (from file:///home/shahar/repos/apache/airflow/providers/standard)
      + apache-airflow-task-sdk==1.3.0 (from file:///home/shahar/repos/apache/airflow/task-sdk)
      + argcomplete==3.6.3
      + asgiref==3.11.1
      + asttokens==3.0.1
      + attrs==26.1.0
      + babel==2.18.0
      + black==26.3.1
      + cachetools==6.2.6
      + cadwyn==6.2.0
      + certifi==2026.2.25
      + cffi==2.0.0
      + charset-normalizer==3.4.7
      + click==8.3.2
      + colorlog==6.10.1
      + coverage==7.13.5
      + cron-descriptor==2.0.8
      + croniter==6.2.2
      + cryptography==46.0.7
      + decorator==5.2.1
      + deprecated==1.3.1
      + dill==0.4.1
      + dnspython==2.8.0
      + email-validator==2.3.0
      + execnet==2.1.2
      + executing==2.2.1
      + fastapi==0.136.0
      + fastapi-cli==0.0.24
      + filelock==3.28.0
      + frozenlist==1.8.0
      + fsspec==2026.3.0
      + googleapis-common-protos==1.74.0
      + greenback==1.3.0
      + greenlet==3.4.0
      + grpcio==1.80.0
      + h11==0.16.0
      + httpcore==1.0.9
      + httptools==0.7.1
      + httpx==0.28.1
      + icdiff==2.0.10
      + idna==3.11
      + importlib-metadata==8.7.1
      + iniconfig==2.3.0
      + ipdb==0.13.13
      + ipython==9.12.0
      + ipython-pygments-lexers==1.1.1
      + itsdangerous==2.2.0
      + jedi==0.19.2
      + jinja2==3.1.6
      + jmespath==1.1.0
      + jsonschema==4.24.1
      + jsonschema-specifications==2025.9.1
      + kgb==7.3
      + lazy-object-proxy==1.12.0
      + libcst==1.8.6
      + librt==0.9.0
      + linkify-it-py==2.1.0
      + lockfile==0.12.2
      + mako==1.3.11
      + markdown-it-py==4.0.0
      + markupsafe==3.0.3
      + matplotlib-inline==0.2.1
      + mdurl==0.1.2
      + methodtools==0.4.7
      + more-itertools==11.0.2
      + msgspec==0.21.1
      + multidict==6.7.1
      + mypy==1.20.1
      + mypy-extensions==1.1.0
      + natsort==8.4.0
      + opentelemetry-api==1.41.0
      + opentelemetry-exporter-otlp==1.41.0
      + opentelemetry-exporter-otlp-proto-common==1.41.0
      + opentelemetry-exporter-otlp-proto-grpc==1.41.0
      + opentelemetry-exporter-otlp-proto-http==1.41.0
      + opentelemetry-proto==1.41.0
      + opentelemetry-sdk==1.41.0
      + opentelemetry-semantic-conventions==0.62b0
      + outcome==1.3.0.post0
      + packaging==26.1
      + parso==0.8.6
      + pathlib-abc==0.5.2
      + pathspec==1.0.4
      + pdbr==0.9.7
      + pendulum==3.2.0
      + pexpect==4.9.0
      + platformdirs==4.9.6
      + pluggy==1.6.0
      + pprintpp==0.4.0
      + prompt-toolkit==3.0.52
      + propcache==0.4.1
      + protobuf==6.33.6
      + psutil==7.2.2
      + ptyprocess==0.7.0
      + pure-eval==0.2.3
      + pycparser==3.0
      + pydantic==2.13.1
      + pydantic-core==2.46.1
      + pydantic-extra-types==2.11.1
      + pydantic-settings==2.13.1
      + pygments==2.20.0
      + pygtrie==2.5.0
      + pyjwt==2.12.1
      + pytest==9.0.3
      + pytest-asyncio==1.3.0
      + pytest-cov==7.1.0
      + pytest-custom-exit-code==0.3.0
      + pytest-icdiff==0.9
      + pytest-instafail==0.5.0
      + pytest-mock==3.15.1
      + pytest-rerunfailures==16.1
      + pytest-timeouts==1.2.1
      + pytest-unordered==0.7.0
      + pytest-xdist==3.8.0
      + python-daemon==3.1.2
      + python-dateutil==2.9.0.post0
      + python-dotenv==1.2.2
      + python-multipart==0.0.26
      + python-on-whales==0.81.0
      + python-slugify==8.0.4
      + pytokens==0.4.1
      + pyyaml==6.0.3
      + pyyaml-ft==8.0.0
      + referencing==0.37.0
      + requests==2.33.1
      + requests-mock==1.12.1
      + rich==13.9.4
      + rich-argparse==1.7.2
      + rich-toolkit==0.19.7
      + rpds-py==0.30.0
      + ruff==0.15.10
      + semver==3.0.4
      + setproctitle==1.3.7
      + shellingham==1.5.4
      + six==1.17.0
      + sniffio==1.3.1
      + sqlalchemy==2.0.49
      + sqlalchemy-utils==0.42.1
      + sqlparse==0.5.5
      + stack-data==0.6.3
      + starlette==1.0.0
      + structlog==25.5.0
      + svcs==25.1.0
      + tabulate==0.10.0
      + tenacity==9.1.4
      + termcolor==3.3.0
      + text-unidecode==1.3
      + time-machine==3.2.0
      + traitlets==5.14.3
      + typer==0.24.1
      + typer-slim==0.24.0
      + types-aiofiles==25.1.0.20260409
      + types-cachetools==6.2.0.20260408
      + types-certifi==2021.10.8.3
      + types-cffi==2.0.0.20260408
      + types-croniter==6.2.2.20260408
      + types-deprecated==1.3.1.20260408
      + types-docutils==0.22.3.20260408
      + types-markdown==3.10.2.20260408
      + types-paramiko==3.5.0.20250801
      + types-protobuf==7.34.1.20260408
      + types-pymysql==1.1.0.20260408
      + types-pyopenssl==24.1.0.20240722
      + types-python-dateutil==2.9.0.20260408
      + types-python-slugify==8.0.2.20240310
      + types-pytz==2026.1.1.20260408
      + types-pyyaml==6.0.12.20260408
      + types-redis==4.6.0.20241004
      + types-requests==2.33.0.20260408
      + types-setuptools==82.0.0.20260408
      + types-tabulate==0.10.0.20260408
      + types-toml==0.10.8.20260408
      + typing-extensions==4.15.0
      + typing-inspection==0.4.2
      + tzdata==2026.1
      + uc-micro-py==2.0.0
      + universal-pathlib==0.3.10
      + urllib3==2.6.3
      + uuid6==2025.0.1
      + uvicorn==0.44.0
      + uvloop==0.22.1
      + watchfiles==1.1.1
      + wcwidth==0.6.0
      + websockets==16.0
      + wheel==0.46.3
      + wirerope==1.0.0
      + wrapt==2.1.2
      + yamllint==1.38.0
      + yarl==1.23.0
      + zipp==3.23.1
     You can check the list of files in: /home/shahar/repos/apache/airflow/files/mypy_files_devel-common.txt
     warning: `VIRTUAL_ENV=/home/shahar/.cache/prek/hooks/python-uO0RxKsCTbx67Vo9wtvd` does not match the project environment path `.build/mypy-venvs/devel-common` and will be ignored; use `--active` to target the active environment instead
     pyproject.toml:1: error: Error importing plugin
     "airflow_mypy.plugins.decorators": No module named 'airflow_mypy'  [misc]
         # Licensed to the Apache Software Foundation (ASF) under one
         ^
     Found 1 error in 1 file (errors prevented further checking)
     Mypy check failed. You can run mypy locally with:
       prek run mypy-devel-common --all-files
     The hook uses dedicated virtualenv(s) and mypy cache(s) under .build/ so it does
     not touch your regular project .venv. You can clear both with:
       breeze down --cleanup-mypy-cache
   ```
   
   </details>
   
   As it currently blocks the release, I'll take care of patching it by adding `apache-airflow-mypy` to `dev/pyproject.toml`(either as part of it (https://github.com/apache/airflow/pull/65614, or in a separate PR).
   FYI :)


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

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

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


Re: [PR] Make Mypy plugins installable [airflow]

Posted by "github-actions[bot] (via GitHub)" <gi...@apache.org>.
github-actions[bot] commented on PR #61422:
URL: https://github.com/apache/airflow/pull/61422#issuecomment-4101590434

   This pull request has been automatically marked as stale because it has not had recent activity. It will be closed in 5 days if no further activity occurs. Thank you for your contributions.


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

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

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


Re: [PR] Make Mypy plugins installable [airflow]

Posted by "Copilot (via GitHub)" <gi...@apache.org>.
Copilot commented on code in PR #61422:
URL: https://github.com/apache/airflow/pull/61422#discussion_r3120402027


##########
dev/mypy/pyproject.toml:
##########
@@ -0,0 +1,122 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+[project]
+name = "apache-airflow-mypy"
+dynamic = ["version"]
+description = "Apache Airflow Mypy plugins"
+readme = { file = "README.md", content-type = "text/markdown" }
+license = "Apache-2.0"
+license-files = ["LICENSE", "NOTICE"]
+requires-python = ">=3.10,!=3.14"
+
+authors = [
+    {name="Apache Software Foundation", email="dev@airflow.apache.org"},
+]
+maintainers = [
+    {name="Apache Software Foundation", email="dev@airflow.apache.org"},
+]
+keywords = [ "airflow", "orchestration", "workflow", "dag", "pipelines", "automation", "data" ]
+classifiers = [
+    "Development Status :: 5 - Production/Stable",
+    "Environment :: Console",
+    "Environment :: Web Environment",
+    "Intended Audience :: Developers",
+    "Intended Audience :: System Administrators",
+    "Framework :: Apache Airflow",
+    "Programming Language :: Python :: 3.10",
+    "Programming Language :: Python :: 3.11",
+    "Programming Language :: Python :: 3.12",
+    "Programming Language :: Python :: 3.13",
+    "Topic :: System :: Monitoring",
+]
+dependencies = [
+    "mypy>=1.0.0"
+]
+
+[project.urls]
+"Bug Tracker" = "https://github.com/apache/airflow/issues"
+Documentation = "https://airflow.apache.org/docs/apache-airflow-mypy/stable/index.html"
+Downloads = "https://archive.apache.org/dist/airflow/airflow-mypy/"
+Homepage = "https://airflow.apache.org/"
+"Release Notes" = "https://airflow.apache.org/docs/apache-airflow-mypy/stable/changelog.html"
+"Slack Chat" = "https://s.apache.org/airflow-slack"
+"Source Code" = "https://github.com/apache/airflow"
+LinkedIn = "https://www.linkedin.com/company/apache-airflow/"
+Mastodon = "https://fosstodon.org/@airflow"
+Bluesky = "https://bsky.app/profile/apache-airflow.bsky.social"
+YouTube = "https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/"
+
+[build-system]
+requires = ["hatchling"]

Review Comment:
   `[build-system].requires` is currently unpinned (`["hatchling"]`). Other Airflow-distributed packages pin a full set of build requirements for reproducible builds (e.g. `airflow-ctl/pyproject.toml:74-82`). Consider pinning hatchling (and the other standard build requirements used elsewhere) here as well to make `apache-airflow-mypy` releases reproducible.
   ```suggestion
   requires = ["hatchling==1.27.0"]
   ```



##########
dev/mypy/pyproject.toml:
##########
@@ -0,0 +1,122 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+[project]
+name = "apache-airflow-mypy"
+dynamic = ["version"]
+description = "Apache Airflow Mypy plugins"
+readme = { file = "README.md", content-type = "text/markdown" }
+license = "Apache-2.0"
+license-files = ["LICENSE", "NOTICE"]
+requires-python = ">=3.10,!=3.14"

Review Comment:
   `requires-python = ">=3.10,!=3.14"` likely only excludes exactly Python 3.14.0, not the whole 3.14.x series. If the intent is to exclude an entire minor series (as used elsewhere, e.g. `providers/apache/cassandra/pyproject.toml` uses `!=3.14.*`), consider using a wildcard; otherwise, consider aligning the excluded version with the rest of the workspace (most packages use `!=3.15`).
   ```suggestion
   requires-python = ">=3.10,!=3.14.*"
   ```



##########
dev/README_RELEASE_MYPY.md:
##########
@@ -0,0 +1,243 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update -->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+**Table of contents**
+
+- [What the apache-airflow-mypy distribution is](#what-the-apache-airflow-mypy-distribution-is)
+- [Decide when to release](#decide-when-to-release)
+- [Versioning](#versioning)
+- [Prepare Regular apache-airflow-mypy distributions (RC)](#prepare-regular-apache-airflow-mypy-distributions-rc)
+  - [Generate release notes](#generate-release-notes)
+  - [Build apache-airflow-mypy distributions for SVN apache upload](#build-apache-airflow-mypy-distributions-for-svn-apache-upload)
+  - [Build and sign the source and convenience packages](#build-and-sign-the-source-and-convenience-packages)
+  - [Add tags in git](#add-tags-in-git)
+  - [Commit the source packages to Apache SVN repo](#commit-the-source-packages-to-apache-svn-repo)
+  - [Publish the distributions to PyPI (release candidates)](#publish-the-distributions-to-pypi-release-candidates)
+  - [Prepare voting email](#prepare-voting-email)
+  - [Verify the release candidate](#verify-the-release-candidate)
+- [Publish release](#publish-release)
+  - [Summarize the voting](#summarize-the-voting)
+  - [Publish release to SVN](#publish-release-to-svn)
+  - [Publish the packages to PyPI](#publish-the-packages-to-pypi)
+  - [Add tags in git](#add-tags-in-git-1)
+  - [Notify developers of release](#notify-developers-of-release)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+------------------------------------------------------------------------------------------------------------
+
+# What the apache-airflow-mypy distribution is
+
+The `apache-airflow-mypy` package provides Mypy plugins for Apache Airflow to enhance type checking capabilities.
+It includes plugins for typed decorators and operator output type handling.
+
+The Release Manager prepares `apache-airflow-mypy` packages separately from the main Airflow Release, using
+`breeze` commands and accompanying scripts. This document provides an overview of the command line tools
+needed to prepare the packages.
+
+# Decide when to release
+
+You can release `apache-airflow-mypy` distributions separately from the main Airflow on an ad-hoc basis,
+whenever we find that the mypy plugins need to be released - due to new features, bug fixes, or improvements
+to type checking support.
+
+# Versioning
+
+We are using the [SEMVER](https://semver.org/) versioning scheme for the `apache-airflow-mypy` distributions.
+This is to give users confidence about maintaining backwards compatibility in new releases.
+
+- **Major version** (X.0.0): Breaking changes to plugin interfaces or behavior
+- **Minor version** (0.X.0): New features, new plugins, or significant enhancements
+- **Patch version** (0.0.X): Bug fixes and minor improvements
+
+# Prepare Regular apache-airflow-mypy distributions (RC)
+
+## Generate release notes
+
+Before releasing, update the `RELEASE_NOTES.rst` file with the changes since the last release.
+You can use towncrier to generate release notes from newsfragments:
+
+```bash
+cd dev/mypy
+towncrier build --version <VERSION>
+```
+
+To preview the release notes without writing to the file:
+
+```bash
+towncrier build --version <VERSION> --draft
+```
+
+Review and edit the generated release notes as needed.
+
+## Build apache-airflow-mypy distributions for SVN apache upload
+
+The Release Manager can use the `breeze` tool to build the package:
+
+```bash
+breeze release-management prepare-mypy-distributions \
+    --distribution-format both \
+    --version-suffix-for-pypi rc1

Review Comment:
   The example command uses `--version-suffix-for-pypi`, but Breeze defines the option as `--version-suffix` (see `dev/breeze/src/airflow_breeze/commands/common_options.py`). As written, the command will fail with an unknown option; update the docs to use the correct flag name.
   ```suggestion
       --version-suffix rc1
   ```



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

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

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


Re: [PR] Make Mypy plugins installable [airflow]

Posted by "potiuk (via GitHub)" <gi...@apache.org>.
potiuk commented on PR #61422:
URL: https://github.com/apache/airflow/pull/61422#issuecomment-4106972268

   NICE! 
   


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

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

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


Re: [PR] Make Mypy plugins installable [airflow]

Posted by "hussein-awala (via GitHub)" <gi...@apache.org>.
hussein-awala merged PR #61422:
URL: https://github.com/apache/airflow/pull/61422


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

To unsubscribe, e-mail: commits-unsubscribe@airflow.apache.org

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