This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new c26fbd34ad Remove groundwork for Click CLI (#24793)
c26fbd34ad is described below
commit c26fbd34ad957dedded6de01512169d18541c63c
Author: blag <[email protected]>
AuthorDate: Tue Aug 16 09:17:38 2022 -0700
Remove groundwork for Click CLI (#24793)
---
airflow/cli/__init__.py | 105 -------------------------------------------
airflow/cli/__main__.py | 23 ----------
airflow/utils/cli.py | 71 +++++++++++------------------
setup.cfg | 2 -
tests/utils/test_cli_util.py | 4 +-
5 files changed, 27 insertions(+), 178 deletions(-)
diff --git a/airflow/cli/__init__.py b/airflow/cli/__init__.py
index 9a913a3415..217e5db960 100644
--- a/airflow/cli/__init__.py
+++ b/airflow/cli/__init__.py
@@ -15,108 +15,3 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
-import os
-
-import rich_click as click
-
-from airflow import settings
-from airflow.utils.cli import ColorMode
-from airflow.utils.timezone import parse as parsedate
-
-BUILD_DOCS = "BUILDING_AIRFLOW_DOCS" in os.environ
-
-click_color = click.option(
- '--color',
- type=click.Choice([ColorMode.ON, ColorMode.OFF, ColorMode.AUTO]),
- default=ColorMode.AUTO,
- help="Do emit colored output (default: auto)",
-)
-click_conf = click.option(
- '-c', '--conf', help="JSON string that gets pickled into the DagRun's conf
attribute"
-)
-click_daemon = click.option(
- "-D", "--daemon", 'daemon_', is_flag=True, help="Daemonize instead of
running in the foreground"
-)
-click_dag_id = click.argument("dag_id", help="The id of the dag")
-click_dag_id_opt = click.option("-d", "--dag-id", help="The id of the dag")
-click_debug = click.option(
- "-d", "--debug", is_flag=True, help="Use the server that ships with Flask
in debug mode"
-)
-click_dry_run = click.option(
- '-n',
- '--dry-run',
- is_flag=True,
- default=False,
- help="Perform a dry run for each task. Only renders Template Fields for
each task, nothing else",
-)
-click_end_date = click.option(
- "-e",
- "--end-date",
- type=parsedate,
- help="Override end_date YYYY-MM-DD",
-)
-click_execution_date = click.argument("execution_date", help="The execution
date of the DAG", type=parsedate)
-click_execution_date_or_run_id = click.argument(
- "execution_date_or_run_id", help="The execution_date of the DAG or run_id
of the DAGRun"
-)
-click_log_file = click.option(
- "-l",
- "--log-file",
- metavar="LOG_FILE",
- type=click.Path(exists=False, dir_okay=False, writable=True),
- help="Location of the log file",
-)
-click_output = click.option(
- "-o",
- "--output",
- type=click.Choice(["table", "json", "yaml", "plain"]),
- default="table",
- help="Output format.",
-)
-click_pid = click.option("--pid", metavar="PID",
type=click.Path(exists=False), help="PID file location")
-click_start_date = click.option(
- "-s",
- "--start-date",
- type=parsedate,
- help="Override start_date YYYY-MM-DD",
-)
-click_stderr = click.option(
- "--stderr",
- metavar="STDERR",
- type=click.Path(exists=False, dir_okay=False, writable=True),
- help="Redirect stderr to this file",
-)
-click_stdout = click.option(
- "--stdout",
- metavar="STDOUT",
- type=click.Path(exists=False, dir_okay=False, writable=True),
- help="Redirect stdout to this file",
-)
-click_subdir = click.option(
- "-S",
- "--subdir",
- default='[AIRFLOW_HOME]/dags' if BUILD_DOCS else settings.DAGS_FOLDER,
- type=click.Path(),
- help=(
- "File location or directory from which to look for the dag. "
- "Defaults to '[AIRFLOW_HOME]/dags' where [AIRFLOW_HOME] is the "
- "value you set for 'AIRFLOW_HOME' config you set in 'airflow.cfg' "
- ),
-)
-click_task_id = click.argument("task_id", help="The id of the task")
-click_task_regex = click.option(
- "-t", "--task-regex", help="The regex to filter specific task_ids to
backfill (optional)"
-)
-click_verbose = click.option(
- '-v', '--verbose', is_flag=True, default=False, help="Make logging output
more verbose"
-)
-click_yes = click.option(
- '-y', '--yes', is_flag=True, default=False, help="Do not prompt to
confirm. Use with care!"
-)
-
-
-#
https://click.palletsprojects.com/en/8.1.x/documentation/#help-parameter-customization
[email protected](context_settings={'help_option_names': ['-h', '--help']})
[email protected]_context
-def airflow_cmd(ctx):
- pass
diff --git a/airflow/cli/__main__.py b/airflow/cli/__main__.py
deleted file mode 100644
index 2ae6c91cb3..0000000000
--- a/airflow/cli/__main__.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/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 airflow.cli import airflow_cmd
-
-if __name__ == '__main__':
- airflow_cmd(obj={})
diff --git a/airflow/utils/cli.py b/airflow/utils/cli.py
index 8b04e49d91..d3322ac13f 100644
--- a/airflow/utils/cli.py
+++ b/airflow/utils/cli.py
@@ -46,10 +46,14 @@ if TYPE_CHECKING:
def _check_cli_args(args):
if not args:
- raise ValueError(f"Args should be set: {args} [{type(args)}]")
+ raise ValueError("Args should be set")
+ if not isinstance(args[0], Namespace):
+ raise ValueError(
+ f"1st positional argument should be argparse.Namespace instance,
but is {type(args[0])}"
+ )
-def action_cli(func=None, check_db=True, check_cli_args=True):
+def action_cli(func=None, check_db=True):
def action_logging(f: T) -> T:
"""
Decorates function to execute function at the same time submitting
action_logging
@@ -75,14 +79,15 @@ def action_cli(func=None, check_db=True,
check_cli_args=True):
@functools.wraps(f)
def wrapper(*args, **kwargs):
"""
- An wrapper for cli functions.
+ An wrapper for cli functions. It assumes to have Namespace instance
+ at 1st positional argument
- :param args: Positional argument.
+ :param args: Positional argument. It assumes to have Namespace
instance
+ at 1st positional argument
:param kwargs: A passthrough keyword argument
"""
- if check_cli_args:
- _check_cli_args(args)
- metrics = _build_metrics(f.__name__, args, kwargs)
+ _check_cli_args(args)
+ metrics = _build_metrics(f.__name__, args[0])
cli_action_loggers.on_pre_execution(**metrics)
try:
# Check and run migrations if necessary
@@ -106,16 +111,15 @@ def action_cli(func=None, check_db=True,
check_cli_args=True):
return action_logging
-def _build_metrics(func_name, args, kwargs):
+def _build_metrics(func_name, namespace):
"""
Builds metrics dict from function args
- If the first item in args is a Namespace instance, it assumes that it
- optionally contains "dag_id", "task_id", and "execution_date".
+ It assumes that function arguments is from airflow.bin.cli module's
function
+ and has Namespace instance where it optionally contains "dag_id",
"task_id",
+ and "execution_date".
:param func_name: name of function
- :param args: Arguments from wrapped function, possibly including the
Namespace instance from
- argparse as the first argument
- :param kwargs: Keyword arguments from wrapped function
+ :param namespace: Namespace instance from argparse
:return: dict with metrics
"""
from airflow.models import Log
@@ -142,7 +146,11 @@ def _build_metrics(func_name, args, kwargs):
'user': getuser(),
}
- tmp_dic = vars(args[0]) if (args and isinstance(args[0], Namespace)) else
kwargs
+ if not isinstance(namespace, Namespace):
+ raise ValueError(
+ f"namespace argument should be argparse.Namespace instance, but is
{type(namespace)}"
+ )
+ tmp_dic = vars(namespace)
metrics['dag_id'] = tmp_dic.get('dag_id')
metrics['task_id'] = tmp_dic.get('task_id')
metrics['execution_date'] = tmp_dic.get('execution_date')
@@ -298,13 +306,11 @@ class ColorMode:
AUTO = "auto"
-def should_use_colors(args_or_color):
+def should_use_colors(args) -> bool:
"""Processes arguments and decides whether to enable color in output"""
- # args.color is from argparse, Click CLI will pass in the color directly
- color = args_or_color.color if hasattr(args_or_color, 'color') else
args_or_color
- if color == ColorMode.ON:
+ if args.color == ColorMode.ON:
return True
- if color == ColorMode.OFF:
+ if args.color == ColorMode.OFF:
return False
return is_terminal_support_colors()
@@ -332,30 +338,3 @@ def suppress_logs_and_warning(f: T) -> T:
logging.disable(logging.NOTSET)
return cast(T, _wrapper)
-
-
-def suppress_logs_and_warning_click_compatible(f: T) -> T:
- """
- Click compatible version of suppress_logs_and_warning.
- Place after click_verbose decorator.
-
- Decorator to suppress logging and warning messages
- in cli functions.
- """
-
- @functools.wraps(f)
- def _wrapper(*args, **kwargs):
- if kwargs.get("verbose"):
- f(*args, **kwargs)
- else:
- with warnings.catch_warnings():
- warnings.simplefilter("ignore")
- logging.disable(logging.CRITICAL)
- try:
- f(*args, **kwargs)
- finally:
- # logging output again depends on the effective
- # levels of individual loggers
- logging.disable(logging.NOTSET)
-
- return cast(T, _wrapper)
diff --git a/setup.cfg b/setup.cfg
index e6d3c4cef5..c39d9c1d8e 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -140,7 +140,6 @@ install_requires =
python-nvd3>=0.15.0
python-slugify>=5.0
rich>=12.4.4
- rich-click>=1.3.1
setproctitle>=1.1.8
sqlalchemy>=1.4
sqlalchemy_jsonfield>=1.0
@@ -175,7 +174,6 @@ generated=
[options.entry_points]
console_scripts=
airflow=airflow.__main__:main
- airflow-ng=airflow.cli.__main__:airflow_cmd
[bdist_wheel]
python-tag=py3
diff --git a/tests/utils/test_cli_util.py b/tests/utils/test_cli_util.py
index da0e47a495..d69e651a20 100644
--- a/tests/utils/test_cli_util.py
+++ b/tests/utils/test_cli_util.py
@@ -38,7 +38,7 @@ class TestCliUtil(unittest.TestCase):
func_name = 'test'
exec_date = datetime.utcnow()
namespace = Namespace(dag_id='foo', task_id='bar', subcommand='test',
execution_date=exec_date)
- metrics = cli._build_metrics(func_name, [namespace], {})
+ metrics = cli._build_metrics(func_name, namespace)
expected = {
'user': os.environ.get('USER'),
@@ -132,7 +132,7 @@ class TestCliUtil(unittest.TestCase):
exec_date = datetime.utcnow()
namespace = Namespace(dag_id='foo', task_id='bar', subcommand='test',
execution_date=exec_date)
with mock.patch.object(sys, "argv", args):
- metrics = cli._build_metrics(args[1], [namespace], {})
+ metrics = cli._build_metrics(args[1], namespace)
assert metrics.get('start_datetime') <= datetime.utcnow()