You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2021/02/26 20:59:43 UTC

[cassandra] branch trunk updated: deprecate python2.7 for cqlsh

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

brandonwilliams pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 72ca73f  deprecate python2.7 for cqlsh
72ca73f is described below

commit 72ca73fbc6bf5de0235f01d5f79b585ceed59949
Author: Adam Holmberg <ad...@datastax.com>
AuthorDate: Tue Feb 9 12:01:20 2021 -0600

    deprecate python2.7 for cqlsh
    
    Patch by Adam Holmberg; reviewed by brandonwilliams for CASSANDRA-16414
---
 NEWS.txt                                  |  2 ++
 README.asc                                |  2 +-
 bin/cqlsh                                 | 10 ++++------
 bin/cqlsh.py                              | 31 ++++++++++++-------------------
 doc/source/getting_started/installing.rst |  2 +-
 doc/source/tools/cqlsh.rst                |  2 +-
 pylib/cqlshlib/test/test_cqlsh_output.py  | 24 +++++++++++++++++++++++-
 7 files changed, 44 insertions(+), 29 deletions(-)

diff --git a/NEWS.txt b/NEWS.txt
index 3fd26e4..d1ca9a5 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -124,6 +124,7 @@ New features
 
 Upgrading
 ---------
+    - cqlsh shell startup script now prefers 'python3' before 'python' when identifying a runtime.
     - As part of the Internode Messaging improvement work in CASSANDRA-15066, matching response verbs for every request
       verb were introduced and verbs were renamed. DroppedMessageMetrics pre-4.0 are now available with _REQ suffix. As
       part of CASSANDRA-16083, we added DroppedMessageMetrics backward compatibility layer which exposes the metrics with
@@ -290,6 +291,7 @@ Deprecation
     - The JMX MBean org.apache.cassandra.db:type=BlacklistedDirectories has been
       deprecated in favor of org.apache.cassandra.db:type=DisallowedDirectories
       and will be removed in a subsequent major version.
+    - cqlsh support of 2.7 is deprecated and will warn when running with Python 2.7.
 
 Materialized Views
 -------------------
diff --git a/README.asc b/README.asc
index 194b1ee..2bec44f 100644
--- a/README.asc
+++ b/README.asc
@@ -12,7 +12,7 @@ For more information, see http://cassandra.apache.org/[the Apache Cassandra web
 Requirements
 ------------
 . Java >= 1.8 (OpenJDK and Oracle JVMS have been tested)
-. Python 2.7 (for cqlsh)
+. Python 3.6+ (for cqlsh; 2.7 works but is deprecated)
 
 Getting started
 ---------------
diff --git a/bin/cqlsh b/bin/cqlsh
index 0774d52..d13acf7 100755
--- a/bin/cqlsh
+++ b/bin/cqlsh
@@ -53,17 +53,16 @@ fi
 # get a version string for a Python interpreter
 get_python_version() {
     interpreter=$1
-    version=$(command -v "$interpreter" > /dev/null 2>&1 && $interpreter -c "import os; print('{}.{}'.format(os.sys.version_info.major, os.sys.version_info.minor))")
+    version=$($interpreter -c "import os; print('{}.{}'.format(os.sys.version_info.major, os.sys.version_info.minor))" 2> /dev/null)
     echo "$version"
 }
 
 # test whether a version string matches one of the supported versions for cqlsh
 is_supported_version() {
     version=$1
-    # shellcheck disable=SC2039
     # shellcheck disable=SC2072
-    # python2.7 or python3.6+ is supported
-    if [ "$version" = "3.6" ] || [ "$version" \> "3.6" ] || [ "$version" = "2.7" ]; then
+    # python3.6+ is supported. python2.7 is deprecated but still compatible.
+    if [ ! "$version" \< "3.6" ] || [ "$version" = "2.7" ]; then
         echo "supported"
     else
         echo "unsupported"
@@ -88,8 +87,7 @@ if [ "$USER_SPECIFIED_PYTHON" != "" ]; then
     # run a user specified Python interpreter
     run_if_supported_version "$USER_SPECIFIED_PYTHON" "$@"
 else
-    # try unqualified python first, then python3, then python2.7
-    for interpreter in python python3 python2.7; do
+    for interpreter in python3 python python2.7; do
         run_if_supported_version "$interpreter" "$@"
     done
 fi
diff --git a/bin/cqlsh.py b/bin/cqlsh.py
old mode 100644
new mode 100755
index 09183a7..dd9d95f
--- a/bin/cqlsh.py
+++ b/bin/cqlsh.py
@@ -1,5 +1,4 @@
-#!/bin/sh
-# -*- mode: Python -*-
+#!/usr/bin/python3
 
 # Licensed to the Apache Software Foundation (ASF) under one
 # or more contributor license agreements.  See the NOTICE file
@@ -17,20 +16,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-""":"
-# bash code here; finds a suitable python interpreter and execs this file.
-# this implementation of cqlsh is compatible with both Python 3 and Python 2.7.
-# prefer unqualified "python" if suitable:
-python -c 'import sys; sys.exit(not (0x020700b0 < sys.hexversion))' 2>/dev/null \
-    && exec python "$0" "$@"
-for pyver in 3 2.7; do
-    which python$pyver > /dev/null 2>&1 && exec python$pyver "$0" "$@"
-done
-echo "No appropriate python interpreter found." >&2
-exit 1
-":"""
-
-from __future__ import division, unicode_literals
+from __future__ import division, unicode_literals, print_function
 
 import cmd
 import codecs
@@ -48,8 +34,8 @@ from contextlib import contextmanager
 from glob import glob
 from uuid import UUID
 
-if sys.version_info.major != 3 and (sys.version_info.major == 2 and sys.version_info.minor != 7):
-    sys.exit("\nCQL Shell supports only Python 3 or Python 2.7\n")
+if sys.version_info < (3, 6) and sys.version_info[0:2] != (2, 7):
+    sys.exit("\ncqlsh requires Python 3.6+ or Python 2.7 (deprecated)\n")
 
 # see CASSANDRA-10428
 if platform.python_implementation().startswith('Jython'):
@@ -532,6 +518,7 @@ class Shell(cmd.Cmd):
 
         if tty:
             self.reset_prompt()
+            self.maybe_warn_py2()
             self.report_connection()
             print('Use HELP for help.')
         else:
@@ -605,7 +592,7 @@ class Shell(cmd.Cmd):
         self.show_version()
 
     def show_host(self):
-        print("Connected to {0} at {1}:{2}."
+        print("Connected to {0} at {1}:{2}"
               .format(self.applycolor(self.get_cluster_name(), BLUE),
                       self.hostname,
                       self.port))
@@ -618,6 +605,12 @@ class Shell(cmd.Cmd):
         vers['cql'] = self.cql_version
         print("[cqlsh %(shver)s | Cassandra %(build)s | CQL spec %(cql)s | Native protocol v%(protocol)s]" % vers)
 
+    def maybe_warn_py2(self):
+        py2_suppress_warn = 'CQLSH_NO_WARN_PY2'
+        if sys.version_info[0:2] == (2, 7) and not os.environ.get(py2_suppress_warn):
+            print("Python 2.7 support is deprecated. "
+                  "Install Python 3.6+ or set %s to suppress this message.\n" % (py2_suppress_warn,))
+
     def show_session(self, sessionid, partial_session=False):
         print_trace_session(self, self.session, sessionid, partial_session)
 
diff --git a/doc/source/getting_started/installing.rst b/doc/source/getting_started/installing.rst
index 5c5239d..568549f 100644
--- a/doc/source/getting_started/installing.rst
+++ b/doc/source/getting_started/installing.rst
@@ -43,7 +43,7 @@ Prerequisites
 - **NOTE**: *Experimental* support for Java 11 was added in Cassandra 4.0 (`CASSANDRA-9608 <https://issues.apache.org/jira/browse/CASSANDRA-9608>`__).
   Running Cassandra on Java 11 is *experimental*. Do so at your own risk. For more information, see
   `NEWS.txt <https://github.com/apache/cassandra/blob/trunk/NEWS.txt>`__.
-- For using cqlsh, the latest version of `Python 2.7 <https://www.python.org/downloads/>`__ or Python 3.6+. To verify that you have
+- For using cqlsh, the latest version of `Python 3.6+ <https://www.python.org/downloads/>`__ or Python 2.7 (support deprecated). To verify that you have
   the correct version of Python installed, type ``python --version``.
 
 Choosing an installation method
diff --git a/doc/source/tools/cqlsh.rst b/doc/source/tools/cqlsh.rst
index b800b88..6fc2ee2 100644
--- a/doc/source/tools/cqlsh.rst
+++ b/doc/source/tools/cqlsh.rst
@@ -13,7 +13,7 @@ the Python native protocol driver, and connects to the single node specified on
 Compatibility
 ^^^^^^^^^^^^^
 
-cqlsh is compatible with Python 2.7.
+cqlsh is compatible with Python 3.6+ (and 2.7, deprecated).
 
 In general, a given version of cqlsh is only guaranteed to work with the version of Cassandra that it was released with.
 In some cases, cqlsh make work with older or newer versions of Cassandra, but this is not officially supported.
diff --git a/pylib/cqlshlib/test/test_cqlsh_output.py b/pylib/cqlshlib/test/test_cqlsh_output.py
index 324587d..4432a54 100644
--- a/pylib/cqlshlib/test/test_cqlsh_output.py
+++ b/pylib/cqlshlib/test/test_cqlsh_output.py
@@ -22,6 +22,7 @@ from __future__ import unicode_literals, with_statement
 import locale
 import os
 import re
+import subprocess
 import sys
 import unittest
 
@@ -36,6 +37,9 @@ from .ansi_colors import (ColoredText, ansi_seq, lookup_colorcode,
 CONTROL_C = '\x03'
 CONTROL_D = '\x04'
 
+has_python27 = not subprocess.call(['python2.7', '--version'])
+has_python3 = not subprocess.call(['python3', '--version'])
+
 class TestCqlshOutput(BaseTestCase):
 
     @classmethod
@@ -777,9 +781,27 @@ class TestCqlshOutput(BaseTestCase):
 
             output = c.cmd_and_response('show host;')
             self.assertHasColors(output)
-            self.assertRegex(output, '^Connected to .* at %s:%d\.$'
+            self.assertRegex(output, '^Connected to .* at %s:%d$'
                                              % (re.escape(TEST_HOST), TEST_PORT))
 
+    @unittest.skipIf(not has_python27, 'Python 2.7 not available to test warning')
+    def test_warn_py2(self):
+        env = self.default_env.copy()
+        env['USER_SPECIFIED_PYTHON'] = 'python2.7'
+        # has the warning
+        with testrun_cqlsh(tty=True, env=env) as c:
+            self.assertIn('Python 2.7 support is deprecated.', c.output_header, 'cqlsh did not output expected warning.')
+
+        # can suppress
+        env['CQLSH_NO_WARN_PY2'] = '1'
+        with testrun_cqlsh(tty=True, env=env) as c:
+            self.assertNotIn('Python 2.7 support is deprecated.', c.output_header, 'cqlsh did not output expected warning.')
+
+    @unittest.skipIf(not (has_python27 and has_python3), 'Python 3 and 2.7 not available to test preference')
+    def test_no_warn_both_py_present(self):
+        with testrun_cqlsh(tty=True, env=self.default_env) as c:
+            self.assertNotIn('Python 2.7 support is deprecated.', c.output_header, 'cqlsh did not output expected warning.')
+
     @unittest.skipIf(sys.platform == "win32", 'EOF signaling not supported on Windows')
     def test_eof_prints_newline(self):
         with testrun_cqlsh(tty=True, env=self.default_env) as c:


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org