You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2024/01/14 06:12:00 UTC

(airflow-client-python) 01/01: Modernize Python Client packaging

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

potiuk pushed a commit to branch modernize-python-client-packaging
in repository https://gitbox.apache.org/repos/asf/airflow-client-python.git

commit 62a88cdb34012b5492d5670646458bf18e688544
Author: Jarek Potiuk <ja...@potiuk.com>
AuthorDate: Sun Jan 14 07:03:36 2024 +0100

    Modernize Python Client packaging
    
    Accompanying https://github.com/apache/airflow/pull/36763 where we
    fix and modernize the way how Python client gets generated, this
    on is result of applying the modernisation:
    
    * converting project configuration to pyproject.toml and removing
      all setup.* and requirements files
    * converting to modern packaging backend (hatchling) to build
      wheel and sdist packages (with reproducibility)
    * using hatch test environment definition and coverage to run tests
    * we deleted release instructions and dev tools (the ones in Airflow
      will be used to generate and sign the package)
    * similarly .pre-comit-config.yml is not needed as the client
      gets generated in the Apache Airflow project.
    
    All those are going to be maintained in Apache Airflow project
    as part of https://github.com/apache/airflow/pull/36763 as a single
    source of truth - when new Python client gets released the project
    files will be overwritten from those prepare from Airflow project,
    this is just initial PR to seed the new
---
 .github/workflows/ci.yml                           |  19 +-
 .gitignore                                         |  76 +--
 .openapi-generator-ignore                          |   8 +
 .pre-commit-config.yaml                            |  84 ---
 CHANGELOG.md                                       |  99 ++--
 INSTALL                                            |   8 +-
 LICENSE                                            |  52 ++
 NOTICE                                             |   6 -
 README.md                                          | 595 +++++++++++++++++----
 dev/README_RELEASE_CLIENT.md                       | 459 ----------------
 dev/insert_readme_example.py                       |  47 --
 dev/sign.sh                                        |  34 --
 pyproject.toml                                     | 105 ++++
 requirements.txt                                   |  20 -
 setup.cfg                                          |  42 --
 setup.py                                           |  47 --
 test-requirements.txt                              |  20 -
 dev/test_python_client.py => test_python_client.py |   0
 version.txt                                        |   1 +
 19 files changed, 737 insertions(+), 985 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 97f41ca..e61ad19 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -21,9 +21,6 @@ jobs:
           pre-commit run --all-files
   build:
     runs-on: ubuntu-latest
-    strategy:
-      matrix:
-        python_version: ["3.7", "3.8", "3.9", "3.10"]
     steps:
       - name: Checkout
         uses: actions/checkout@main
@@ -31,12 +28,18 @@ jobs:
       - name: Set up Python
         uses: actions/setup-python@v2
         with:
-          python-version: ${{ matrix.python_version }}
+          python-version: 3.8
+          cache: 'pip'
         id: python
 
-      - name: Run pytest
+      - name: Install hatch
         run: |
-          pip install -r test-requirements.txt
-          pytest test
+          python -m pip install --upgrade pipx
+          pipx install hatch
+        id: hatch
+
+      - name: Run tests
+        run: hatch run test-coverage
         env:
-          PYTEST_ADDOPTS: "--color=yes"
+          HATCH_ENV: "test"
+        id: tests
diff --git a/.gitignore b/.gitignore
index 96e65cf..7bf956f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,67 +1,9 @@
-# Byte-compiled / optimized / DLL files
-__pycache__/
-*.py[cod]
-*$py.class
-
-# C extensions
-*.so
-
-# Distribution / packaging
-.Python
-env/
-build/
-develop-eggs/
-dist/
-downloads/
-eggs/
-.eggs/
-.idea/
-lib/
-lib64/
-parts/
-sdist/
-var/
-*.egg-info/
-.installed.cfg
-*.egg
-
-# PyInstaller
-#  Usually these files are written by a python script from a template
-#  before PyInstaller builds the exe, so as to inject date/other infos into it.
-*.manifest
-*.spec
-
-# Installer logs
-pip-log.txt
-pip-delete-this-directory.txt
-
-# Unit test / coverage reports
-htmlcov/
-.tox/
-.coverage
-.coverage.*
-.cache
-nosetests.xml
-coverage.xml
-*,cover
-.hypothesis/
-venv/
-.venv/
-.python-version
-.pytest_cache
-
-# Translations
-*.mo
-*.pot
-
-# Django stuff:
-*.log
-
-# Sphinx documentation
-docs/_build/
-
-# PyBuilder
-target/
-
-#Ipython Notebook
-.ipynb_checkpoints
+/airflow_client
+/docs
+/dist
+/test
+/tmp
+/v1.yaml
+/.coverage
+/apache_airflow_client.egg-info/
+/.idea
diff --git a/.openapi-generator-ignore b/.openapi-generator-ignore
new file mode 100644
index 0000000..36151b8
--- /dev/null
+++ b/.openapi-generator-ignore
@@ -0,0 +1,8 @@
+.travis.yml
+git_push.sh
+.gitlab-ci.yml
+requirements.txt
+setup.cfg
+setup.py
+test-requirements.txt
+tox.ini
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
deleted file mode 100644
index 974b242..0000000
--- a/.pre-commit-config.yaml
+++ /dev/null
@@ -1,84 +0,0 @@
-# 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.
-
-default_stages: [commit, push]
-default_language_version:
-  # force all unspecified python hooks to run python3
-  python: python3
-minimum_pre_commit_version: "1.20.0"
-repos:
-  - repo: meta
-    hooks:
-      - id: identity
-        name: Print input to the static check hooks for troubleshooting
-      - id: check-hooks-apply
-        name: Check if all hooks apply to the repository
-  - repo: https://github.com/Lucas-C/pre-commit-hooks
-    rev: v1.5.1
-    hooks:
-      - id: insert-license
-        name: Add license for all md files
-        files: \.md$
-        exclude: ^\.github/.*$|PROVIDERS_CHANGES.*\.md
-        args:
-          - --comment-style
-          - "<!--|| -->"
-          - --license-filepath
-          - license-templates/LICENSE.txt
-          - --fuzzy-match-generates-todo
-      - id: insert-license
-        name: Add license for all python files
-        exclude: ^\.github/.*$
-        language: python
-        files: \.py$
-        args:
-          - --comment-style
-          - "|#|"
-          - --license-filepath
-          - license-templates/LICENSE.txt
-          - --fuzzy-match-generates-todo
-      - id: insert-license
-        name: Add license for all yaml files
-        exclude: ^\.github/.*$
-        types: [yaml]
-        files: \.yml$|\.yaml$
-        args:
-          - --comment-style
-          - "|#|"
-          - --license-filepath
-          - license-templates/LICENSE.txt
-          - --fuzzy-match-generates-todo
-      - id: insert-license
-        name: Add license for all other files
-        exclude: ^\.github/.*$|\.*LICENSE.txt$
-        args:
-          - --comment-style
-          - "|#|"
-          - --license-filepath
-          - license-templates/LICENSE.txt
-          - --fuzzy-match-generates-todo
-        files: >
-          \.properties$|\.cfg$|\.conf$|\.ini$|\.txt$$
-  - repo: local
-    hooks:
-      - id: update-example-in-readme
-        name: Update example python script in README.md
-        entry: ./dev/insert_readme_example.py
-        language: python
-        files: ^dev/test_python_client.py$|^README.md$
-        pass_filenames: false
-        require_serial: true
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 746cbdd..259cc06 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,16 +17,18 @@
  under the License.
  -->
 
- # v2.8.0
+# v2.8.0
+
+## Major changes:
 
- ### Major changes:
   - Allow filtering event logs by attributes ([#34417](https://github.com/apache/airflow/pull/34417))
   - Add extra fields to plugins endpoint ([#34913](https://github.com/apache/airflow/pull/34913))
   - Let auth managers provide their own API endpoints ([#34349](https://github.com/apache/airflow/pull/34349))
   - Enable pools to consider deferred tasks ([#32709](https://github.com/apache/airflow/pull/32709))
   - Add dag_run_ids and task_ids filter for the batch task instance API endpoint ([#32705](https://github.com/apache/airflow/pull/32705))
 
- ### Major Fixes
+## Major Fixes
+
   - Add DagModel attributes before dumping DagDetailSchema for get_dag_details API endpoint ([#34947](https://github.com/apache/airflow/pull/34947))
   - Add TriggerRule missing value in rest API ([#35194](https://github.com/apache/airflow/pull/35194))
   - Fix wrong plugin schema ([#34858](https://github.com/apache/airflow/pull/34858))
@@ -34,36 +36,42 @@
   - OpenAPI Spec fix nullable alongside $ref ([#32887](https://github.com/apache/airflow/pull/32887))
   - Clarify new_state in OpenAPI spec ([#34056](https://github.com/apache/airflow/pull/34056))
 
- ### NEW API supported
+## NEW API supported
+
   - NA
 
- # v2.7.3
+# v2.7.3
+
+## Major changes:
 
- ### Major changes:
  - NA
 
- ### Major Fixes
+## Major Fixes
+
  - Add TriggerRule missing value in rest API ([#35194](https://github.com/apache/airflow/pull/35194))
  - Fix wrong plugin schema ([#34858](https://github.com/apache/airflow/pull/34858))
- 
- # v2.7.2
+
+# v2.7.2
 
  Apache Airflow API version: 2.7.2
 
-  ### Major changes:
-  - NA
+## Major changes:
 
-  ### Major Fixes
-  - Fix: make dry run optional for patch task instance  ([#34568](https://github.com/apache/airflow/pull/34568))
+ - NA
 
-  ### NEW API supported
-  - NA
+## Major Fixes
+
+- Fix: make dry run optional for patch task instance  ([#34568](https://github.com/apache/airflow/pull/34568))
+
+## NEW API supported
+
+ - NA
 
 # v2.7.0
 
 Apache Airflow API version: 2.7.0
 
-### Major changes:
+## Major changes:
 
  - Enable pools to consider deferred tasks ([#32709](https://github.com/apache/airflow/pull/32709))
  - add dag_run_ids and task_ids filter for the batch task instance API endpoint ([#32705](https://github.com/apache/airflow/pull/32705))
@@ -71,14 +79,14 @@ Apache Airflow API version: 2.7.0
  - Updates health check endpoint to include dag_processor status. ([#32382](https://github.com/apache/airflow/pull/32382))
  - Add TriggererStatus to OpenAPI spec ([#31579](https://github.com/apache/airflow/pull/31579))
 
-### Major Fixes
+## Major Fixes
 
  - OpenAPI Spec fix nullable alongside $ref ([#32887](https://github.com/apache/airflow/pull/32887))
  - Fix incorrect default on readonly property in our API ([#32510](https://github.com/apache/airflow/pull/32510))
  - Fix broken links in openapi/v1.yaml ([#31619](https://github.com/apache/airflow/pull/31619))
  - Update Dag trigger API and command docs ([#32696](https://github.com/apache/airflow/pull/32696))
 
-### NEW API supported
+## NEW API supported
 
  - NA
 
@@ -86,15 +94,15 @@ Apache Airflow API version: 2.7.0
 
 Apache Airflow API version: 2.6.2
 
-### Major changes:
+## Major changes:
 
  - Add TriggererStatus to OpenAPI spec ([#31579](https://github.com/apache/airflow/pull/31579))
 
-### Major Fixes
+## Major Fixes
 
  - Fixing broken links in openapi/v1.yaml ([#31619](https://github.com/apache/airflow/pull/31619))
 
-### NEW API supported
+## NEW API supported
 
  - NA
 
@@ -102,14 +110,15 @@ Apache Airflow API version: 2.6.2
 
 Apache Airflow API version: 2.6.1
 
-### Major changes:
+## Major changes:
+
  - NA
 
-### Major Fixes
+## Major Fixes
 
  - Fix Pool schema OpenAPI spec ([#30973](https://github.com/apache/airflow/pull/30973))
 
-### NEW API supported
+## NEW API supported
 
  - NA
 
@@ -117,13 +126,13 @@ Apache Airflow API version: 2.6.1
 
 Apache Airflow API version: 2.6.0
 
-### Major changes:
+## Major changes:
 
  - Minimum Python version is 3.7
  - DAGRun dag_id parameter is properly validated as read-only and setting it might result in an error:
-   "`dag_id` is a read-only attribute" This might break some workflows that used examples from the documentation. 
+   "`dag_id` is a read-only attribute" This might break some workflows that used examples from the documentation.
 
-### Major Fixes
+## Major Fixes
 
  - Move read only property in order to fix Dagrun API docs ([#30149](https://github.com/apache/airflow/pull/30149))
  - Fix clear dag run openapi spec responses by adding additional return type ([#29600](https://github.com/apache/airflow/pull/29600))
@@ -132,7 +141,7 @@ Apache Airflow API version: 2.6.0
 ([#28713](https://github.com/apache/airflow/pull/28713))
  - Expose updated_at filter for dag run and task instance endpoints ([#28636](https://github.com/apache/airflow/pull/28636))
 
-### NEW API supported
+## NEW API supported
 
  - NA
 
@@ -140,15 +149,15 @@ Apache Airflow API version: 2.6.0
 
 Apache Airflow API version: 2.5.1
 
-### Major changes:
+## Major changes:
 
 - NA
 
-### Major fixes:
+## Major fixes:
 
 - Fix authentication issues by regenerating the client with proper security schemas
 
-### New API supported:
+## New API supported:
 
 - NA
 
@@ -156,15 +165,15 @@ Apache Airflow API version: 2.5.1
 
 Apache Airflow API version: 2.5.x
 
-### Major changes:
+## Major changes:
 
 - NA
 
-### Major fixes:
+## Major fixes:
 
 - NA
 
-### New API supported:
+## New API supported:
 
 - GET /datasets/events | Get dataset events
 - GET /datasets | Get datasets
@@ -176,15 +185,15 @@ Apache Airflow API version: 2.5.x
 
 Apache Airflow API version: 2.3.x
 
-### Major changes:
+## Major changes:
 
 - NA
 
-### Major fixes:
+## Major fixes:
 
 - NA
 
-### New API supported:
+## New API supported:
 
 - PATCH /dags | Update DAGs
 - GET /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index} | Get a mapped task instance
@@ -194,15 +203,15 @@ Apache Airflow API version: 2.3.x
 
 Apache Airflow API version: 2.2.x
 
-### Major changes:
+## Major changes:
 
 - Client code is generated using OpenApi's 5.3.0 generator CLI
 
-### Major fixes:
+## Major fixes:
 
 - NA
 
-### New API supported:
+## New API supported:
 
 - POST /connections/test | Test a connection
 - DELETE /dags/{dag_id} | Delete a DAG
@@ -215,15 +224,16 @@ Apache Airflow API version: 2.2.x
 
 Apache Airflow API version: 2.1.x
 
-### Major changes:
+## Major changes:
 
  - Client code is generated using OpenApi's 5.1.1 generator CLI
 
-### Major fixes:
+## Major fixes:
 
- - Fixed the iteration issue on array items caused by unsupported class 'object' (issue #15)
+ - Fixed the iteration issue on array items caused by unsupported class 'object'.
+   Issue [#15](https://github.com/apache/airflow-client-python/issues/15)
 
-### New API supported:
+## New API supported:
 
  - Permissions
  - Plugins
@@ -236,4 +246,3 @@ Apache Airflow API version: 2.1.x
 Apache Airflow API version: 2.0.x
 
 Initial version of the Python client.
-
diff --git a/INSTALL b/INSTALL
index 1ef702d..edf1a74 100644
--- a/INSTALL
+++ b/INSTALL
@@ -16,9 +16,11 @@ java -jar apache-rat.jar -E ./.rat-excludes -d .
 python3 -m venv PATH_TO_YOUR_VENV
 source PATH_TO_YOUR_VENV/bin/activate
 
-# [required] building and installing by pip (preferred)
+# [required] building and installing by pip (the package can also be built with any other modern tools
+# that can build Python packages, e.g. setuptools, but pip is the recommended way)
+
 pip install .
 
-# or directly
-python setup.py install
+# We also recommend hatch to convert the client to packages
 
+hatch build -c -t wheel -t sdist
diff --git a/LICENSE b/LICENSE
index 11069ed..b83a80d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -199,3 +199,55 @@ 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.
+
+============================================================================
+   APACHE AIRFLOW SUBCOMPONENTS:
+
+   The Apache Airflow project contains subcomponents with separate copyright
+   notices and license terms. Your use of the source code for the these
+   subcomponents is subject to the terms and conditions of the following
+   licenses.
+
+
+========================================================================
+Third party Apache 2.0 licenses
+========================================================================
+
+The following components are provided under the Apache 2.0 License.
+See project link for details. The text of each license is also included
+at licenses/LICENSE-[project].txt.
+
+    (ALv2 License) hue v4.3.0 (https://github.com/cloudera/hue/)
+    (ALv2 License) jqclock v2.3.0 (https://github.com/JohnRDOrazio/jQuery-Clock-Plugin)
+    (ALv2 License) bootstrap3-typeahead v4.0.2 (https://github.com/bassjobsen/Bootstrap-3-Typeahead)
+    (ALv2 License) connexion v2.7.0 (https://github.com/zalando/connexion)
+
+========================================================================
+MIT licenses
+========================================================================
+
+The following components are provided under the MIT License. See project link for details.
+The text of each license is also included at licenses/LICENSE-[project].txt.
+
+    (MIT License) jquery v3.5.1 (https://jquery.org/license/)
+    (MIT License) dagre-d3 v0.6.4 (https://github.com/cpettitt/dagre-d3)
+    (MIT License) bootstrap v3.4.1 (https://github.com/twbs/bootstrap/)
+    (MIT License) d3-tip v0.9.1 (https://github.com/Caged/d3-tip)
+    (MIT License) dataTables v1.10.25 (https://datatables.net)
+    (MIT License) normalize.css v3.0.2 (http://necolas.github.io/normalize.css/)
+    (MIT License) ElasticMock v1.3.2 (https://github.com/vrcmarcos/elasticmock)
+    (MIT License) MomentJS v2.24.0 (http://momentjs.com/)
+    (MIT License) eonasdan-bootstrap-datetimepicker v4.17.49 (https://github.com/eonasdan/bootstrap-datetimepicker/)
+
+========================================================================
+BSD 3-Clause licenses
+========================================================================
+The following components are provided under the BSD 3-Clause license. See project links for details.
+The text of each license is also included at licenses/LICENSE-[project].txt.
+
+    (BSD 3 License) d3 v5.16.0 (https://d3js.org)
+    (BSD 3 License) d3-shape v2.1.0 (https://github.com/d3/d3-shape)
+    (BSD 3 License) cgroupspy 0.2.1 (https://github.com/cloudsigma/cgroupspy)
+
+========================================================================
+See licenses/LICENSES-ui.txt for packages used in `/airflow/www`
diff --git a/NOTICE b/NOTICE
index 0ae7e64..e69de29 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,6 +0,0 @@
-Apache Airflow
-Copyright 2016-2021 The Apache Software Foundation
-
-This product includes software developed at The Apache Software
-Foundation (http://www.apache.org/).
-=======================================================================
diff --git a/README.md b/README.md
index 7cd3ea3..e75b6b4 100644
--- a/README.md
+++ b/README.md
@@ -19,146 +19,535 @@
 
 # Apache Airflow Python Client
 
+# Overview
+
+To facilitate management, Apache Airflow supports a range of REST API endpoints across its
+objects.
+This section provides an overview of the API design, methods, and supported use cases.
+
+Most of the endpoints accept `JSON` as input and return `JSON` responses.
+This means that you must usually add the following headers to your request:
+
+```
+Content-type: application/json
+Accept: application/json
+```
+
+## Resources
+
+The term `resource` refers to a single type of object in the Airflow metadata. An API is broken up by its
+endpoint's corresponding resource.
+The name of a resource is typically plural and expressed in camelCase. Example: `dagRuns`.
+
+Resource names are used as part of endpoint URLs, as well as in API parameters and responses.
+
+## CRUD Operations
+
+The platform supports **Create**, **Read**, **Update**, and **Delete** operations on most resources.
+You can review the standards for these operations and their standard parameters below.
+
+Some endpoints have special behavior as exceptions.
+
+### Create
+
+To create a resource, you typically submit an HTTP `POST` request with the resource's required metadata
+in the request body.
+The response returns a `201 Created` response code upon success with the resource's metadata, including
+its internal `id`, in the response body.
+
+### Read
+
+The HTTP `GET` request can be used to read a resource or to list a number of resources.
+
+A resource's `id` can be submitted in the request parameters to read a specific resource.
+The response usually returns a `200 OK` response code upon success, with the resource's metadata in
+the response body.
+
+If a `GET` request does not include a specific resource `id`, it is treated as a list request.
+The response usually returns a `200 OK` response code upon success, with an object containing a list
+of resources' metadata in the response body.
+
+When reading resources, some common query parameters are usually available. e.g.:
+
+```
+v1/connections?limit=25&offset=25
+```
+
+|Query Parameter|Type|Description|
+|---------------|----|-----------|
+|limit|integer|Maximum number of objects to fetch. Usually 25 by default|
+|offset|integer|Offset after which to start returning objects. For use with limit query parameter.|
+
+### Update
+
+Updating a resource requires the resource `id`, and is typically done using an HTTP `PATCH` request,
+with the fields to modify in the request body.
+The response usually returns a `200 OK` response code upon success, with information about the modified
+resource in the response body.
+
+### Delete
+
+Deleting a resource requires the resource `id` and is typically executing via an HTTP `DELETE` request.
+The response usually returns a `204 No Content` response code upon success.
+
+## Conventions
+
+- Resource names are plural and expressed in camelCase.
+- Names are consistent between URL parameter name and field name.
+
+- Field names are in snake_case.
+
+```json
+{
+    \"name\": \"string\",
+    \"slots\": 0,
+    \"occupied_slots\": 0,
+    \"used_slots\": 0,
+    \"queued_slots\": 0,
+    \"open_slots\": 0
+}
+```
+
+### Update Mask
+
+Update mask is available as a query parameter in patch endpoints. It is used to notify the
+API which fields you want to update. Using `update_mask` makes it easier to update objects
+by helping the server know which fields to update in an object instead of updating all fields.
+The update request ignores any fields that aren't specified in the field mask, leaving them with
+their current values.
+
+Example:
+
+```python
+import requests
+
+resource = requests.get("/resource/my-id").json()
+resource["my_field"] = "new-value"
+requests.patch("/resource/my-id?update_mask=my_field", data=json.dumps(resource))
+```
+
+## Versioning and Endpoint Lifecycle
+
+- API versioning is not synchronized to specific releases of the Apache Airflow.
+- APIs are designed to be backward compatible.
+- Any changes to the API will first go through a deprecation phase.
+
+# Trying the API
+
+You can use a third party client, such as [curl](https://curl.haxx.se/), [HTTPie](https://httpie.org/),
+[Postman](https://www.postman.com/) or [the Insomnia rest client](https://insomnia.rest/) to test
+the Apache Airflow API.
+
+Note that you will need to pass credentials data.
+
+For e.g., here is how to pause a DAG with [curl](https://curl.haxx.se/), when basic authorization is used:
+
+```bash
+curl -X PATCH 'https://example.com/api/v1/dags/{dag_id}?update_mask=is_paused' \\
+-H 'Content-Type: application/json' \\
+--user \"username:password\" \\
+-d '{
+    \"is_paused\": true
+}'
+```
+
+Using a graphical tool such as [Postman](https://www.postman.com/) or [Insomnia](https://insomnia.rest/),
+it is possible to import the API specifications directly:
+
+1. Download the API specification by clicking the **Download** button at top of this document.
+2. Import the JSON specification in the graphical tool of your choice.
+
+  - In *Postman*, you can click the **import** button at the top
+  - With *Insomnia*, you can just drag-and-drop the file on the UI
+
+Note that with *Postman*, you can also generate code snippets by selecting a request and clicking on
+the **Code** button.
+
+## Enabling CORS
+
+[Cross-origin resource sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
+is a browser security feature that restricts HTTP requests that are
+initiated from scripts running in the browser.
+
+For details on enabling/configuring CORS, see
+[Enabling CORS](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).
+
+# Authentication
+
+To be able to meet the requirements of many organizations, Airflow supports many authentication methods,
+and it is even possible to add your own method.
+
+If you want to check which auth backend is currently set, you can use
+`airflow config get-value api auth_backends` command as in the example below.
+
+```bash
+$ airflow config get-value api auth_backends
+airflow.api.auth.backend.basic_auth
+```
+
+The default is to deny all requests.
+
+For details on configuring the authentication, see
+[API Authorization](https://airflow.apache.org/docs/apache-airflow/stable/security/api.html).
+
+# Errors
+
+We follow the error response format proposed in [RFC 7807](https://tools.ietf.org/html/rfc7807)
+also known as Problem Details for HTTP APIs. As with our normal API responses,
+your client must be prepared to gracefully handle additional members of the response.
+
+## Unauthenticated
+
+This indicates that the request has not been applied because it lacks valid authentication
+credentials for the target resource. Please check that you have valid credentials.
+
+## PermissionDenied
+
+This response means that the server understood the request but refuses to authorize
+it because it lacks sufficient rights to the resource. It happens when you do not have the
+necessary permission to execute the action you performed. You need to get the appropriate
+permissions in other to resolve this error.
+
+## BadRequest
+
+This response means that the server cannot or will not process the request due to something
+that is perceived to be a client error (e.g., malformed request syntax, invalid request message
+framing, or deceptive request routing). To resolve this, please ensure that your syntax is correct.
+
+## NotFound
+
+This client error response indicates that the server cannot find the requested resource.
+
+## MethodNotAllowed
+
+Indicates that the request method is known by the server but is not supported by the target resource.
+
+## NotAcceptable
+
+The target resource does not have a current representation that would be acceptable to the user
+agent, according to the proactive negotiation header fields received in the request, and the
+server is unwilling to supply a default representation.
+
+## AlreadyExists
+
+The request could not be completed due to a conflict with the current state of the target
+resource, e.g. the resource it tries to create already exists.
+
+## Unknown
+
+This means that the server encountered an unexpected condition that prevented it from
+fulfilling the request.
+
+
+This Python package is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
+
+- API version: 2.6.0
+- Package version: 2.6.0
+- Build package: org.openapitools.codegen.languages.PythonClientCodegen
+For more information, please visit [https://airflow.apache.org](https://airflow.apache.org)
+
 ## Requirements.
 
-Python >= 3.7
+Python >=3.6
 
 ## Installation & Usage
 
 ### pip install
 
-You can install directly using pip:
+If the python package is hosted on a repository, you can install directly using:
 
-```sh
-pip install apache-airflow-client
-````
+```bash
+pip install git+https://github.com/apache/airflow-client-python.git
+```
+
+You may need to run `pip` with root permission:
+`sudo pip install git+https://github.com/apache/airflow-client-python.git`
+
+Then import the package:
+
+```python
+import airflow_client.client
+```
 
 ### Setuptools
 
-Or install via [Setuptools](http://pypi.python.org/pypi/setuptools).
+Install via [Setuptools](http://pypi.python.org/pypi/setuptools).
 
-```shell
-git clone git@github.com:apache/airflow-client-python.git
-cd airflow-client-python
+```sh
 python setup.py install --user
 ```
+
 (or `sudo python setup.py install` to install the package for all users)
 
 Then import the package:
+
 ```python
 import airflow_client.client
 ```
 
-## Changelog
-
-See [CHANGELOG.md](https://github.com/apache/airflow-client-python/blob/main/CHANGELOG.md) for keeping
-track on what has changed in the client.
-
-
 ## Getting Started
 
-Please follow the [installation procedure](#installation--usage) and then run the following
-example python script:
+Please follow the [installation procedure](#installation--usage) and then run the following:
 
 ```python
-import uuid
-
+import time
 import airflow_client.client
-try:
-    # If you have rich installed, you will have nice colored output of the API responses
-    from rich import print
-except ImportError:
-    print("Output will not be colored. Please install rich to get colored output: `pip install rich`")
-    pass
-from airflow_client.client.api import config_api, dag_api, dag_run_api
-from airflow_client.client.model.dag_run import DAGRun
-
-# The client must use the authentication and authorization parameters
+from pprint import pprint
+from airflow_client.client.api import config_api
+from airflow_client.client.model.config import Config
+from airflow_client.client.model.error import Error
+
+# Defining the host is optional and defaults to /api/v1
+# See configuration.py for a list of all supported configuration parameters.
+configuration = client.Configuration(host="/api/v1")
+
+# The client must configure the authentication and authorization parameters
 # in accordance with the API server security policy.
 # Examples for each auth method are provided below, use the example that
 # satisfies your auth use case.
-#
-# In case of the basic authentication below, make sure that Airflow is
-# configured also with the basic_auth as backend additionally to regular session backend needed
-# by the UI. In the `[api]` section of your `airflow.cfg` set:
-#
-# auth_backend = airflow.api.auth.backend.session,airflow.api.auth.backend.basic_auth
-#
-# Make sure that your user/name are configured properly - using the user/password that has admin
-# privileges in Airflow
 
 # Configure HTTP basic authorization: Basic
-configuration = airflow_client.client.Configuration(
-    host="http://localhost:8080/api/v1",
-    username='admin',
-    password='admin'
-)
+configuration = client.Configuration(username="YOUR_USERNAME", password="YOUR_PASSWORD")
 
-# Make sure in the [core] section, the  `load_examples` config is set to True in your airflow.cfg
-# or AIRFLOW__CORE__LOAD_EXAMPLES environment variable set to True
-DAG_ID = "example_bash_operator"
 
 # Enter a context with an instance of the API client
-with airflow_client.client.ApiClient(configuration) as api_client:
+with client.ApiClient(configuration) as api_client:
+    # Create an instance of the API class
+    api_instance = config_api.ConfigApi(api_client)
 
-    errors = False
-
-    print('[blue]Getting DAG list')
-    dag_api_instance = dag_api.DAGApi(api_client)
     try:
-        api_response = dag_api_instance.get_dags()
-        print(api_response)
-    except airflow_client.client.OpenApiException as e:
-        print("[red]Exception when calling DagAPI->get_dags: %s\n" % e)
-        errors = True
-    else:
-        print('[green]Getting DAG list successful')
+        # Get current configuration
+        api_response = api_instance.get_config()
+        pprint(api_response)
+    except client.ApiException as e:
+        print("Exception when calling ConfigApi->get_config: %s\n" % e)
+```
 
+## Documentation for API Endpoints
+
+All URIs are relative to */api/v1*
+
+Class | Method | HTTP request | Description
+------------ | ------------- | ------------- | -------------
+*ConfigApi* | [**get_config**](docs/ConfigApi.md#get_config) | **GET** /config | Get current configuration
+*ConnectionApi* | [**delete_connection**](docs/ConnectionApi.md#delete_connection) | **DELETE** /connections/{connection_id} | Delete a connection
+*ConnectionApi* | [**get_connection**](docs/ConnectionApi.md#get_connection) | **GET** /connections/{connection_id} | Get a connection
+*ConnectionApi* | [**get_connections**](docs/ConnectionApi.md#get_connections) | **GET** /connections | List connections
+*ConnectionApi* | [**patch_connection**](docs/ConnectionApi.md#patch_connection) | **PATCH** /connections/{connection_id} | Update a connection
+*ConnectionApi* | [**post_connection**](docs/ConnectionApi.md#post_connection) | **POST** /connections | Create a connection
+*ConnectionApi* | [**test_connection**](docs/ConnectionApi.md#test_connection) | **POST** /connections/test | Test a connection
+*DAGApi* | [**delete_dag**](docs/DAGApi.md#delete_dag) | **DELETE** /dags/{dag_id} | Delete a DAG
+*DAGApi* | [**get_dag**](docs/DAGApi.md#get_dag) | **GET** /dags/{dag_id} | Get basic information about a DAG
+*DAGApi* | [**get_dag_details**](docs/DAGApi.md#get_dag_details) | **GET** /dags/{dag_id}/details | Get a simplified representation of DAG
+*DAGApi* | [**get_dag_source**](docs/DAGApi.md#get_dag_source) | **GET** /dagSources/{file_token} | Get a source code
+*DAGApi* | [**get_dags**](docs/DAGApi.md#get_dags) | **GET** /dags | List DAGs
+*DAGApi* | [**get_task**](docs/DAGApi.md#get_task) | **GET** /dags/{dag_id}/tasks/{task_id} | Get simplified representation of a task
+*DAGApi* | [**get_tasks**](docs/DAGApi.md#get_tasks) | **GET** /dags/{dag_id}/tasks | Get tasks for DAG
+*DAGApi* | [**patch_dag**](docs/DAGApi.md#patch_dag) | **PATCH** /dags/{dag_id} | Update a DAG
+*DAGApi* | [**patch_dags**](docs/DAGApi.md#patch_dags) | **PATCH** /dags | Update DAGs
+*DAGApi* | [**post_clear_task_instances**](docs/DAGApi.md#post_clear_task_instances) | **POST** /dags/{dag_id}/clearTaskInstances | Clear a set of task instances
+*DAGApi* | [**post_set_task_instances_state**](docs/DAGApi.md#post_set_task_instances_state) | **POST** /dags/{dag_id}/updateTaskInstancesState | Set a state of task instances
+*DAGRunApi* | [**clear_dag_run**](docs/DAGRunApi.md#clear_dag_run) | **POST** /dags/{dag_id}/dagRuns/{dag_run_id}/clear | Clear a DAG run
+*DAGRunApi* | [**delete_dag_run**](docs/DAGRunApi.md#delete_dag_run) | **DELETE** /dags/{dag_id}/dagRuns/{dag_run_id} | Delete a DAG run
+*DAGRunApi* | [**get_dag_run**](docs/DAGRunApi.md#get_dag_run) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id} | Get a DAG run
+*DAGRunApi* | [**get_dag_runs**](docs/DAGRunApi.md#get_dag_runs) | **GET** /dags/{dag_id}/dagRuns | List DAG runs
+*DAGRunApi* | [**get_dag_runs_batch**](docs/DAGRunApi.md#get_dag_runs_batch) | **POST** /dags/~/dagRuns/list | List DAG runs (batch)
+*DAGRunApi* | [**get_upstream_dataset_events**](docs/DAGRunApi.md#get_upstream_dataset_events) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/upstreamDatasetEvents | Get dataset events for a DAG run
+*DAGRunApi* | [**post_dag_run**](docs/DAGRunApi.md#post_dag_run) | **POST** /dags/{dag_id}/dagRuns | Trigger a new DAG run
+*DAGRunApi* | [**set_dag_run_note**](docs/DAGRunApi.md#set_dag_run_note) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/setNote | Update the DagRun note.
+*DAGRunApi* | [**update_dag_run_state**](docs/DAGRunApi.md#update_dag_run_state) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id} | Modify a DAG run
+*DagWarningApi* | [**get_dag_warnings**](docs/DagWarningApi.md#get_dag_warnings) | **GET** /dagWarnings | List dag warnings
+*DatasetApi* | [**get_dataset**](docs/DatasetApi.md#get_dataset) | **GET** /datasets/{uri} | Get a dataset
+*DatasetApi* | [**get_dataset_events**](docs/DatasetApi.md#get_dataset_events) | **GET** /datasets/events | Get dataset events
+*DatasetApi* | [**get_datasets**](docs/DatasetApi.md#get_datasets) | **GET** /datasets | List datasets
+*DatasetApi* | [**get_upstream_dataset_events**](docs/DatasetApi.md#get_upstream_dataset_events) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/upstreamDatasetEvents | Get dataset events for a DAG run
+*EventLogApi* | [**get_event_log**](docs/EventLogApi.md#get_event_log) | **GET** /eventLogs/{event_log_id} | Get a log entry
+*EventLogApi* | [**get_event_logs**](docs/EventLogApi.md#get_event_logs) | **GET** /eventLogs | List log entries
+*ImportErrorApi* | [**get_import_error**](docs/ImportErrorApi.md#get_import_error) | **GET** /importErrors/{import_error_id} | Get an import error
+*ImportErrorApi* | [**get_import_errors**](docs/ImportErrorApi.md#get_import_errors) | **GET** /importErrors | List import errors
+*MonitoringApi* | [**get_health**](docs/MonitoringApi.md#get_health) | **GET** /health | Get instance status
+*MonitoringApi* | [**get_version**](docs/MonitoringApi.md#get_version) | **GET** /version | Get version information
+*PermissionApi* | [**get_permissions**](docs/PermissionApi.md#get_permissions) | **GET** /permissions | List permissions
+*PluginApi* | [**get_plugins**](docs/PluginApi.md#get_plugins) | **GET** /plugins | Get a list of loaded plugins
+*PoolApi* | [**delete_pool**](docs/PoolApi.md#delete_pool) | **DELETE** /pools/{pool_name} | Delete a pool
+*PoolApi* | [**get_pool**](docs/PoolApi.md#get_pool) | **GET** /pools/{pool_name} | Get a pool
+*PoolApi* | [**get_pools**](docs/PoolApi.md#get_pools) | **GET** /pools | List pools
+*PoolApi* | [**patch_pool**](docs/PoolApi.md#patch_pool) | **PATCH** /pools/{pool_name} | Update a pool
+*PoolApi* | [**post_pool**](docs/PoolApi.md#post_pool) | **POST** /pools | Create a pool
+*ProviderApi* | [**get_providers**](docs/ProviderApi.md#get_providers) | **GET** /providers | List providers
+*RoleApi* | [**delete_role**](docs/RoleApi.md#delete_role) | **DELETE** /roles/{role_name} | Delete a role
+*RoleApi* | [**get_role**](docs/RoleApi.md#get_role) | **GET** /roles/{role_name} | Get a role
+*RoleApi* | [**get_roles**](docs/RoleApi.md#get_roles) | **GET** /roles | List roles
+*RoleApi* | [**patch_role**](docs/RoleApi.md#patch_role) | **PATCH** /roles/{role_name} | Update a role
+*RoleApi* | [**post_role**](docs/RoleApi.md#post_role) | **POST** /roles | Create a role
+*TaskInstanceApi* | [**get_extra_links**](docs/TaskInstanceApi.md#get_extra_links) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/links | List extra links
+*TaskInstanceApi* | [**get_log**](docs/TaskInstanceApi.md#get_log) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/logs/{task_try_number} | Get logs
+*TaskInstanceApi* | [**get_mapped_task_instance**](docs/TaskInstanceApi.md#get_mapped_task_instance) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index} | Get a mapped task instance
+*TaskInstanceApi* | [**get_mapped_task_instances**](docs/TaskInstanceApi.md#get_mapped_task_instances) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/listMapped | List mapped task instances
+*TaskInstanceApi* | [**get_task_instance**](docs/TaskInstanceApi.md#get_task_instance) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id} | Get a task instance
+*TaskInstanceApi* | [**get_task_instances**](docs/TaskInstanceApi.md#get_task_instances) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances | List task instances
+*TaskInstanceApi* | [**get_task_instances_batch**](docs/TaskInstanceApi.md#get_task_instances_batch) | **POST** /dags/~/dagRuns/~/taskInstances/list | List task instances (batch)
+*TaskInstanceApi* | [**patch_mapped_task_instance**](docs/TaskInstanceApi.md#patch_mapped_task_instance) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index} | Updates the state of a mapped task instance
+*TaskInstanceApi* | [**patch_task_instance**](docs/TaskInstanceApi.md#patch_task_instance) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id} | Updates the state of a task instance
+*TaskInstanceApi* | [**set_mapped_task_instance_note**](docs/TaskInstanceApi.md#set_mapped_task_instance_note) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/{map_index}/setNote | Update the TaskInstance note.
+*TaskInstanceApi* | [**set_task_instance_note**](docs/TaskInstanceApi.md#set_task_instance_note) | **PATCH** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/setNote | Update the TaskInstance note.
+*UserApi* | [**delete_user**](docs/UserApi.md#delete_user) | **DELETE** /users/{username} | Delete a user
+*UserApi* | [**get_user**](docs/UserApi.md#get_user) | **GET** /users/{username} | Get a user
+*UserApi* | [**get_users**](docs/UserApi.md#get_users) | **GET** /users | List users
+*UserApi* | [**patch_user**](docs/UserApi.md#patch_user) | **PATCH** /users/{username} | Update a user
+*UserApi* | [**post_user**](docs/UserApi.md#post_user) | **POST** /users | Create a user
+*VariableApi* | [**delete_variable**](docs/VariableApi.md#delete_variable) | **DELETE** /variables/{variable_key} | Delete a variable
+*VariableApi* | [**get_variable**](docs/VariableApi.md#get_variable) | **GET** /variables/{variable_key} | Get a variable
+*VariableApi* | [**get_variables**](docs/VariableApi.md#get_variables) | **GET** /variables | List variables
+*VariableApi* | [**patch_variable**](docs/VariableApi.md#patch_variable) | **PATCH** /variables/{variable_key} | Update a variable
+*VariableApi* | [**post_variables**](docs/VariableApi.md#post_variables) | **POST** /variables | Create a variable
+*XComApi* | [**get_xcom_entries**](docs/XComApi.md#get_xcom_entries) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries | List XCom entries
+*XComApi* | [**get_xcom_entry**](docs/XComApi.md#get_xcom_entry) | **GET** /dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries/{xcom_key} | Get an XCom entry
+
+
+## Documentation For Models
+
+ - [Action](docs/Action.md)
+ - [ActionCollection](docs/ActionCollection.md)
+ - [ActionCollectionAllOf](docs/ActionCollectionAllOf.md)
+ - [ActionResource](docs/ActionResource.md)
+ - [BasicDAGRun](docs/BasicDAGRun.md)
+ - [ClassReference](docs/ClassReference.md)
+ - [ClearDagRun](docs/ClearDagRun.md)
+ - [ClearTaskInstances](docs/ClearTaskInstances.md)
+ - [CollectionInfo](docs/CollectionInfo.md)
+ - [Color](docs/Color.md)
+ - [Config](docs/Config.md)
+ - [ConfigOption](docs/ConfigOption.md)
+ - [ConfigSection](docs/ConfigSection.md)
+ - [Connection](docs/Connection.md)
+ - [ConnectionAllOf](docs/ConnectionAllOf.md)
+ - [ConnectionCollection](docs/ConnectionCollection.md)
+ - [ConnectionCollectionAllOf](docs/ConnectionCollectionAllOf.md)
+ - [ConnectionCollectionItem](docs/ConnectionCollectionItem.md)
+ - [ConnectionTest](docs/ConnectionTest.md)
+ - [CronExpression](docs/CronExpression.md)
+ - [DAG](docs/DAG.md)
+ - [DAGCollection](docs/DAGCollection.md)
+ - [DAGCollectionAllOf](docs/DAGCollectionAllOf.md)
+ - [DAGDetail](docs/DAGDetail.md)
+ - [DAGDetailAllOf](docs/DAGDetailAllOf.md)
+ - [DAGRun](docs/DAGRun.md)
+ - [DAGRunCollection](docs/DAGRunCollection.md)
+ - [DAGRunCollectionAllOf](docs/DAGRunCollectionAllOf.md)
+ - [DagScheduleDatasetReference](docs/DagScheduleDatasetReference.md)
+ - [DagState](docs/DagState.md)
+ - [DagWarning](docs/DagWarning.md)
+ - [DagWarningCollection](docs/DagWarningCollection.md)
+ - [DagWarningCollectionAllOf](docs/DagWarningCollectionAllOf.md)
+ - [Dataset](docs/Dataset.md)
+ - [DatasetCollection](docs/DatasetCollection.md)
+ - [DatasetCollectionAllOf](docs/DatasetCollectionAllOf.md)
+ - [DatasetEvent](docs/DatasetEvent.md)
+ - [DatasetEventCollection](docs/DatasetEventCollection.md)
+ - [DatasetEventCollectionAllOf](docs/DatasetEventCollectionAllOf.md)
+ - [Error](docs/Error.md)
+ - [EventLog](docs/EventLog.md)
+ - [EventLogCollection](docs/EventLogCollection.md)
+ - [EventLogCollectionAllOf](docs/EventLogCollectionAllOf.md)
+ - [ExtraLink](docs/ExtraLink.md)
+ - [ExtraLinkCollection](docs/ExtraLinkCollection.md)
+ - [HealthInfo](docs/HealthInfo.md)
+ - [HealthStatus](docs/HealthStatus.md)
+ - [ImportError](docs/ImportError.md)
+ - [ImportErrorCollection](docs/ImportErrorCollection.md)
+ - [ImportErrorCollectionAllOf](docs/ImportErrorCollectionAllOf.md)
+ - [InlineResponse200](docs/InlineResponse200.md)
+ - [InlineResponse2001](docs/InlineResponse2001.md)
+ - [Job](docs/Job.md)
+ - [ListDagRunsForm](docs/ListDagRunsForm.md)
+ - [ListTaskInstanceForm](docs/ListTaskInstanceForm.md)
+ - [MetadatabaseStatus](docs/MetadatabaseStatus.md)
+ - [PluginCollection](docs/PluginCollection.md)
+ - [PluginCollectionAllOf](docs/PluginCollectionAllOf.md)
+ - [PluginCollectionItem](docs/PluginCollectionItem.md)
+ - [Pool](docs/Pool.md)
+ - [PoolCollection](docs/PoolCollection.md)
+ - [PoolCollectionAllOf](docs/PoolCollectionAllOf.md)
+ - [Provider](docs/Provider.md)
+ - [ProviderCollection](docs/ProviderCollection.md)
+ - [RelativeDelta](docs/RelativeDelta.md)
+ - [Resource](docs/Resource.md)
+ - [Role](docs/Role.md)
+ - [RoleCollection](docs/RoleCollection.md)
+ - [RoleCollectionAllOf](docs/RoleCollectionAllOf.md)
+ - [SLAMiss](docs/SLAMiss.md)
+ - [ScheduleInterval](docs/ScheduleInterval.md)
+ - [SchedulerStatus](docs/SchedulerStatus.md)
+ - [SetDagRunNote](docs/SetDagRunNote.md)
+ - [SetTaskInstanceNote](docs/SetTaskInstanceNote.md)
+ - [Tag](docs/Tag.md)
+ - [Task](docs/Task.md)
+ - [TaskCollection](docs/TaskCollection.md)
+ - [TaskExtraLinks](docs/TaskExtraLinks.md)
+ - [TaskInstance](docs/TaskInstance.md)
+ - [TaskInstanceCollection](docs/TaskInstanceCollection.md)
+ - [TaskInstanceCollectionAllOf](docs/TaskInstanceCollectionAllOf.md)
+ - [TaskInstanceReference](docs/TaskInstanceReference.md)
+ - [TaskInstanceReferenceCollection](docs/TaskInstanceReferenceCollection.md)
+ - [TaskOutletDatasetReference](docs/TaskOutletDatasetReference.md)
+ - [TaskState](docs/TaskState.md)
+ - [TimeDelta](docs/TimeDelta.md)
+ - [Trigger](docs/Trigger.md)
+ - [TriggerRule](docs/TriggerRule.md)
+ - [UpdateDagRunState](docs/UpdateDagRunState.md)
+ - [UpdateTaskInstance](docs/UpdateTaskInstance.md)
+ - [UpdateTaskInstancesState](docs/UpdateTaskInstancesState.md)
+ - [User](docs/User.md)
+ - [UserAllOf](docs/UserAllOf.md)
+ - [UserCollection](docs/UserCollection.md)
+ - [UserCollectionAllOf](docs/UserCollectionAllOf.md)
+ - [UserCollectionItem](docs/UserCollectionItem.md)
+ - [UserCollectionItemRoles](docs/UserCollectionItemRoles.md)
+ - [Variable](docs/Variable.md)
+ - [VariableAllOf](docs/VariableAllOf.md)
+ - [VariableCollection](docs/VariableCollection.md)
+ - [VariableCollectionAllOf](docs/VariableCollectionAllOf.md)
+ - [VariableCollectionItem](docs/VariableCollectionItem.md)
+ - [VersionInfo](docs/VersionInfo.md)
+ - [WeightRule](docs/WeightRule.md)
+ - [XCom](docs/XCom.md)
+ - [XComAllOf](docs/XComAllOf.md)
+ - [XComCollection](docs/XComCollection.md)
+ - [XComCollectionAllOf](docs/XComCollectionAllOf.md)
+ - [XComCollectionItem](docs/XComCollectionItem.md)
+
+## Documentation For Authorization
+
+## Basic
+
+- **Type**: HTTP basic authentication
+
+## Kerberos
+
+## Authors
+
+dev@airflow.apache.org
+
+## Notes for Large OpenAPI documents
+
+If the OpenAPI document is large, imports in client.apis and client.models may fail with a
+RecursionError indicating the maximum recursion limit has been exceeded. In that case, there are a couple of solutions:
+
+Solution 1:
+Use specific imports for apis and models like:
+
+- `from airflow_client.client.api.default_api import DefaultApi`
+- `from airflow_client.client.model.pet import Pet`
+
+Solution 2:
+Before importing the package, adjust the maximum recursion limit as shown below:
 
-    print('[blue]Getting Tasks for a DAG')
-    try:
-        api_response = dag_api_instance.get_tasks(DAG_ID)
-        print(api_response)
-    except airflow_client.client.exceptions.OpenApiException as e:
-        print("[red]Exception when calling DagAPI->get_tasks: %s\n" % e)
-        errors = True
-    else:
-        print('[green]Getting Tasks successful')
-
+```python
+import sys
 
-    print('[blue]Triggering a DAG run')
-    dag_run_api_instance = dag_run_api.DAGRunApi(api_client)
-    try:
-        # Create a DAGRun object (no dag_id should be specified because it is read-only property of DAGRun)
-        # dag_run id is generated randomly to allow multiple executions of the script
-        dag_run = DAGRun(
-            dag_run_id='some_test_run_' + uuid.uuid4().hex,
-        )
-        api_response = dag_run_api_instance.post_dag_run(DAG_ID, dag_run)
-        print(api_response)
-    except airflow_client.client.exceptions.OpenApiException as e:
-        print("[red]Exception when calling DAGRunAPI->post_dag_run: %s\n" % e)
-        errors = True
-    else:
-        print('[green]Posting DAG Run successful')
-
-    # Get current configuration. Note, this is disabled by default with most installation.
-    # You need to set `expose_config = True` in Airflow configuration in order to retrieve configuration.
-    conf_api_instance = config_api.ConfigApi(api_client)
-    try:
-        api_response = conf_api_instance.get_config()
-        print(api_response)
-    except airflow_client.client.OpenApiException as e:
-        print("[red]Exception when calling ConfigApi->get_config: %s\n" % e)
-        errors = True
-    else:
-        print('[green]Config retrieved successfully')
-
-    if errors:
-        print ('\n[red]There were errors while running the script - see above for details')
-    else:
-        print ('\n[green]Everything went well')
+sys.setrecursionlimit(1500)
+import airflow_client.client
+from airflow_client.client.apis import *
+from airflow_client.client.models import *
 ```
-
-See [README](https://github.com/apache/airflow-client-python/blob/main/airflow_client/README.md#documentation-for-api-endpoints) 
-for full client API documentation.
\ No newline at end of file
diff --git a/dev/README_RELEASE_CLIENT.md b/dev/README_RELEASE_CLIENT.md
deleted file mode 100644
index 9ad59fe..0000000
--- a/dev/README_RELEASE_CLIENT.md
+++ /dev/null
@@ -1,459 +0,0 @@
-<!--
- 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.
- -->
-
-# Release Process
-
-Typically, releases are done coinciding with major and minor releases to Airflow. Therefore, a release of (for example) 
-2.3.0 of this client would correspond with 2.3.X of Airflow.
-
-The Python client is generated using Airflow's [openapi spec](https://github.com/apache/airflow/blob/master/clients/gen/python.sh).
-To update the client for new APIs do the following steps:
-
-```bash
-# set the version of the client
-export VERSION=2.0.0rc1
-# clone this repo
-git clone git@github.com:apache/airflow-client-python.git
-cd airflow-client-python
-export CLIENT_REPO_ROOT=$(pwd)
-cd ..
-
-# clone Airflow repo (if not already)
-git clone git@github.com:apache/airflow.git
-cd airflow
-export AIRFLOW_REPO_ROOT=$(pwd)
-```
-Edit the file `airflow/airflow/api_connexion/openapi/v1.yaml`
-Make sure it has the following `securitySchema`s listed under security `section`
-```yaml
-security:
-  - Basic: []
-  - GoogleOpenId: []
-  - Kerberos: []
-```
-If your deployment of Airflow uses any different authentication mechanism than the three listed above, you might need to make further changes to the `v1.yaml` and generate your own client, see [OpenAPI Schema specification](https://swagger.io/docs/specification/authentication/) for details.
-(*These changes should not be commited to the upstream `v1.yaml` [as it will generate misleading openapi documentaion](https://github.com/apache/airflow/pull/17174)*)
-
-
-```bash
-
-# bump up the version in python.sh & run the following command
-${AIRFLOW_REPO_ROOT}/clients/gen/python.sh airflow/api_connexion/openapi/v1.yaml ${CLIENT_REPO_ROOT}/airflow_client
-
-cd ${CLIENT_REPO_ROOT}
-```
-
-- Set your version in `setup.py` (without the RC tag)
-
-- Get a diff between the last airflow version and the current airflow version
-  which this release is based on:
-
-      ```shell script
-      # Run this command in Airflow Repo
-      git log 2.3.0..2.5.0 --pretty=oneline -- airflow/api_connexion/openapi/v1.yaml
-      ```
-
-- Update CHANGELOG.md with the details.
-- Commit the Changes with the message "Add Client Version ${VERSION}":
-  ```shell script
-  git add .
-  git commit -m "Add Client Version ${VERSION}"
-  ```
-- Raise a PR in airflow-client-python with the above changes
-- Merge the above PR when approved before proceeding
-
-# Prepare the Apache Airflow Python Client Package RC
-
-## Build RC artifacts
-
-The Release Candidate artifacts we vote upon should be the exact ones we vote against, without any modification than
-renaming – i.e. the contents of the files must be the same between voted release candidate and final release. Because
-of this the version in the built artifacts that will become the official Apache releases must not include the rcN suffix.
-
-- Set environment variables
-  
-    ```shell script
-    # Set Version
-    export VERSION=2.0.0rc1
-    export VERSION_WITHOUT_RC=${VERSION%rc?}
-    # Set the airflow version that this release is based
-    export AIRFLOW_VERSION=2.1.4 
-
-
-    # Example after cloning
-    git clone https://github.com/apache/airflow-client-python.git 
-    cd airflow-client-python
-    export CLIENT_REPO_ROOT=$(pwd)
-    ```
-
-- Tag your release
-
-    ```shell script
-    git tag -s ${VERSION} -m "Airflow Python Client {VERSION}"
-    ```
-
-- Clean the checkout: the sdist step below will
-
-    ```shell script
-    git clean -fxd
-    ```
-
-- Tarball the repo
-
-    ```shell script
-    mkdir dist
-    git archive --format=tar.gz ${VERSION} --prefix=apache-airflow-client-${VERSION_WITHOUT_RC}/ -o dist/apache-airflow-client-${VERSION_WITHOUT_RC}-source.tar.gz
-    ```
-
-- Generate sdist
-
-  NOTE: Make sure your checkout is clean at this stage - any untracked or changed files will otherwise be included
-  in the file produced.
-
-    ```shell script
-    pip install wheel
-    python setup.py sdist bdist_wheel
-    ```
-
-- Rename the sdist
-
-    ```shell script
-    mv dist/apache-airflow-client-${VERSION_WITHOUT_RC}.tar.gz dist/apache-airflow-client-${VERSION_WITHOUT_RC}-bin.tar.gz
-    mv dist/apache_airflow_client-${VERSION_WITHOUT_RC}-py3-none-any.whl dist/apache_airflow_client-${VERSION_WITHOUT_RC}-py3-none-any.whl
-    ```
-
-- Generate SHA512/ASC (If you have not generated a key yet, generate it by following instructions on
-  http://www.apache.org/dev/openpgp.html#key-gen-generate-key)
-
-    ```shell script
-    pushd dist
-    ${CLIENT_REPO_ROOT}/dev/sign.sh *
-    popd
-    ```
-
-- Push the artifacts to ASF dev dist repo
-
-```shell script
-# First clone the repo
-svn checkout https://dist.apache.org/repos/dist/dev/airflow airflow-dev
-
-# Create new folder for the release
-cd airflow-dev/clients/python
-svn mkdir ${VERSION}
-
-# Move the artifacts to svn folder & commit
-mv ${CLIENT_REPO_ROOT}/dist/apache{-,_}*client-${VERSION_WITHOUT_RC}* ${VERSION}/
-cd ${VERSION}
-svn add *
-svn commit -m "Add artifacts for Apache Airflow Python Client ${VERSION}"
-cd ${CLIENT_REPO_ROOT}
-rm -rf airflow-dev
-```
-
-## Prepare PyPI convenience "snapshot" packages
-
-At this point we have the artefact that we vote on, but as a convenience to developers we also want to
-publish "snapshots" of the RC builds to pypi for installing via pip.
-
-To do this we need to
-
-- Build the package:
-
-    ```shell script
-    cd ${CLIENT_REPO_ROOT}
-    python setup.py egg_info --tag-build "$(sed -e "s/^[0-9.]*//" <<<"$VERSION")" sdist bdist_wheel
-    ```
-
-- Verify the artifacts that would be uploaded:
-
-    ```shell script
-    twine check dist/*
-    ```
-
-- Upload the package to PyPi's test environment:
-
-    ```shell script
-    twine upload --repository-url=https://test.pypi.org/legacy/ dist/*
-    ```
-
-- Verify that the test package looks good by downloading it and installing it into a virtual environment. The package
-  download link is available at:
-  https://test.pypi.org/project/apache-airflow-client/#files
-
-  Or via pypi
-  pip install -i https://test.pypi.org/simple/ apache-airflow-client==${VERSION}
-
-- Upload the package to PyPi's production environment:
-
-  ```shell script
-  twine upload -r pypi dist/*
-  ```
-
-- Again, confirm that the package is available here:
-  https://pypi.python.org/pypi/apache-airflow-client
-
-It is important to stress that this snapshot should not be named "release", and it
-is not supposed to be used by and advertised to the end-users who do not read the devlist.
-
-- Push Tag for the release candidate
-
-```shell script
-git push origin ${VERSION}
-```
-
-## Prepare Vote email on the Airflow Client release candidate
-
-Subject:
-
-```shell script
-cat <<EOF
-[VOTE] Release Airflow Python Client ${VERSION_WITHOUT_RC} from ${VERSION}
-EOF
-```
-
-Body:
-  
-```shell script
-cat <<EOF
-Hey fellow Airflowers,
-
-I have cut the release candidate for the Airflow Python Client ${VERSION}.
-The client consists of APIs corresponding to REST APIs available in
-*Apache Airflow ${AIRFLOW_VERSION}*. This email is calling for a vote on
-the release, which will last for 72 hours. Consider this my (binding) +1.
-
-Airflow Client ${VERSION} is available at:
-https://dist.apache.org/repos/dist/dev/airflow/clients/python/$VERSION/
-
-Or also available at PyPI:
-https://pypi.org/project/apache-airflow-client/$VERSION/
-
-*apache-airflow-client-${VERSION}-source.tar.gz* is a source release that comes with
-INSTALL instructions.
-*apache-airflow-client-${VERSION}-bin.tar.gz* is the binary Python "sdist" release.
-
-Public keys are available at:
-https://dist.apache.org/repos/dist/release/airflow/KEYS
-
-Only votes from PMC members are binding, but the release manager should
-encourage members of the community to test the release and vote with
-"(non-binding)".
-
-*Changelog:*
-
-*Major changes:*
-...
-
-*Major fixes:*
-...
-
-*New API supported:*
-...
-
-Cheers,
-<your name>
-EOF
-```
-
-# Verify the release candidate by PMCs
-See Airflow process documented [here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#verify-the-release-candidate-by-pmcs).
-
-## SVN check
-See Airflow process documented [here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#svn-check) (just replace Airflow with Airflow Client).
-
-## Licence check
-See Airflow process documented [here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#licence-check).
-
-## Signature check
-See Airflow process documented [here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#signature-check).
-
-## Sources check
-
-The code of the Python Client is generated using OpenAPI generator and the generated code is committed to
-the repository, therefore the Source code check should consist of two steps:
-
-1. Checkout the release tag of the "airflow-client-python"
-2. Follow the [Release process](#release-process) above and generate client's code above
-3. Run ``git diff`` to see the differences - review them. Generally, the code generated should only contain
-   small differences regarding authentication.
-4. git reset --hard <RELEASE_TAG>
-
-Compare the sources with the packaged sources following the process described in Airflow:
-[here](https://github.com/apache/airflow/blob/master/dev/README_RELEASE_AIRFLOW.md#signature-check).
-
-# Verify release candidates by Contributors
-This can be done (and we encourage to) by any of the Contributors. In fact, it's best if the
-actual users of Airflow Client test it in their own staging/test installations. Each release candidate
-is available on PyPI apart from SVN packages, so everyone should be able to install
-the release candidate version of Airflow Client via simply (<VERSION> is 2.0.0 for example, and <X> is
-release candidate number 1,2,3,....).
-
-```shell script
-pip install apache-airflow-client==<VERSION>rc<X>
-```
-
-Once you install and run Airflow Client, you should perform any verification you see as necessary to check
-that the client works as you expected.
-
-# Publish the final Apache Airflow client release
-
-## Summarize the voting for the Apache Airflow client release
-
-```shell script
-Hello,
-
-Apache Airflow Python Client 2.5.0 (based on RC1) has been accepted.
-
-3 "+1" binding votes received:
-- Ephraim Anierobi
-- Jarek Potiuk
-- Jed Cunningham
-
-
-1 "+1" non-binding votes received:
-
-- Pierre Jeambrun
-
-Vote thread:
-https://lists.apache.org/thread/1qcj0r67dff3zg0w2vyfhr30fx9xtp3y
-
-I'll continue with the release process, and the release announcement will follow shortly.
-
-Cheers,
-<your name>
-```
-
-## Publish release to SVN
-
-```shell script
-# Go to Airflow python client sources first
-cd <YOUR_AIRFLOW_CLIENT_REPO_ROOT>
-export CLIENT_REPO_ROOT="$(pwd)"
-cd ..
-# Clone the AS
-[ -d asf-dist ] || svn checkout --depth=immediates https://dist.apache.org/repos/dist asf-dist
-svn update --set-depth=infinity asf-dist/{release,dev}/airflow
-CLIENT_DEV_SVN="${PWD}/asf-dist/dev/airflow/clients/python"
-CLIENT_RELEASE_SVN="${PWD}/asf-dist/release/airflow/clients/python"
-cd "${CLIENT_RELEASE_SVN}"
-
-export RC=2.0.0rc1
-export VERSION=${RC/rc?/}
-
-# Create new folder for the release
-svn mkdir ${VERSION}
-cd ${VERSION}
-
-# Move the artifacts to svn folder & commit
-for f in ${CLIENT_DEV_SVN}/$RC/*; do 
-  svn cp $f . ; 
-done
-svn commit -m "Release Apache Airflow Python Client ${VERSION} from ${RC}"
-
-# Remove old release
-# http://www.apache.org/legal/release-policy.html#when-to-archive
-cd ..
-export PREVIOUS_VERSION=1.0.0
-svn rm ${PREVIOUS_VERSION}
-svn commit -m "Remove old release: ${PREVIOUS_VERSION}"
-```
-
-Verify that the packages appear in [airflow](https://dist.apache.org/repos/dist/release/airflow/clients/python)
-
-## Prepare PyPI "release" packages
-
-At this point we release an official package:
-
-- Copy the packages from the SVN into the dist folder in CLIENT_REPO_ROOT:
-
-    ```shell script
-    rm -rf ${CLIENT_REPO_ROOT}/dist
-    mkdir ${CLIENT_REPO_ROOT}/dist
-    cp ${CLIENT_RELEASE_SVN}/${VERSION}/apache-airflow-client-${VERSION}-bin.tar.gz ${CLIENT_REPO_ROOT}/dist/
-    cp ${CLIENT_RELEASE_SVN}/${VERSION}/apache_airflow_client-${VERSION}-py3-none-any.whl ${CLIENT_REPO_ROOT}/dist/
-    # Remove the -bin
-    mv ${CLIENT_REPO_ROOT}/dist/apache-airflow-client-${VERSION}-bin.tar.gz ${CLIENT_REPO_ROOT}/dist/apache-airflow-client-${VERSION}.tar.gz
-    ```
-
-- Verify the artifacts that would be uploaded:
-
-    ```shell script
-    twine check dist/*
-    ```
-
-- Upload the package to PyPi's production environment:
-
-    ```shell script
-    twine upload -r pypi dist/*
-    ```
-
-- Confirm that the package is available here: https://pypi.python.org/pypi/apache-airflow-client
-
-- Push Tag for the final version
-
-    ```shell script
-    git tag ${VERSION}
-    git push origin ${VERSION}
-    ```
-
-## Create release on GitHub
-
-Create a new release on GitHub with the release notes and assets from the release svn.
-
-## Notify developers of release
-
-Notify users@airflow.apache.org (cc'ing dev@airflow.apache.org) that the artifacts have been published:
-
-Subject:
-
-```shell script
-    cat <<EOF
-    [ANNOUNCE] Apache Airflow Python Client ${VERSION} Released
-    EOF
-```
-Body: 
-
-```shell script
-    cat <<EOF
-    Dear Airflow community,
-
-I'm happy to announce that Airflow Python Client ${VERSION} was just released.
-
-We also made this version available on PyPI for convenience:
-`pip install apache-airflow-client`
-https://pypi.org/project/apache-airflow-client/${VERSION}/
-
-The documentation is available at:
-https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html
-
-Find the changelog here for more details:
-https://github.com/apache/airflow-client-python/blob/main/CHANGELOG.md
-
-
-Cheers,
-<your name>
-EOF
-```
-Send the same email to announce@apache.org, except change the opening line to Dear community,. It is more reliable to send it via the web ui at https://lists.apache.org/list.html?announce@apache.org (press "c" to compose a new thread)
-
-
-
-## Add release data to Apache Committee Report Helper
-
-Add the release data (version and date) at: https://reporter.apache.org/addrelease.html?airflow
diff --git a/dev/insert_readme_example.py b/dev/insert_readme_example.py
deleted file mode 100755
index 9bbf902..0000000
--- a/dev/insert_readme_example.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/env python3
-# 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 pathlib import Path
-
-BASE_DIR = Path(__file__).resolve().parent.parent
-
-if __name__ == '__main__':
-    example = (BASE_DIR / "dev" / "test_python_client.py").read_text().splitlines()
-    example = example[example.index("# under the License.")+1:]   # Remove license header
-    readme_lines = (BASE_DIR / "README.md").read_text().splitlines()
-    result_lines = []
-    skip_lines = False
-    changes_made = False
-    for line in readme_lines:
-        if line.strip().startswith("example python script:"):
-            result_lines.append(line)
-            result_lines.append("")
-            result_lines.append("```python")
-            result_lines.extend(example)
-            result_lines.append("```")
-            skip_lines = True
-            changes_made = True
-        else:
-            if not skip_lines:
-                result_lines.append(line)
-            if line.strip() == "```":
-                skip_lines = False
-    (BASE_DIR / "README.md").write_text("\n".join(result_lines))
-    if not changes_made:
-        raise Exception("Could not find example python script in README.md to replace. "
-                        "Please make sure `example python script:` line is in README.md")
diff --git a/dev/sign.sh b/dev/sign.sh
deleted file mode 100755
index 178ba3c..0000000
--- a/dev/sign.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-set -euo pipefail
-
-# Use this to sign the tar balls generated from
-# python setup.py sdist --formats=gztar
-# ie. sign.sh <my_tar_ball>
-# you will still be required to type in your signing key password
-# or it needs to be available in your keychain
-
-# Which key to sign releases with? This can be a (partial) email address or a
-# key id. By default use any apache.org key
-SIGN_WITH="${SIGN_WITH:-apache.org}"
-
-for name in "${@}"
-do
-    gpg --yes --armor --local-user "$SIGN_WITH" --output "${name}.asc" --detach-sig "${name}"
-    shasum -a 512 "${name}" > "${name}.sha512"
-done
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..9c9fb31
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,105 @@
+# 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.
+
+[build-system]
+requires = ["hatchling"]
+build-backend = "hatchling.build"
+
+[project]
+name = "apache-airflow-client"
+dynamic = ["version"]
+description = "Apache Airflow API (Stable)"
+readme = "README.md"
+license-files.globs = ["LICENSE", "NOTICE"]
+requires-python = "~=3.8"
+authors = [
+    { name = "Apache Software Foundation", email = "dev@airflow.apache.org" },
+]
+keywords = [
+    "Apache Airflow API (Stable)",
+    "OpenAPI",
+    "OpenAPI-Generator",
+]
+classifiers = [
+    "Development Status :: 5 - Production/Stable",
+    "Environment :: Console",
+    "Environment :: Web Environment",
+    "Framework :: Apache Airflow",
+    "Intended Audience :: Developers",
+    "Intended Audience :: System Administrators",
+    "License :: OSI Approved :: Apache Software License",
+    "Programming Language :: Python :: 3.8",
+    "Programming Language :: Python :: 3.9",
+    "Programming Language :: Python :: 3.10",
+    "Programming Language :: Python :: 3.11",
+    "Topic :: System :: Monitoring",
+]
+
+dependencies = [
+    "python-dateutil",
+    "urllib3 >= 1.25.3",
+]
+
+[project.urls]
+"Bug Tracker" = "https://github.com/apache/airflow-client-python/issues"
+Changelog = "https://github.com/apache/airflow-client-python/blob/main/CHANGELOG.md"
+Documentation = "https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html"
+Download = "https://archive.apache.org/dist/airflow/clients/python/"
+Homepage = "https://airflow.apache.org/"
+"Source Code" = "https://github.com/apache/airflow/clients/python"
+
+[tool.hatch.envs.test]
+dependencies = [
+    "pytest-cov>=2.8.1",
+    "python_dateutil >= 2.5.3",
+    "urllib3 >= 1.25.3",
+]
+
+[tool.hatch.envs.test.scripts]
+run-coverage = "pytest --cov-config=pyproject.toml --cov=pkg --cov=tests"
+run = "run-coverage --no-cov"
+
+[[tool.hatch.envs.test.matrix]]
+python = ["3.8", "3.9", "3.10", "3.11"]
+
+[tool.hatch.version]
+path = "./version.txt"
+pattern = "^(?P<version>.+)$"
+
+[tool.hatch.build.targets.sdist]
+artifacts = [
+    "/airflow_client",
+    "/docs",
+    "/test",
+    "v1.yaml",
+]
+include = [
+    "version.txt",
+    "INSTALL",
+    "README.md",
+]
+
+[tool.hatch.build.targets.wheel]
+artifacts = [
+    "/airflow_client",
+    "/docs",
+    "/test",
+    "v1.yaml",
+]
+include = [
+    "/airflow_client",
+]
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 51a300c..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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.
-
-python_dateutil >= 2.5.3
-setuptools >= 21.0.0
-urllib3 >= 1.25.3
diff --git a/setup.cfg b/setup.cfg
deleted file mode 100644
index 74563b0..0000000
--- a/setup.cfg
+++ /dev/null
@@ -1,42 +0,0 @@
-# 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.
-
-[flake8]
-max-line-length=99
-
-[metadata]
-name = apache-airflow-client
-description = Apache Airflow API (Stable)
-author = Apache Software Foundation
-author_email = dev@airflow.apache.org
-url = https://airflow.apache.org/
-long_description = file: README.md
-long_description_content_type = text/markdown
-license = Apache License 2.0
-license_files =
-   LICENSE
-   NOTICE
-project_urls =
-    Documentation=https://airflow.apache.org/docs/apache-airflow/stable/stable-rest-api-ref.html
-    Changelog=https://github.com/apache/airflow-client-python/blob/main/CHANGELOG.md
-    Bug Tracker=https://github.com/apache/airflow-client-python/issues
-    Source Code=https://github.com/apache/airflow-client-python
-
-[options]
-zip_safe = False
-include_package_data = True
-python_requires = ~=3.7
diff --git a/setup.py b/setup.py
deleted file mode 100644
index 4bb8e0c..0000000
--- a/setup.py
+++ /dev/null
@@ -1,47 +0,0 @@
-# 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.
-
-"""
-    Airflow API (Stable)
-
-    The version of the OpenAPI document: 1.0.0
-    Contact: dev@airflow.apache.org
-    Generated by: https://openapi-generator.tech
-"""
-
-from setuptools import find_packages, setup  # noqa: H301
-
-VERSION = "2.8.0"
-# To install the library, run the following
-#
-# python setup.py install
-#
-# prerequisite: setuptools
-# http://pypi.python.org/pypi/setuptools
-
-REQUIRES = [
-    "urllib3 >= 1.25.3",
-    "python-dateutil",
-]
-
-setup(
-    version=VERSION,
-    keywords=["OpenAPI", "OpenAPI-Generator", "Apache Airflow API (Stable)"],
-    download_url=("https://archive.apache.org/dist/airflow/clients/python/" + VERSION),
-    install_requires=REQUIRES,
-    packages=find_packages(exclude=["test", "tests"]),
-)
diff --git a/test-requirements.txt b/test-requirements.txt
deleted file mode 100644
index 2ccbc58..0000000
--- a/test-requirements.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-# 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.
-
-pytest-cov>=2.8.1
-python_dateutil >= 2.5.3
-urllib3 >= 1.25.3
diff --git a/dev/test_python_client.py b/test_python_client.py
similarity index 100%
rename from dev/test_python_client.py
rename to test_python_client.py
diff --git a/version.txt b/version.txt
new file mode 100644
index 0000000..834f262
--- /dev/null
+++ b/version.txt
@@ -0,0 +1 @@
+2.8.0