diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 60a4a68304f68..b1988fcd1061f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -761,6 +761,12 @@ repos: exclude: ^tests/system/providers/google/cloud/bigquery/example_bigquery_queries\.py$ pass_filenames: true additional_dependencies: ['rich>=12.4.4'] + - id: generate-pypi-readme + name: Generate PyPI README + entry: ./scripts/ci/pre_commit/pre_commit_generate_pypi_readme.py + language: python + files: ^README\.md$ + pass_filenames: false - id: lint-markdown name: Run markdownlint description: Checks the style of Markdown files. diff --git a/README.md b/README.md index 6ca55b6f7bf7f..6b90d677d2751 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ under the License. --> + # Apache Airflow [![PyPI version](https://badge.fury.io/py/apache-airflow.svg)](https://badge.fury.io/py/apache-airflow) @@ -40,6 +41,7 @@ When workflows are defined as code, they become more maintainable, versionable, Use Airflow to author workflows as directed acyclic graphs (DAGs) of tasks. The Airflow scheduler executes your tasks on an array of workers while following the specified dependencies. Rich command line utilities make performing complex surgeries on DAGs a snap. The rich user interface makes it easy to visualize pipelines running in production, monitor progress, and troubleshoot issues when needed. + **Table of contents** @@ -59,7 +61,7 @@ Use Airflow to author workflows as directed acyclic graphs (DAGs) of tasks. The - [Approach to dependencies of Airflow](#approach-to-dependencies-of-airflow) - [Contributing](#contributing) - [Who uses Apache Airflow?](#who-uses-apache-airflow) -- [Who Maintains Apache Airflow?](#who-maintains-apache-airflow) +- [Who maintains Apache Airflow?](#who-maintains-apache-airflow) - [Can I use the Apache Airflow logo in my presentation?](#can-i-use-the-apache-airflow-logo-in-my-presentation) - [Airflow merchandise](#airflow-merchandise) - [Links](#links) @@ -82,6 +84,7 @@ Airflow is not a streaming solution, but it is often used to process real-time d - **Elegant**: Airflow pipelines are lean and explicit. Parameterizing your scripts is built into the core of Airflow using the powerful **Jinja** templating engine. - **Scalable**: Airflow has a modular architecture and uses a message queue to orchestrate an arbitrary number of workers. + ## Requirements Apache Airflow is tested with: @@ -114,6 +117,8 @@ as this is the only environment that is supported. The only distro that is used is used in the [Community managed DockerHub image](https://hub.docker.com/p/apache/airflow) is `Debian Bullseye`. + + ## Getting started Visit the official Airflow website documentation (latest **stable** release) for help with @@ -128,6 +133,8 @@ the [Airflow Wiki](https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+I Documentation for dependent projects like provider packages, Docker image, Helm Chart, you'll find it in [the documentation index](https://airflow.apache.org/docs/). + + ## Installing from PyPI We publish Apache Airflow as `apache-airflow` package in PyPI. Installing it however might be sometimes tricky @@ -177,6 +184,8 @@ pip install 'apache-airflow[postgres,google]==2.7.0' \ For information on installing provider packages, check [providers](http://airflow.apache.org/docs/apache-airflow-providers/index.html). + + ## Official source code Apache Airflow is an [Apache Software Foundation](https://www.apache.org) (ASF) project, @@ -191,6 +200,7 @@ and our official source code releases: Following the ASF rules, the source packages released must be sufficient for a user to build and test the release provided they have access to the appropriate platform and tools. + ## Convenience packages There are other ways of installing and using Airflow. Those are "convenience" methods - they are @@ -409,18 +419,23 @@ Those `extras` and `providers` dependencies are maintained in `provider.yaml` of By default, we should not upper-bound dependencies for providers, however each provider's maintainer might decide to add additional limits (and justify them with comment). + ## Contributing Want to help build Apache Airflow? Check out our [contributing documentation](https://github.com/apache/airflow/blob/main/CONTRIBUTING.rst). Official Docker (container) images for Apache Airflow are described in [IMAGES.rst](https://github.com/apache/airflow/blob/main/IMAGES.rst). + + ## Who uses Apache Airflow? More than 400 organizations are using Apache Airflow [in the wild](https://github.com/apache/airflow/blob/main/INTHEWILD.md). -## Who Maintains Apache Airflow? + + +## Who maintains Apache Airflow? Airflow is the work of the [community](https://github.com/apache/airflow/graphs/contributors), but the [core committers/maintainers](https://people.apache.org/committers-by-project.html#airflow) @@ -428,6 +443,7 @@ are responsible for reviewing and merging PRs as well as steering conversations If you would like to become a maintainer, please review the Apache Airflow [committer requirements](https://github.com/apache/airflow/blob/main/COMMITTERS.rst#guidelines-to-become-an-airflow-committer). + ## Can I use the Apache Airflow logo in my presentation? Yes! Be sure to abide by the Apache Foundation [trademark policies](https://www.apache.org/foundation/marks/#books) and the Apache Airflow [Brandbook](https://cwiki.apache.org/confluence/display/AIRFLOW/Brandbook). The most up-to-date logos are found in [this repo](https://github.com/apache/airflow/tree/main/docs/apache-airflow/img/logos/) and on the Apache Software Foundation [website](https://www.apache.org/logos/about.html). diff --git a/STATIC_CODE_CHECKS.rst b/STATIC_CODE_CHECKS.rst index ab7dbd6e37ef5..a6fbb5b93bfcc 100644 --- a/STATIC_CODE_CHECKS.rst +++ b/STATIC_CODE_CHECKS.rst @@ -265,6 +265,8 @@ require Breeze Docker image to be built locally. +-----------------------------------------------------------+--------------------------------------------------------------+---------+ | flynt | Run flynt string format converter for Python | | +-----------------------------------------------------------+--------------------------------------------------------------+---------+ +| generate-pypi-readme | Generate PyPI README | | ++-----------------------------------------------------------+--------------------------------------------------------------+---------+ | identity | Print input to the static check hooks for troubleshooting | | +-----------------------------------------------------------+--------------------------------------------------------------+---------+ | insert-license | * Add license for all SQL files | | diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py b/dev/breeze/src/airflow_breeze/pre_commit_ids.py index 79e0cecba88c9..a9f797e84ce0f 100644 --- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py +++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py @@ -86,6 +86,7 @@ "end-of-file-fixer", "fix-encoding-pragma", "flynt", + "generate-pypi-readme", "identity", "insert-license", "lint-chart-schema", diff --git a/generated/PYPI_README.md b/generated/PYPI_README.md new file mode 100644 index 0000000000000..f5dee5654535c --- /dev/null +++ b/generated/PYPI_README.md @@ -0,0 +1,172 @@ + + + + +# Apache Airflow + +[![PyPI version](https://badge.fury.io/py/apache-airflow.svg)](https://badge.fury.io/py/apache-airflow) +[![GitHub Build](https://github.com/apache/airflow/workflows/CI%20Build/badge.svg)](https://github.com/apache/airflow/actions) +[![Coverage Status](https://codecov.io/gh/apache/airflow/graph/badge.svg?token=WdLKlKHOAU)](https://codecov.io/gh/apache/airflow) +[![License](https://img.shields.io/:license-Apache%202-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0.txt) +[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/apache-airflow.svg)](https://pypi.org/project/apache-airflow/) +[![Docker Pulls](https://img.shields.io/docker/pulls/apache/airflow.svg)](https://hub.docker.com/r/apache/airflow) +[![Docker Stars](https://img.shields.io/docker/stars/apache/airflow.svg)](https://hub.docker.com/r/apache/airflow) +[![PyPI - Downloads](https://img.shields.io/pypi/dm/apache-airflow)](https://pypi.org/project/apache-airflow/) +[![Artifact HUB](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/apache-airflow)](https://artifacthub.io/packages/search?repo=apache-airflow) +[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) +[![Twitter Follow](https://img.shields.io/twitter/follow/ApacheAirflow.svg?style=social&label=Follow)](https://twitter.com/ApacheAirflow) +[![Slack Status](https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&style=social)](https://s.apache.org/airflow-slack) +[![Contributors](https://img.shields.io/github/contributors/apache/airflow)](https://github.com/apache/airflow/graphs/contributors) +[![OSSRank](https://shields.io/endpoint?url=https://ossrank.com/shield/6)](https://ossrank.com/p/6) + +[Apache Airflow](https://airflow.apache.org/docs/apache-airflow/stable/) (or simply Airflow) is a platform to programmatically author, schedule, and monitor workflows. + +When workflows are defined as code, they become more maintainable, versionable, testable, and collaborative. + +Use Airflow to author workflows as directed acyclic graphs (DAGs) of tasks. The Airflow scheduler executes your tasks on an array of workers while following the specified dependencies. Rich command line utilities make performing complex surgeries on DAGs a snap. The rich user interface makes it easy to visualize pipelines running in production, monitor progress, and troubleshoot issues when needed. + +## Requirements + +Apache Airflow is tested with: + +| | Main version (dev) | Stable version (2.7.0) | +|-------------|------------------------------|---------------------------| +| Python | 3.8, 3.9, 3.10, 3.11 | 3.8, 3.9, 3.10, 3.11 | +| Platform | AMD64/ARM64(\*) | AMD64/ARM64(\*) | +| Kubernetes | 1.24, 1.25, 1.26, 1.27, 1.28 | 1.24, 1.25, 1.26, 1.27 | +| PostgreSQL | 11, 12, 13, 14, 15 | 11, 12, 13, 14, 15 | +| MySQL | 5.7, 8.0, 8.1 | 5.7, 8.0 | +| SQLite | 3.15.0+ | 3.15.0+ | +| MSSQL | 2017(\*), 2019(\*) | 2017(\*), 2019(\*) | + +\* Experimental + +**Note**: MySQL 5.x versions are unable to or have limitations with +running multiple schedulers -- please see the [Scheduler docs](https://airflow.apache.org/docs/apache-airflow/stable/administration-and-deployment/scheduler.html). +MariaDB is not tested/recommended. + +**Note**: SQLite is used in Airflow tests. Do not use it in production. We recommend +using the latest stable version of SQLite for local development. + +**Note**: Airflow currently can be run on POSIX-compliant Operating Systems. For development, it is regularly +tested on fairly modern Linux Distros and recent versions of macOS. +On Windows you can run it via WSL2 (Windows Subsystem for Linux 2) or via Linux Containers. +The work to add Windows support is tracked via [#10388](https://github.com/apache/airflow/issues/10388), but +it is not a high priority. You should only use Linux-based distros as "Production" execution environment +as this is the only environment that is supported. The only distro that is used in our CI tests and that +is used in the [Community managed DockerHub image](https://hub.docker.com/p/apache/airflow) is +`Debian Bullseye`. + +## Getting started + +Visit the official Airflow website documentation (latest **stable** release) for help with +[installing Airflow](https://airflow.apache.org/docs/apache-airflow/stable/installation/), +[getting started](https://airflow.apache.org/docs/apache-airflow/stable/start.html), or walking +through a more complete [tutorial](https://airflow.apache.org/docs/apache-airflow/stable/tutorial/). + +> Note: If you're looking for documentation for the main branch (latest development branch): you can find it on [s.apache.org/airflow-docs](https://s.apache.org/airflow-docs/). + +For more information on Airflow Improvement Proposals (AIPs), visit +the [Airflow Wiki](https://cwiki.apache.org/confluence/display/AIRFLOW/Airflow+Improvement+Proposals). + +Documentation for dependent projects like provider packages, Docker image, Helm Chart, you'll find it in [the documentation index](https://airflow.apache.org/docs/). + +## Installing from PyPI + +We publish Apache Airflow as `apache-airflow` package in PyPI. Installing it however might be sometimes tricky +because Airflow is a bit of both a library and application. Libraries usually keep their dependencies open, and +applications usually pin them, but we should do neither and both simultaneously. We decided to keep +our dependencies as open as possible (in `setup.py`) so users can install different versions of libraries +if needed. This means that `pip install apache-airflow` will not work from time to time or will +produce unusable Airflow installation. + +To have repeatable installation, however, we keep a set of "known-to-be-working" constraint +files in the orphan `constraints-main` and `constraints-2-0` branches. We keep those "known-to-be-working" +constraints files separately per major/minor Python version. +You can use them as constraint files when installing Airflow from PyPI. Note that you have to specify +correct Airflow tag/version/branch and Python versions in the URL. + + +1. Installing just Airflow: + +> Note: Only `pip` installation is currently officially supported. + +While it is possible to install Airflow with tools like [Poetry](https://python-poetry.org) or +[pip-tools](https://pypi.org/project/pip-tools), they do not share the same workflow as +`pip` - especially when it comes to constraint vs. requirements management. +Installing via `Poetry` or `pip-tools` is not currently supported. + +There are known issues with ``bazel`` that might lead to circular dependencies when using it to install +Airflow. Please switch to ``pip`` if you encounter such problems. ``Bazel`` community works on fixing +the problem in `this PR `_ so it might be that +newer versions of ``bazel`` will handle it. + +If you wish to install Airflow using those tools, you should use the constraint files and convert +them to the appropriate format and workflow that your tool requires. + + +```bash +pip install 'apache-airflow==2.7.0' \ + --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.0/constraints-3.8.txt" +``` + +2. Installing with extras (i.e., postgres, google) + +```bash +pip install 'apache-airflow[postgres,google]==2.7.0' \ + --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.7.0/constraints-3.8.txt" +``` + +For information on installing provider packages, check +[providers](http://airflow.apache.org/docs/apache-airflow-providers/index.html). + +## Official source code + +Apache Airflow is an [Apache Software Foundation](https://www.apache.org) (ASF) project, +and our official source code releases: + +- Follow the [ASF Release Policy](https://www.apache.org/legal/release-policy.html) +- Can be downloaded from [the ASF Distribution Directory](https://downloads.apache.org/airflow) +- Are cryptographically signed by the release manager +- Are officially voted on by the PMC members during the + [Release Approval Process](https://www.apache.org/legal/release-policy.html#release-approval) + +Following the ASF rules, the source packages released must be sufficient for a user to build and test the +release provided they have access to the appropriate platform and tools. + +## Contributing + +Want to help build Apache Airflow? Check out our [contributing documentation](https://github.com/apache/airflow/blob/main/CONTRIBUTING.rst). + +Official Docker (container) images for Apache Airflow are described in [IMAGES.rst](https://github.com/apache/airflow/blob/main/IMAGES.rst). + +## Who uses Apache Airflow? + +More than 400 organizations are using Apache Airflow +[in the wild](https://github.com/apache/airflow/blob/main/INTHEWILD.md). + +## Who maintains Apache Airflow? + +Airflow is the work of the [community](https://github.com/apache/airflow/graphs/contributors), +but the [core committers/maintainers](https://people.apache.org/committers-by-project.html#airflow) +are responsible for reviewing and merging PRs as well as steering conversations around new feature requests. +If you would like to become a maintainer, please review the Apache Airflow +[committer requirements](https://github.com/apache/airflow/blob/main/COMMITTERS.rst#guidelines-to-become-an-airflow-committer). diff --git a/generated/README.md b/generated/README.md index ba5e3f43c1d04..070fecf89e550 100644 --- a/generated/README.md +++ b/generated/README.md @@ -30,3 +30,9 @@ You can read more about pre-commit hooks [here](../STATIC_CODE_CHECKS.rst#pre-co the providers. It contains historical metadata in providers that were released - it is useful to generate information in release notes and it is used to generate SBOM information for the providers. It is manually regenerated using `breeze release-management generate-providers-metadata` command." + +* `PYPI_README.md` - is generated from the comprehensive `README.md` of the project, which contains exhaustive + project details. Unlike the full `README.md`, `PYPI_README.md` is a distilled version tailored for PyPI, + focusing on select sections. This subset is produced by the `generate-pypi-readme` pre-commit hook specified in + the `.pre-commit-config.yaml` file. This hook triggers automatically whenever the related sections in the + `README.md` change, ensuring alignment between the two files. diff --git a/images/breeze/output-commands-hash.txt b/images/breeze/output-commands-hash.txt index d0a1b24d43a8b..92905b64e49ae 100644 --- a/images/breeze/output-commands-hash.txt +++ b/images/breeze/output-commands-hash.txt @@ -64,7 +64,7 @@ setup:version:be116d90a21c2afe01087f7609774e1e setup:fd391bab5277ad3aca65987a84144d51 shell:1462cde6f7e11a73cb42d4eec93c598e start-airflow:d4815dea2cfc0af7038697c1d9a13996 -static-checks:019e65a5537b41d3acce0f0da317ffa5 +static-checks:d643498c1537236f20c475c0036f1a30 testing:docker-compose-tests:a4dfe7dadbe3e95fdf2b8d2107f7e208 testing:helm-tests:0669be17b744ba057adbf38681bd8e68 testing:integration-tests:e745af9dd595adaa6f17ef02fbaae3b5 diff --git a/images/breeze/output-commands.svg b/images/breeze/output-commands.svg index 8b9d38fa91877..51829ca34b0dc 100644 --- a/images/breeze/output-commands.svg +++ b/images/breeze/output-commands.svg @@ -35,8 +35,8 @@ .breeze-help-r1 { fill: #c5c8c6;font-weight: bold } .breeze-help-r2 { fill: #c5c8c6 } .breeze-help-r3 { fill: #d0b344;font-weight: bold } -.breeze-help-r4 { fill: #868887 } -.breeze-help-r5 { fill: #68a0b3;font-weight: bold } +.breeze-help-r4 { fill: #68a0b3;font-weight: bold } +.breeze-help-r5 { fill: #868887 } .breeze-help-r6 { fill: #98a84b;font-weight: bold } .breeze-help-r7 { fill: #8d7b39 } @@ -217,59 +217,59 @@ -Usage: breeze [OPTIONS] COMMAND [ARGS]... +Usage: breeze [OPTIONS] COMMAND [ARGS]... -╭─ Basic flags ────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│--python-pPython major/minor version used in Airflow image for images.(>3.8< | 3.9 | 3.10 | 3.11)│ -│[default: 3.8]                                              │ -│--backend-bDatabase backend to use.(>sqlite< | mysql | postgres | mssql)[default: sqlite]│ -│--postgres-version-PVersion of Postgres used.(>11< | 12 | 13 | 14 | 15)[default: 11]│ -│--mysql-version-MVersion of MySQL used.(>5.7< | 8.0 | 8.1)[default: 5.7]│ -│--mssql-version-SVersion of MsSQL used.(>2017-latest< | 2019-latest)[default: 2017-latest]│ -│--integrationIntegration(s) to enable when running (can be more than one).                            │ -│(all | all-testable | cassandra | celery | kafka | kerberos | mongo | otel | pinot |     │ -│statsd | statsd | trino)                                                                 │ -│--forward-credentials-fForward local credentials to container when running.│ -│--db-reset-dReset DB when entering the container.│ -│--max-timeMaximum time that the command should take - if it takes longer, the command will fail.│ -│(INTEGER RANGE)                                                                       │ -│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ -│--builderBuildx builder used to perform `docker buildx build` commands.(TEXT)│ -│[default: autodetect]                                         │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│--verbose-vPrint verbose information about performed steps.│ -│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ -│--answer-aForce answer to questions.(y | n | q | yes | no | quit)│ -│--help-hShow this message and exit.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Developer commands ─────────────────────────────────────────────────────────────────────────────────────────────────╮ -│start-airflow     Enter breeze environment and starts all Airflow components in the tmux session. Compile assets  │ -│if contents of www directory changed.                                                           │ -│static-checks     Run static checks.                                                                              │ -│build-docs        Build documents.                                                                                │ -│down              Stop running breeze environment.                                                                │ -│shell             Enter breeze environment. this is the default command use when no other is selected.            │ -│exec              Joins the interactive shell of running airflow container.                                       │ -│compile-www-assetsCompiles www assets.                                                                            │ -│cleanup           Cleans the cache of parameters, docker cache and optionally built CI/PROD images.               │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Testing commands ───────────────────────────────────────────────────────────────────────────────────────────────────╮ -│testing        Tools that developers can use to run tests                                                         │ -│k8s            Tools that developers use to run Kubernetes tests                                                  │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Image commands ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ci-image         Tools that developers can use to manually manage CI images                                       │ -│prod-image       Tools that developers can use to manually manage PROD images                                     │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Release management commands ────────────────────────────────────────────────────────────────────────────────────────╮ -│release-management     Tools that release managers can use to prepare and manage Airflow releases                 │ -│sbom                   Tools that release managers can use to prepare sbom information                            │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Other commands ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│setup     Tools that developers can use to configure Breeze                                                       │ -│ci        Tools that CI workflows use to cleanup/manage CI environment                                            │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Basic flags ────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│--python-pPython major/minor version used in Airflow image for images.(>3.8< | 3.9 | 3.10 | 3.11)│ +│[default: 3.8]                                              │ +│--backend-bDatabase backend to use.(>sqlite< | mysql | postgres | mssql)[default: sqlite]│ +│--postgres-version-PVersion of Postgres used.(>11< | 12 | 13 | 14 | 15)[default: 11]│ +│--mysql-version-MVersion of MySQL used.(>5.7< | 8.0 | 8.1)[default: 5.7]│ +│--mssql-version-SVersion of MsSQL used.(>2017-latest< | 2019-latest)[default: 2017-latest]│ +│--integrationIntegration(s) to enable when running (can be more than one).                            │ +│(all | all-testable | cassandra | celery | kafka | kerberos | mongo | otel | pinot |     │ +│statsd | statsd | trino)                                                                 │ +│--forward-credentials-fForward local credentials to container when running.│ +│--db-reset-dReset DB when entering the container.│ +│--max-timeMaximum time that the command should take - if it takes longer, the command will fail.│ +│(INTEGER RANGE)                                                                       │ +│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ +│--builderBuildx builder used to perform `docker buildx build` commands.(TEXT)│ +│[default: autodetect]                                         │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│--verbose-vPrint verbose information about performed steps.│ +│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ +│--answer-aForce answer to questions.(y | n | q | yes | no | quit)│ +│--help-hShow this message and exit.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Developer commands ─────────────────────────────────────────────────────────────────────────────────────────────────╮ +│start-airflow     Enter breeze environment and starts all Airflow components in the tmux session. Compile assets  │ +│if contents of www directory changed.                                                           │ +│static-checks     Run static checks.                                                                              │ +│build-docs        Build documents.                                                                                │ +│down              Stop running breeze environment.                                                                │ +│shell             Enter breeze environment. this is the default command use when no other is selected.            │ +│exec              Joins the interactive shell of running airflow container.                                       │ +│compile-www-assetsCompiles www assets.                                                                            │ +│cleanup           Cleans the cache of parameters, docker cache and optionally built CI/PROD images.               │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Testing commands ───────────────────────────────────────────────────────────────────────────────────────────────────╮ +│testing        Tools that developers can use to run tests                                                         │ +│k8s            Tools that developers use to run Kubernetes tests                                                  │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Image commands ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ci-image         Tools that developers can use to manually manage CI images                                       │ +│prod-image       Tools that developers can use to manually manage PROD images                                     │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Release management commands ────────────────────────────────────────────────────────────────────────────────────────╮ +│release-management     Tools that release managers can use to prepare and manage Airflow releases                 │ +│sbom                   Tools that release managers can use to prepare sbom information                            │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Other commands ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│setup     Tools that developers can use to configure Breeze                                                       │ +│ci        Tools that CI workflows use to cleanup/manage CI environment                                            │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/images/breeze/output_static-checks.svg b/images/breeze/output_static-checks.svg index d55ee91eb6b4a..aff980e81db24 100644 --- a/images/breeze/output_static-checks.svg +++ b/images/breeze/output_static-checks.svg @@ -1,4 +1,4 @@ - + - + @@ -270,9 +270,12 @@ + + + - Command: static-checks + Command: static-checks @@ -283,81 +286,82 @@ -Usage: breeze static-checks [OPTIONS] [PRECOMMIT_ARGS]... +Usage: breeze static-checks [OPTIONS] [PRECOMMIT_ARGS]... Run static checks. -╭─ Pre-commit flags ───────────────────────────────────────────────────────────────────────────────────────────────────╮ -│--type-tType(s) of the static checks to run.                                             │ -│(all | black | blacken-docs | check-aiobotocore-optional |                       │ -│check-airflow-k8s-not-used | check-airflow-provider-compatibility |              │ -│check-apache-license-rat | check-base-operator-partial-arguments |               │ -│check-base-operator-usage | check-boring-cyborg-configuration |                  │ -│check-breeze-top-dependencies-limited | check-builtin-literals |                 │ -│check-changelog-has-no-duplicates | check-cncf-k8s-only-for-executors |          │ -│check-core-deprecation-classes | check-daysago-import-from-utils |               │ -│check-decorated-operator-implements-custom-name | check-deferrable-default-value │ -│| check-docstring-param-types | check-example-dags-urls |                        │ -│check-executables-have-shebangs | check-extra-packages-references |              │ -│check-extras-order | check-for-inclusive-language |                              │ -│check-google-re2-as-dependency | check-hooks-apply |                             │ -│check-incorrect-use-of-LoggingMixin | check-init-decorator-arguments |           │ -│check-lazy-logging | check-links-to-example-dags-do-not-use-hardcoded-versions | │ -│check-merge-conflict | check-newsfragments-are-valid |                           │ -│check-no-airflow-deprecation-in-providers | check-no-providers-in-core-examples |│ -│check-no-relative-imports | check-only-new-session-with-provide-session |        │ -│check-persist-credentials-disabled-in-github-workflows |                         │ -│check-pre-commit-information-consistent | check-provide-create-sessions-imports |│ -│check-provider-yaml-valid | check-providers-init-file-missing |                  │ -│check-providers-subpackages-init-file-exist | check-pydevd-left-in-code |        │ -│check-revision-heads-map | check-safe-filter-usage-in-html | check-setup-order | │ -│check-start-date-not-used-in-defaults | check-system-tests-present |             │ -│check-system-tests-tocs | check-tests-unittest-testcase |                        │ -│check-urlparse-usage-in-code | check-usage-of-re2-over-re | check-xml | codespell│ -│| compile-www-assets | compile-www-assets-dev |                                  │ -│create-missing-init-py-files-tests | debug-statements | detect-private-key |     │ -│doctoc | end-of-file-fixer | fix-encoding-pragma | flynt | identity |            │ -│insert-license | lint-chart-schema | lint-css | lint-dockerfile | lint-helm-chart│ -│| lint-json-schema | lint-markdown | lint-openapi | mixed-line-ending | mypy-core│ -│| mypy-dev | mypy-docs | mypy-providers | pretty-format-json | python-no-log-warn│ -│| replace-bad-characters | rst-backticks | ruff | shellcheck |                   │ -│trailing-whitespace | ts-compile-format-lint-www | update-black-version |        │ -│update-breeze-cmd-output | update-breeze-readme-config-hash |                    │ -│update-common-sql-api-stubs | update-er-diagram | update-extras |                │ -│update-in-the-wild-to-be-sorted | update-inlined-dockerfile-scripts |            │ -│update-installed-providers-to-be-sorted | update-local-yml-file |                │ -│update-migration-references | update-providers-dependencies |                    │ -│update-spelling-wordlist-to-be-sorted | update-supported-versions |              │ -│update-vendored-in-k8s-json-schema | update-version | yamllint)                  │ -│--show-diff-on-failure-sShow diff for files modified by the checks.│ -│--initialize-environmentInitialize environment before running checks.│ -│--max-initialization-attemptsMaximum number of attempts to initialize environment before giving up.│ -│(INTEGER RANGE)                                                       │ -│[default: 3; 1<=x<=10]                                                │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Selecting files to run the checks on ───────────────────────────────────────────────────────────────────────────────╮ -│--file-fList of files to run the checks on.(PATH)│ -│--all-files-aRun checks on all files.│ -│--commit-ref-rRun checks for this commit reference only (can be any git commit-ish reference). Mutually    │ -│exclusive with --last-commit.                                                                │ -│(TEXT)                                                                                       │ -│--last-commit-cRun checks for all files in last commit. Mutually exclusive with --commit-ref.│ -│--only-my-changes-mRun checks for commits belonging to my PR only: for all commits between merge base to `main` │ -│branch and HEAD of your branch.                                                              │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Building image before running checks ───────────────────────────────────────────────────────────────────────────────╮ -│--skip-image-checkSkip checking if the CI image is up to date. Useful if you run non-image checks only│ -│--force-buildForce image build no matter if it is determined as needed.│ -│--image-tagTag of the image which is used to run the image (implies --mount-sources=skip).(TEXT)│ -│[default: latest]                                                              │ -│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ -│--builderBuildx builder used to perform `docker buildx build` commands.(TEXT)[default: autodetect]│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│--verbose-vPrint verbose information about performed steps.│ -│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ -│--help-hShow this message and exit.│ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Pre-commit flags ───────────────────────────────────────────────────────────────────────────────────────────────────╮ +│--type-tType(s) of the static checks to run.                                             │ +│(all | black | blacken-docs | check-aiobotocore-optional |                       │ +│check-airflow-k8s-not-used | check-airflow-provider-compatibility |              │ +│check-apache-license-rat | check-base-operator-partial-arguments |               │ +│check-base-operator-usage | check-boring-cyborg-configuration |                  │ +│check-breeze-top-dependencies-limited | check-builtin-literals |                 │ +│check-changelog-has-no-duplicates | check-cncf-k8s-only-for-executors |          │ +│check-core-deprecation-classes | check-daysago-import-from-utils |               │ +│check-decorated-operator-implements-custom-name | check-deferrable-default-value │ +│| check-docstring-param-types | check-example-dags-urls |                        │ +│check-executables-have-shebangs | check-extra-packages-references |              │ +│check-extras-order | check-for-inclusive-language |                              │ +│check-google-re2-as-dependency | check-hooks-apply |                             │ +│check-incorrect-use-of-LoggingMixin | check-init-decorator-arguments |           │ +│check-lazy-logging | check-links-to-example-dags-do-not-use-hardcoded-versions | │ +│check-merge-conflict | check-newsfragments-are-valid |                           │ +│check-no-airflow-deprecation-in-providers | check-no-providers-in-core-examples |│ +│check-no-relative-imports | check-only-new-session-with-provide-session |        │ +│check-persist-credentials-disabled-in-github-workflows |                         │ +│check-pre-commit-information-consistent | check-provide-create-sessions-imports |│ +│check-provider-yaml-valid | check-providers-init-file-missing |                  │ +│check-providers-subpackages-init-file-exist | check-pydevd-left-in-code |        │ +│check-revision-heads-map | check-safe-filter-usage-in-html | check-setup-order | │ +│check-start-date-not-used-in-defaults | check-system-tests-present |             │ +│check-system-tests-tocs | check-tests-unittest-testcase |                        │ +│check-urlparse-usage-in-code | check-usage-of-re2-over-re | check-xml | codespell│ +│| compile-www-assets | compile-www-assets-dev |                                  │ +│create-missing-init-py-files-tests | debug-statements | detect-private-key |     │ +│doctoc | end-of-file-fixer | fix-encoding-pragma | flynt | generate-pypi-readme |│ +│identity | insert-license | lint-chart-schema | lint-css | lint-dockerfile |     │ +│lint-helm-chart | lint-json-schema | lint-markdown | lint-openapi |              │ +│mixed-line-ending | mypy-core | mypy-dev | mypy-docs | mypy-providers |          │ +│pretty-format-json | python-no-log-warn | replace-bad-characters | rst-backticks │ +│| ruff | shellcheck | trailing-whitespace | ts-compile-format-lint-www |         │ +│update-black-version | update-breeze-cmd-output |                                │ +│update-breeze-readme-config-hash | update-common-sql-api-stubs |                 │ +│update-er-diagram | update-extras | update-in-the-wild-to-be-sorted |            │ +│update-inlined-dockerfile-scripts | update-installed-providers-to-be-sorted |    │ +│update-local-yml-file | update-migration-references |                            │ +│update-providers-dependencies | update-spelling-wordlist-to-be-sorted |          │ +│update-supported-versions | update-vendored-in-k8s-json-schema | update-version |│ +│yamllint)                                                                        │ +│--show-diff-on-failure-sShow diff for files modified by the checks.│ +│--initialize-environmentInitialize environment before running checks.│ +│--max-initialization-attemptsMaximum number of attempts to initialize environment before giving up.│ +│(INTEGER RANGE)                                                       │ +│[default: 3; 1<=x<=10]                                                │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Selecting files to run the checks on ───────────────────────────────────────────────────────────────────────────────╮ +│--file-fList of files to run the checks on.(PATH)│ +│--all-files-aRun checks on all files.│ +│--commit-ref-rRun checks for this commit reference only (can be any git commit-ish reference). Mutually    │ +│exclusive with --last-commit.                                                                │ +│(TEXT)                                                                                       │ +│--last-commit-cRun checks for all files in last commit. Mutually exclusive with --commit-ref.│ +│--only-my-changes-mRun checks for commits belonging to my PR only: for all commits between merge base to `main` │ +│branch and HEAD of your branch.                                                              │ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Building image before running checks ───────────────────────────────────────────────────────────────────────────────╮ +│--skip-image-checkSkip checking if the CI image is up to date. Useful if you run non-image checks only│ +│--force-buildForce image build no matter if it is determined as needed.│ +│--image-tagTag of the image which is used to run the image (implies --mount-sources=skip).(TEXT)│ +│[default: latest]                                                              │ +│--github-repository-gGitHub repository used to pull, push run images.(TEXT)[default: apache/airflow]│ +│--builderBuildx builder used to perform `docker buildx build` commands.(TEXT)[default: autodetect]│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ +╭─ Common options ─────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│--verbose-vPrint verbose information about performed steps.│ +│--dry-run-DIf dry-run is set, commands are only printed, not executed.│ +│--help-hShow this message and exit.│ +╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ diff --git a/scripts/ci/license-templates/LICENSE.md b/scripts/ci/license-templates/LICENSE.md new file mode 100644 index 0000000000000..468ed78562910 --- /dev/null +++ b/scripts/ci/license-templates/LICENSE.md @@ -0,0 +1,18 @@ + diff --git a/scripts/ci/pre_commit/pre_commit_generate_pypi_readme.py b/scripts/ci/pre_commit/pre_commit_generate_pypi_readme.py new file mode 100755 index 0000000000000..0223b0a46b3d4 --- /dev/null +++ b/scripts/ci/pre_commit/pre_commit_generate_pypi_readme.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# 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. +from __future__ import annotations + +import re +from pathlib import Path + +AIRFLOW_SOURCES = Path(__file__).parents[3].resolve() +README_SECTIONS_TO_EXTRACT = [ + "Apache Airflow", + "Requirements", + "Getting started", + "Installing from PyPI", + "Official source code", + "Contributing", + "Who uses Apache Airflow", + "Who maintains Apache Airflow", +] + +PYPI_README_HEADER = ( + "\n" +) + + +# Function to extract sections based on start and end comments +def extract_section(content, section_name): + start_comment = ( + f"" + ) + end_comment = ( + f"" + ) + section_match = re.search( + rf"{re.escape(start_comment)}(.*?)\n{re.escape(end_comment)}", content, re.DOTALL + ) + if section_match: + return section_match.group(1) + else: + raise Exception(f"Cannot find section {section_name} in README.md") + + +if __name__ == "__main__": + readme_file = AIRFLOW_SOURCES / "README.md" + pypi_readme_file = AIRFLOW_SOURCES / "generated" / "PYPI_README.md" + license_file = AIRFLOW_SOURCES / "scripts" / "ci" / "license-templates" / "LICENSE.md" + + readme_content = readme_file.read_text() + generated_pypi_readme_content = license_file.read_text() + "\n" + PYPI_README_HEADER + for section in README_SECTIONS_TO_EXTRACT: + section_content = extract_section(readme_content, section) + generated_pypi_readme_content += section_content + with pypi_readme_file.open("w") as generated_readme: + generated_readme.write(generated_pypi_readme_content) diff --git a/setup.cfg b/setup.cfg index f0851e9225fee..fa963c297507e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -22,7 +22,7 @@ author = Apache Software Foundation author_email = dev@airflow.apache.org url = https://airflow.apache.org/ version = attr: airflow.__version__ -long_description = file: README.md +long_description = file: generated/PYPI_README.md long_description_content_type = text/markdown license = Apache License 2.0 license_files = @@ -43,11 +43,12 @@ classifiers = Topic :: System :: Monitoring Framework :: Apache Airflow project_urls = + Bug Tracker=https://github.com/apache/airflow/issues Documentation=https://airflow.apache.org/docs/ Downloads=https://archive.apache.org/dist/airflow/ - Bug Tracker=https://github.com/apache/airflow/issues - Source Code=https://github.com/apache/airflow + Release Notes=https://airflow.apache.org/docs/apache-airflow/stable/release_notes.html Slack Chat=https://s.apache.org/airflow-slack + Source Code=https://github.com/apache/airflow Twitter=https://twitter.com/ApacheAirflow YouTube=https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/