incubator-airflow/breeze-complete

424 строки
14 KiB
Bash

#!/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.
# Allowed values for the commands & flags used
# The values here should be synchronized with the ones in
# the ./scripts/ci/libraries/_initialization.sh and it is verified
# by the BATS tests automatically during pre-commit and CI
# Those cannot be made read-only as the breeze-complete must be re-sourceable
_breeze_allowed_python_major_minor_versions="2.7 3.5 3.6 3.7 3.8"
_breeze_allowed_backends="sqlite mysql postgres"
_breeze_allowed_integrations="cassandra kerberos mongo openldap presto rabbitmq redis all"
_breeze_allowed_kubernetes_modes="image"
_breeze_allowed_kubernetes_versions="v1.18.6 v1.17.5 v1.16.9"
_breeze_allowed_helm_versions="v3.2.4"
_breeze_allowed_kind_versions="v0.8.0"
_breeze_allowed_mysql_versions="5.7 8"
_breeze_allowed_postgres_versions="9.6 10 11 12 13"
_breeze_allowed_kind_operations="start stop restart status deploy test shell"
_breeze_allowed_test_types="All Core Providers API CLI Integration Other WWW Heisentests Postgres MySQL"
# shellcheck disable=SC2034
{
# Default values for the commands & flags used
_breeze_default_backend=$(echo "${_breeze_allowed_backends}" | awk '{print $1}')
_breeze_default_kubernetes_mode=$(echo "${_breeze_allowed_kubernetes_modes}" | awk '{print $1}')
_breeze_default_kubernetes_version=$(echo "${_breeze_allowed_kubernetes_versions}" | awk '{print $1}')
_breeze_default_helm_version=$(echo "${_breeze_allowed_helm_versions}" | awk '{print $1}')
_breeze_default_kind_version=$(echo "${_breeze_allowed_kind_versions}" | awk '{print $1}')
_breeze_default_postgres_version=$(echo "${_breeze_allowed_postgres_versions}" | awk '{print $1}')
_breeze_default_mysql_version=$(echo "${_breeze_allowed_mysql_versions}" | awk '{print $1}')
_breeze_default_test_type=$(echo "${_breeze_allowed_test_types}" | awk '{print $1}')
}
_breeze_allowed_install_airflow_versions=$(cat <<-EOF
1.10.12
1.10.11
1.10.10
1.10.9
1.10.8
1.10.7
1.10.6
1.10.5
1.10.4
1.10.3
1.10.2
EOF
)
_breeze_allowed_static_checks=$(cat <<-EOF
all
all-but-pylint
airflow-config-yaml
base-operator
bats-tests
bats-in-container-tests
black
build
build-providers-dependencies
check-apache-license
check-builtin-literals
check-executables-have-shebangs
check-hooks-apply
check-integrations
check-merge-conflict
check-xml
consistent-pylint
daysago-import-check
debug-statements
detect-private-key
doctoc
dont-use-safe-filter
end-of-file-fixer
fix-encoding-pragma
flake8
forbid-tabs
helm-lint
incorrect-use-of-LoggingMixin
insert-license
isort
language-matters
lint-dockerfile
lint-openapi
mermaid
mixed-line-ending
mypy
no-relative-imports
pre-commit-descriptions
provide-create-sessions
pydevd
pydocstyle
pylint
pylint-tests
python-no-log-warn
restrict-start_date
rst-backticks
setup-order
shellcheck
sort-in-the-wild
stylelint
trailing-whitespace
update-breeze-file
update-extras
update-local-yml-file
update-setup-cfg-file
yamllint
EOF
)
_breeze_default_dockerhub_user="apache"
_breeze_default_dockerhub_repo="airflow"
_breeze_default_github_repository="apache/airflow"
_breeze_default_github_image_id="latest"
_breeze_short_options="
h p: b: i:
K: V:
l a: t: d:
v y n q f
F P I E: C r
L U X
D: R: c g: s:
S: N:
"
_breeze_long_options="
help python: backend: integration:
kubernetes-mode: kubernetes-version: helm-version: kind-version:
skip-mounting-local-sources install-airflow-version: install-airflow-reference: db-reset
verbose assume-yes assume-no assume-quit forward-credentials init-script:
force-build-images force-pull-images production-image extras: force-clean-images skip-rebuild-check
build-cache-local build-cache-pulled build-cache-disabled disable-pip-cache
dockerhub-user: dockerhub-repo: github-registry github-repository: github-image-id:
postgres-version: mysql-version:
version-suffix-for-pypi: version-suffix-for-svn: backports
additional-extras: additional-python-deps: additional-dev-deps: additional-runtime-deps: image-tag:
disable-mysql-client-installation constraints-location: disable-pip-cache add-local-pip-wheels
additional-extras: additional-python-deps: skip-installing-airflow-via-pip skip-installing-airflow-providers
dev-apt-deps: additional-dev-apt-deps: dev-apt-command: additional-dev-apt-command: additional-dev-apt-env:
runtime-apt-deps: additional-runtime-apt-deps: runtime-apt-command: additional-runtime-apt-command: additional-runtime-apt-env:
load-default-connections load-example-dags
install-wheels no-rbac-ui
test-type:
preserve-volumes
"
_breeze_commands="
shell
build-docs
build-image
cleanup-image
exec
generate-constraints
push-image
initialize-local-virtualenv
setup-autocomplete
start-airflow
stop
restart
toggle-suppress-cheatsheet
toggle-suppress-asciiart"
_breeze_extra_arg_commands="
docker-compose
kind-cluster
prepare-provider-readme
prepare-provider-packages
static-check
tests
"
_breeze_help_commands="
flags
help
help-all"
_breeze_all_commands="${_breeze_commands} ${_breeze_extra_arg_commands} ${_breeze_help_commands}"
# Note on OSX bash has no associative arrays (Bash 3.2) so we have to fake it
_breeze_known_values=""
#######################################################################################################
#
# Dynamically set list of values in _breeze_known_values variable depending on the command used
#
# Used variables:
# _breeze_allowed_* for allowed values for the commands
#
# Arguments:
# $1 - command to get known values for
#
# Set variables:
# _breeze_known_values is set to list of known values for the command, separated with space
#
#######################################################################################################
function breeze_complete::get_known_values_breeze() {
case "$1" in
-p | --python)
_breeze_known_values=${_breeze_allowed_python_major_minor_versions}
;;
-b | --backend)
_breeze_known_values=${_breeze_allowed_backends}
;;
-i | --integration)
_breeze_known_values=${_breeze_allowed_integrations}
;;
-K | --kubernetes-mode)
_breeze_known_values=${_breeze_allowed_kubernetes_modes}
;;
-V | --kubernetes-version)
_breeze_known_values=${_breeze_allowed_kubernetes_versions}
;;
--kind-version)
_breeze_known_values=${_breeze_allowed_kind_versions}
;;
--helm-version)
_breeze_known_values=${_breeze_allowed_helm_versions}
;;
static-check)
_breeze_known_values=${_breeze_allowed_static_checks}
;;
-A | --install-airflow-version)
_breeze_known_values=${_breeze_allowed_install_airflow_versions}
;;
docker-compose)
# shellcheck disable=SC2034
if typeset -f "_docker_compose" >/dev/null; then
_docker_compose
fi
_breeze_known_values=""
;;
--postgres-version)
_breeze_known_values=${_breeze_allowed_postgres_versions}
;;
--mysql-version)
_breeze_known_values=${_breeze_allowed_mysql_versions}
;;
-D | --dockerhub-user)
_breeze_known_values="${_breeze_default_dockerhub_user}"
;;
-R | --dockerhub-repo)
_breeze_known_values="${_breeze_default_dockerhub_repo}"
;;
-g | --github-repository)
_breeze_known_values="${_breeze_default_github_repository}"
;;
-s | --github-image-id)
_breeze_known_values="${_breeze_default_github_image_id}"
;;
kind-cluster)
_breeze_known_values="${_breeze_allowed_kind_operations}"
;;
tests)
_breeze_known_values="$(find tests -name '*.py')"
;;
--test-type)
_breeze_known_values="${_breeze_allowed_test_types}"
;;
*)
_breeze_known_values=""
;;
esac
}
_breeze_getopt_short_options=""
_breeze_getopt_long_options=""
#######################################################################################################
#
# Retrieves list of short and long options from the constants in the form of EOL separated values
# which is easy to maintain into comma separated list - usable for getopt.
#
# Used variables:
# _breeze_short_options
# _breeze_long_options
#
# Set variables:
# _breeze_getopt_short_options
# _breeze_getopt_long_options
#######################################################################################################
function breeze_complete::_build_options_breeze {
local separator=""
local option
for option in ${_breeze_short_options}
do
_breeze_getopt_short_options="${_breeze_getopt_short_options}${separator}${option}"
separator=","
done
separator=""
for option in ${_breeze_long_options}
do
_breeze_getopt_long_options="${_breeze_getopt_long_options}${separator}${option}"
separator=","
done
}
#######################################################################################################
#
# Returns 0 if word to check is in the list of words
# which is easy to maintain into comma separated list - usable for getopt.
#
# Arguments:
# $1 - space separated list of words
# $2 - word to look for
#
# Return:
# 0 - if the word is found in the list
# 1 - otherwise
#######################################################################################################
function breeze_complete::_listcontains_breeze {
local word
for word in $1; do
[[ ${word} = "$2" ]] && return 0
done
return 1
}
#######################################################################################################
#
# Convert options from the lists passed and add the options to appropriate variables.
# The options are stripped of the trailing colon and if they do have a colon, they are added
# to the options that require an argument. Options are prefixed with the prefix.
#
# Arguments:
# $1 - prefix for the option
# $2 - list of options
#
# Variables modified:
# all_options - space-separated all options
# options_with extra_args - space separate list of options with an extra argument
#######################################################################################################
function breeze_complete::_convert_options {
local option_with_prefix_without_colon
local option
local prefix=$1
for option in $2
do
last_character="${option:$((${#option} - 1)):1}"
option_with_prefix_without_colon=${prefix}${option//:/}
if [[ "${last_character}" == ":" ]]; then
options_with_extra_arguments="${options_with_extra_arguments} ${option_with_prefix_without_colon}"
fi
all_options="${all_options} ${option_with_prefix_without_colon}"
done
}
#######################################################################################################
#
# A completion function for breeze
#
# See: https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html#Programmable-Completion
#
#######################################################################################################
function breeze_complete::_comp_breeze {
local all_options=""
local options_with_extra_arguments=""
local currently_typed_string
local previous_command_in_the_command_line
local last_character
breeze_complete::_convert_options "-" "${_breeze_short_options}"
breeze_complete::_convert_options "--" "${_breeze_long_options}"
# Add all Breeze commands to list of all options
all_options="${all_options} ${_breeze_all_commands}"
# Add all Breeze commands with extra args to list of options with extra args
options_with_extra_arguments="${options_with_extra_arguments} ${_breeze_extra_arg_commands}"
# Retrieve typed beginning of current commands used so that we can use it as filter in the compgen utility
currently_typed_string="${COMP_WORDS[${COMP_CWORD}]}"
# if we have already typed more words, then we check what was the last previous command so that
# we can retrieve list of known values matching it.
if [[ ${#COMP_WORDS[@]} -gt 1 ]]; then
previous_command_in_the_command_line="${COMP_WORDS[${COMP_CWORD} - 1]}"
else
previous_command_in_the_command_line=""
fi
# if the previous command is in the list of options with extra args - check what are the known values
if breeze_complete::_listcontains_breeze \
"${options_with_extra_arguments}" "${previous_command_in_the_command_line}"; then
# Set COMPREPLY containing list of valid values matching currently typed string from known values
COMPREPLY=()
breeze_complete::get_known_values_breeze "${previous_command_in_the_command_line}"
while IFS='' read -r line; do COMPREPLY+=("${line}"); done \
< <(compgen -W "${_breeze_known_values}" -- "${currently_typed_string}")
else
# Set COMPREPLY containing list of valid commands/options matching currently typed string
COMPREPLY=()
while IFS='' read -r line; do COMPREPLY+=("${line}"); done \
< <(compgen -W "${all_options}" -- "${currently_typed_string}")
fi
}
breeze_complete::_build_options_breeze
# set autocompletion function for breeze
complete -F breeze_complete::_comp_breeze breeze
complete -F breeze_complete::_comp_breeze ./breeze