scylla-cqlsh 6.0.21__tar.gz → 6.0.24__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of scylla-cqlsh might be problematic. Click here for more details.

Files changed (109) hide show
  1. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/.github/workflows/build-push.yml +20 -18
  2. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/.github/workflows/dockerhub-description.yml +1 -1
  3. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/.gitignore +3 -0
  4. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/Dockerfile +2 -2
  5. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/PKG-INFO +15 -2
  6. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/README.md +10 -0
  7. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/SCYLLA-VERSION-GEN +1 -1
  8. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/bin/cqlsh.py +67 -41
  9. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlsh/cqlsh.py +67 -41
  10. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/_version.py +2 -2
  11. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/copyutil.c +2070 -1963
  12. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/dist/debian/control.template +2 -2
  13. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/dist/redhat/scylla-cqlsh.spec +4 -3
  14. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/install.sh +1 -3
  15. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/run_cqlsh.py +3 -2
  16. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_cqlsh_output.py +2 -2
  17. scylla_cqlsh-6.0.24/pylib/cqlshlib/test/test_formatting.py +69 -0
  18. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/setup.py +3 -5
  19. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/reloc/build_reloc.sh +3 -16
  20. scylla_cqlsh-6.0.24/renovate.json +6 -0
  21. scylla_cqlsh-6.0.24/requirements.txt +3 -0
  22. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/scripts/create-relocatable-package.py +32 -4
  23. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/scylla_cqlsh.egg-info/PKG-INFO +15 -2
  24. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/scylla_cqlsh.egg-info/SOURCES.txt +2 -4
  25. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/setup.py +3 -5
  26. scylla_cqlsh-6.0.21/bin/cqlsh +0 -99
  27. scylla_cqlsh-6.0.21/pylib/Dockerfile.ubuntu.py3 +0 -2
  28. scylla_cqlsh-6.0.21/pylib/Dockerfile.ubuntu.py37 +0 -2
  29. scylla_cqlsh-6.0.21/pylib/Dockerfile.ubuntu.py38 +0 -2
  30. scylla_cqlsh-6.0.21/requirements.txt +0 -5
  31. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/.dockerignore +0 -0
  32. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/LICENSE.txt +0 -0
  33. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlsh/__init__.py +0 -0
  34. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlsh/__main__.py +0 -0
  35. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/__init__.py +0 -0
  36. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/authproviderhandling.py +0 -0
  37. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/copyutil.py +0 -0
  38. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/cql3handling.py +0 -0
  39. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/cqlhandling.py +0 -0
  40. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/cqlshhandling.py +0 -0
  41. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/displaying.py +0 -0
  42. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/formatting.py +0 -0
  43. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/helptopics.py +0 -0
  44. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/pylexotron.py +0 -0
  45. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/saferscanner.py +0 -0
  46. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/sslhandling.py +0 -0
  47. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/tracing.py +0 -0
  48. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/util.py +0 -0
  49. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/cqlshlib/wcwidth.py +0 -0
  50. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/dist/debian/changelog.template +0 -0
  51. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/dist/debian/debian/compat +0 -0
  52. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/dist/debian/debian/copyright +0 -0
  53. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/dist/debian/debian/rules +0 -0
  54. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/dist/debian/debian/source/format +0 -0
  55. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/dist/debian/debian/source/options +0 -0
  56. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/dist/debian/debian_files_gen.py +0 -0
  57. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/install-dependencies.sh +0 -0
  58. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/README.asc +0 -0
  59. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cassandra-cqlsh-tests.sh +0 -0
  60. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/__init__.py +0 -0
  61. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/authproviderhandling.py +0 -0
  62. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/copyutil.py +0 -0
  63. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/cql3handling.py +0 -0
  64. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/cqlhandling.py +0 -0
  65. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/cqlshhandling.py +0 -0
  66. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/displaying.py +0 -0
  67. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/formatting.py +0 -0
  68. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/helptopics.py +0 -0
  69. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/pylexotron.py +0 -0
  70. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/saferscanner.py +0 -0
  71. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/sslhandling.py +0 -0
  72. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/__init__.py +0 -0
  73. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/ansi_colors.py +0 -0
  74. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/basecase.py +0 -0
  75. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/cassconnect.py +0 -0
  76. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/reserved_keywords.txt +0 -0
  77. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling.py +0 -0
  78. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider +0 -0
  79. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider_creds +0 -0
  80. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider_with_pass +0 -0
  81. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/empty_example +0 -0
  82. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/full_plain_text_example +0 -0
  83. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/illegal_example +0 -0
  84. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/no_classname_example +0 -0
  85. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/partial_example +0 -0
  86. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_full_creds +0 -0
  87. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_legacy +0 -0
  88. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_partial_creds +0 -0
  89. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_partial_example +0 -0
  90. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_constants.py +0 -0
  91. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_copyutil.py +0 -0
  92. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_cql_parsing.py +0 -0
  93. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_cqlsh_completion.py +0 -0
  94. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_keyspace_init.cql +0 -0
  95. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_legacy_auth.py +0 -0
  96. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/test_unicode.py +0 -0
  97. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/test/winpty.py +0 -0
  98. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/tracing.py +0 -0
  99. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/util.py +0 -0
  100. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/cqlshlib/wcwidth.py +0 -0
  101. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pylib/requirements.txt +0 -0
  102. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/pyproject.toml +0 -0
  103. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/reloc/build_deb.sh +0 -0
  104. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/reloc/build_rpm.sh +0 -0
  105. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/scylla_cqlsh.egg-info/dependency_links.txt +0 -0
  106. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/scylla_cqlsh.egg-info/entry_points.txt +0 -0
  107. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/scylla_cqlsh.egg-info/requires.txt +0 -0
  108. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/scylla_cqlsh.egg-info/top_level.txt +0 -0
  109. {scylla_cqlsh-6.0.21 → scylla_cqlsh-6.0.24}/setup.cfg +0 -0
@@ -20,16 +20,17 @@ jobs:
20
20
  runs-on: ${{ matrix.os }}
21
21
  strategy:
22
22
  matrix:
23
- os: [ubuntu-20.04, windows-2019, macos-11]
23
+ os: [ubuntu-20.04, windows-2019, macos-13, macos-14]
24
24
 
25
25
  steps:
26
- - uses: actions/checkout@v3
26
+ - uses: actions/checkout@v4
27
27
 
28
28
  - name: Build wheels
29
- uses: pypa/cibuildwheel@v2.16.5
29
+ uses: pypa/cibuildwheel@v2.22.0
30
30
 
31
- - uses: actions/upload-artifact@v3
31
+ - uses: actions/upload-artifact@v4
32
32
  with:
33
+ name: wheels-${{ matrix.os }}
33
34
  path: ./wheelhouse/*.whl
34
35
 
35
36
  build_sdist:
@@ -37,14 +38,15 @@ jobs:
37
38
  if: contains(github.event.pull_request.labels.*.name, 'test-build') || github.event_name == 'push' && endsWith(github.event.ref, 'scylla')
38
39
  runs-on: ubuntu-latest
39
40
  steps:
40
- - uses: actions/checkout@v3
41
+ - uses: actions/checkout@v4
41
42
 
42
43
  - name: Build sdist
43
44
  run: |
44
45
  pipx run build --sdist
45
46
 
46
- - uses: actions/upload-artifact@v3
47
+ - uses: actions/upload-artifact@v4
47
48
  with:
49
+ name: source-dist
48
50
  path: dist/*.tar.gz
49
51
 
50
52
  integration_test_scylla:
@@ -52,7 +54,7 @@ jobs:
52
54
  if: "!contains(github.event.pull_request.labels.*.name, 'disable-integration-test')"
53
55
  runs-on: ubuntu-latest
54
56
  steps:
55
- - uses: actions/checkout@v3
57
+ - uses: actions/checkout@v4
56
58
 
57
59
  - name: Start Scylla
58
60
  run: |
@@ -67,6 +69,7 @@ jobs:
67
69
  - name: pytest
68
70
  run: |
69
71
  pip install -r ./pylib/requirements.txt
72
+ ./reloc/build_reloc.sh
70
73
  pytest ./cqlshlib/test
71
74
 
72
75
  integration_test_scylla_enterprise:
@@ -74,7 +77,7 @@ jobs:
74
77
  if: "!contains(github.event.pull_request.labels.*.name, 'disable-integration-test')"
75
78
  runs-on: ubuntu-latest
76
79
  steps:
77
- - uses: actions/checkout@v3
80
+ - uses: actions/checkout@v4
78
81
 
79
82
  - name: Start Scylla
80
83
  run: |
@@ -89,6 +92,7 @@ jobs:
89
92
  - name: pytest
90
93
  run: |
91
94
  pip install -r ./pylib/requirements.txt
95
+ ./reloc/build_reloc.sh
92
96
  pytest ./cqlshlib/test
93
97
 
94
98
  integration_test_scylla_cloud_bundle:
@@ -96,17 +100,13 @@ jobs:
96
100
  if: "!contains(github.event.pull_request.labels.*.name, 'disable-integration-test')"
97
101
  runs-on: ubuntu-latest
98
102
  steps:
99
- - uses: actions/checkout@v3
103
+ - uses: actions/checkout@v4
100
104
 
101
105
  - name: Start Scylla cloud bundle setup with CCM
102
106
  run: |
103
- # install python2 is needed for scylla < 5.3, cause it bundle with old cqlsh
104
- sudo apt update -y
105
- sudo apt install -y python2
106
-
107
107
  python3 -m pip install https://github.com/scylladb/scylla-ccm/archive/master.zip
108
108
 
109
- ccm create test_sni -i 127.0.1. -n 1 --scylla --version release:5.2
109
+ ccm create test_sni -i 127.0.1. -n 1 --scylla --version release:6.2
110
110
  ccm start --sni-proxy --sni-port=8443
111
111
 
112
112
  export CQL_TEST_BUNDLE_PATH=$(realpath ~/.ccm/test_sni/config_data.yaml)
@@ -116,6 +116,7 @@ jobs:
116
116
  - name: pytest
117
117
  run: |
118
118
  pip install -r ./pylib/requirements.txt
119
+ ./reloc/build_reloc.sh
119
120
  pytest ./cqlshlib/test
120
121
 
121
122
  integration_test_cassandra:
@@ -123,7 +124,7 @@ jobs:
123
124
  if: "!contains(github.event.pull_request.labels.*.name, 'disable-integration-test')"
124
125
  runs-on: ubuntu-latest
125
126
  steps:
126
- - uses: actions/checkout@v3
127
+ - uses: actions/checkout@v4
127
128
 
128
129
  - name: Start Scylla
129
130
  run: |
@@ -138,6 +139,7 @@ jobs:
138
139
  - name: pytest
139
140
  run: |
140
141
  pip install -r ./pylib/requirements.txt
142
+ ./reloc/build_reloc.sh
141
143
  pytest ./cqlshlib/test
142
144
 
143
145
  docker:
@@ -145,7 +147,7 @@ jobs:
145
147
  if: github.event_name == 'push'
146
148
  steps:
147
149
  - name: Checkout
148
- uses: actions/checkout@v3
150
+ uses: actions/checkout@v4
149
151
 
150
152
  - name: Set up QEMU
151
153
  uses: docker/setup-qemu-action@v2
@@ -198,10 +200,10 @@ jobs:
198
200
  # alternatively, to publish when a GitHub Release is created, use the following rule:
199
201
  # if: github.event_name == 'release' && github.event.action == 'published'
200
202
  steps:
201
- - uses: actions/download-artifact@v2
203
+ - uses: actions/download-artifact@v4.1.8
202
204
  with:
203
- name: artifact
204
205
  path: dist
206
+ merge-multiple: true
205
207
 
206
208
  - uses: pypa/gh-action-pypi-publish@release/v1
207
209
  with:
@@ -10,7 +10,7 @@ jobs:
10
10
  dockerHubDescription:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
- - uses: actions/checkout@v3
13
+ - uses: actions/checkout@v4
14
14
 
15
15
  - name: Docker Hub Description
16
16
  uses: peter-evans/dockerhub-description@v3
@@ -6,6 +6,9 @@ build.properties
6
6
  build/**
7
7
  dist/*.tar.gz
8
8
 
9
+ # generated code
10
+ bin/cqlsh
11
+
9
12
  pylib/cqlshlib/_version.py
10
13
  pylib/cqlshlib/copyutil.c
11
14
  pylib/cqlshlib/__pycache__/**
@@ -1,4 +1,4 @@
1
- FROM python:3.11-slim-bullseye AS compile-image
1
+ FROM python:3.13-slim-bullseye AS compile-image
2
2
 
3
3
  WORKDIR /usr/src/app
4
4
  RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get -y install --no-install-recommends git gcc libc6-dev
@@ -7,7 +7,7 @@ COPY . .
7
7
  RUN pip install --user .
8
8
 
9
9
 
10
- FROM python:3.11-slim-bullseye AS build-image
10
+ FROM python:3.13-slim-bullseye AS build-image
11
11
 
12
12
  # Upgrade packages to the latest, pip as well.
13
13
  RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get -y upgrade && apt-get clean && rm -rf /var/lib/apt/lists/*
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: scylla-cqlsh
3
- Version: 6.0.21
3
+ Version: 6.0.24
4
4
  Summary: cqlsh is a Python-based command-line client for running CQL commands on a scylla cluster.
5
5
  Home-page: https://github.com/scylladb/scylla-cqlsh
6
6
  Author: Israel Fruchter
@@ -18,6 +18,9 @@ Requires-Python: >=3.6
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE.txt
20
20
  Requires-Dist: scylla-driver>=3.25.10
21
+ Dynamic: classifier
22
+ Dynamic: license
23
+ Dynamic: requires-dist
21
24
 
22
25
  # scylla-cqlsh
23
26
 
@@ -81,6 +84,16 @@ ccm start
81
84
  pytest
82
85
  ```
83
86
 
87
+ ## Build from source
88
+
89
+ ```bash
90
+ pip install build
91
+ # optionally can disable the usage of cython
92
+ # export CQLSH_NO_CYTHON=true
93
+ python -m build -w
94
+ ...
95
+ Successfully built scylla_cqlsh-6.0.24.dev0+gb09bc79361.d20240910-py3-none-any.whl
96
+ ```
84
97
 
85
98
  ## Creation of the repo
86
99
 
@@ -60,6 +60,16 @@ ccm start
60
60
  pytest
61
61
  ```
62
62
 
63
+ ## Build from source
64
+
65
+ ```bash
66
+ pip install build
67
+ # optionally can disable the usage of cython
68
+ # export CQLSH_NO_CYTHON=true
69
+ python -m build -w
70
+ ...
71
+ Successfully built scylla_cqlsh-6.0.24.dev0+gb09bc79361.d20240910-py3-none-any.whl
72
+ ```
63
73
 
64
74
  ## Creation of the repo
65
75
 
@@ -1,4 +1,4 @@
1
- #!/bin/sh
1
+ #!/bin/bash
2
2
 
3
3
  PRODUCT=scylla
4
4
  VERSION=666.development
@@ -1,4 +1,4 @@
1
- #!/usr/bin/python3
1
+ #!/usr/bin/env python3
2
2
 
3
3
  # Licensed to the Apache Software Foundation (ASF) under one
4
4
  # or more contributor license agreements. See the NOTICE file
@@ -32,6 +32,7 @@ import sys
32
32
  import traceback
33
33
  import warnings
34
34
  import webbrowser
35
+ import logging
35
36
  from contextlib import contextmanager
36
37
  from glob import glob
37
38
  from io import StringIO
@@ -201,6 +202,8 @@ parser.add_option('-k', '--keyspace', help='Authenticate to the given keyspace.'
201
202
  parser.add_option("-f", "--file", help="Execute commands from FILE, then exit")
202
203
  parser.add_option('--debug', action='store_true',
203
204
  help='Show additional debugging information')
205
+ parser.add_option('--driver-debug', action='store_true',
206
+ help='Show additional driver debugging information')
204
207
  parser.add_option('--coverage', action='store_true',
205
208
  help='Collect coverage data')
206
209
  parser.add_option("--encoding", help="Specify a non-default encoding for output."
@@ -488,7 +491,7 @@ class Shell(cmd.Cmd):
488
491
  if os.path.exists(self.hostname) and stat.S_ISSOCK(os.stat(self.hostname).st_mode):
489
492
  kwargs['contact_points'] = (UnixSocketEndPoint(self.hostname),)
490
493
  self.profiles[EXEC_PROFILE_DEFAULT].load_balancing_policy = WhiteListRoundRobinPolicy([UnixSocketEndPoint(self.hostname)])
491
- else:
494
+ else:
492
495
  kwargs['contact_points'] = (self.hostname,)
493
496
  self.profiles[EXEC_PROFILE_DEFAULT].load_balancing_policy = WhiteListRoundRobinPolicy([self.hostname])
494
497
  kwargs['port'] = self.port
@@ -1008,6 +1011,21 @@ class Shell(cmd.Cmd):
1008
1011
  cmdword = tokens[0][1]
1009
1012
  if cmdword == '?':
1010
1013
  cmdword = 'help'
1014
+
1015
+ cmdword_lower = cmdword.lower()
1016
+
1017
+ # Describe statements get special treatment: we first want to
1018
+ # send the request to the server and only when it fails will
1019
+ # we attempt to perform it locally. That's why we don't want
1020
+ # to follow the logic below that starts with parsing.
1021
+ #
1022
+ # The reason for that is changes in Scylla may need to be reflected
1023
+ # in the grammar used in cqlsh. We want Scylla to be "independent"
1024
+ # in that regard, so unless necessary, we don't want to do the parsing
1025
+ # here.
1026
+ if cmdword_lower == 'describe' or cmdword_lower == 'desc':
1027
+ return self.perform_describe(cmdword, tokens, srcstr)
1028
+
1011
1029
  custom_handler = getattr(self, 'do_' + cmdword.lower(), None)
1012
1030
  if custom_handler:
1013
1031
  parsed = cqlruleset.cql_whole_parse_tokens(tokens, srcstr=srcstr,
@@ -1497,8 +1515,8 @@ class Shell(cmd.Cmd):
1497
1515
  self.print_recreate_keyspace(k, sys.stdout)
1498
1516
  print('')
1499
1517
 
1500
- def do_describe(self, parsed):
1501
-
1518
+ # Precondition: the first token in `srcstr.lower()` is either `describe` or `desc`.
1519
+ def perform_describe(self, cmdword, tokens, srcstr):
1502
1520
  """
1503
1521
  DESCRIBE [cqlsh only]
1504
1522
 
@@ -1589,10 +1607,8 @@ class Shell(cmd.Cmd):
1589
1607
  where object can be either a keyspace or a table or an index or a materialized
1590
1608
  view (in this order).
1591
1609
  """
1592
- self._do_describe(parsed, force_client_side_describe=False)
1593
1610
 
1594
- def _do_describe(self, parsed, force_client_side_describe):
1595
- if force_client_side_describe:
1611
+ def perform_describe_locally(parsed):
1596
1612
  what = parsed.matched[1][1].lower()
1597
1613
  if what == 'functions':
1598
1614
  self.describe_functions_client(self.current_keyspace)
@@ -1650,40 +1666,45 @@ class Shell(cmd.Cmd):
1650
1666
  if not name:
1651
1667
  name = self.cql_unprotect_name(parsed.get_binding('mvname', None))
1652
1668
  self.describe_object_client(ks, name)
1653
- else:
1654
- stmt = SimpleStatement(parsed.extract_orig(), consistency_level=cassandra.ConsistencyLevel.LOCAL_ONE,
1655
- fetch_size=self.page_size if self.use_paging else None)
1656
- future = self.session.execute_async(stmt)
1657
- try:
1658
- result = future.result()
1659
-
1660
- what = parsed.matched[1][1].lower()
1661
-
1662
- if what in ('columnfamilies', 'tables', 'types', 'functions', 'aggregates'):
1663
- self.describe_list(result)
1664
- elif what == 'keyspaces':
1665
- self.describe_keyspaces(result)
1666
- elif what == 'cluster':
1667
- self.describe_cluster(result)
1668
- elif what:
1669
- self.describe_element(result)
1670
-
1671
- except cassandra.protocol.SyntaxException:
1672
- # Server doesn't support DESCRIBE query, retry with
1673
- # client-side DESCRIBE implementation
1674
- self._do_describe(parsed, force_client_side_describe=True)
1675
- except CQL_ERRORS as err:
1676
- err_msg = err.message if hasattr(err, 'message') else str(err)
1677
- self.printerr(err_msg.partition("message=")[2].strip('"'))
1678
- except Exception:
1679
- import traceback
1680
- self.printerr(traceback.format_exc())
1681
1669
 
1682
- if future:
1683
- if future.warnings:
1684
- self.print_warnings(future.warnings)
1670
+ stmt = SimpleStatement(srcstr, consistency_level=cassandra.ConsistencyLevel.LOCAL_ONE,
1671
+ fetch_size=self.page_size if self.use_paging else None)
1672
+ future = self.session.execute_async(stmt)
1673
+ try:
1674
+ result = future.result()
1675
+
1676
+ # The second token in the statement indicates which
1677
+ # kind of DESCRIBE we're performing.
1678
+ what = srcstr.split()[1].lower().rstrip(';')
1679
+
1680
+ if what in ('columnfamilies', 'tables', 'types', 'functions', 'aggregates'):
1681
+ self.describe_list(result)
1682
+ elif what == 'keyspaces':
1683
+ self.describe_keyspaces(result)
1684
+ elif what == 'cluster':
1685
+ self.describe_cluster(result)
1686
+ elif what:
1687
+ self.describe_element(result)
1688
+
1689
+ except cassandra.protocol.SyntaxException:
1690
+ # Server doesn't support DESCRIBE query, retry with
1691
+ # client-side DESCRIBE implementation
1692
+ parsed = cqlruleset.cql_whole_parse_tokens(tokens, srcstr=srcstr,
1693
+ startsymbol='cqlshCommand')
1694
+ if parsed and not parsed.remainder:
1695
+ return perform_describe_locally(parsed)
1696
+ else:
1697
+ return self.handle_parse_error(cmdword, tokens, parsed, srcstr)
1698
+ except CQL_ERRORS as err:
1699
+ err_msg = err.message if hasattr(err, 'message') else str(err)
1700
+ self.printerr(err_msg.partition("message=")[2].strip('"'))
1701
+ except Exception:
1702
+ import traceback
1703
+ self.printerr(traceback.format_exc())
1685
1704
 
1686
- do_desc = do_describe
1705
+ if future:
1706
+ if future.warnings:
1707
+ self.print_warnings(future.warnings)
1687
1708
 
1688
1709
  def describe_keyspaces(self, rows):
1689
1710
  """
@@ -2454,7 +2475,7 @@ def read_options(cmdlineargs, environment):
2454
2475
  optvalues.timezone = option_with_default(configs.get, 'ui', 'timezone', None)
2455
2476
 
2456
2477
  optvalues.debug = False
2457
-
2478
+ optvalues.driver_debug = False
2458
2479
  optvalues.coverage = False
2459
2480
  if 'CQLSH_COVERAGE' in environment.keys():
2460
2481
  optvalues.coverage = True
@@ -2520,7 +2541,7 @@ def read_options(cmdlineargs, environment):
2520
2541
  parser.error("Cannot use --cloudconf with hostname or port")
2521
2542
  if options.ssl:
2522
2543
  parser.error("Cannot use --cloudconf with --ssl. Cloud connection encryption parameters are provided by cloud config bundle.")
2523
-
2544
+
2524
2545
 
2525
2546
  hostname = option_with_default(configs.get, 'connection', 'hostname', DEFAULT_HOST)
2526
2547
  port = option_with_default(configs.get, 'connection', 'port', DEFAULT_PORT)
@@ -2607,6 +2628,11 @@ def save_history():
2607
2628
 
2608
2629
 
2609
2630
  def main(options, hostname, port):
2631
+ if options.driver_debug:
2632
+ logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
2633
+ stream=sys.stdout)
2634
+ logging.getLogger("cassandra").setLevel(logging.DEBUG)
2635
+
2610
2636
  setup_cqlruleset(options.cqlmodule)
2611
2637
  setup_cqldocs(options.cqlmodule)
2612
2638
  init_history()
@@ -1,4 +1,4 @@
1
- #!/usr/bin/python3
1
+ #!/usr/bin/env python3
2
2
 
3
3
  # Licensed to the Apache Software Foundation (ASF) under one
4
4
  # or more contributor license agreements. See the NOTICE file
@@ -32,6 +32,7 @@ import sys
32
32
  import traceback
33
33
  import warnings
34
34
  import webbrowser
35
+ import logging
35
36
  from contextlib import contextmanager
36
37
  from glob import glob
37
38
  from io import StringIO
@@ -201,6 +202,8 @@ parser.add_option('-k', '--keyspace', help='Authenticate to the given keyspace.'
201
202
  parser.add_option("-f", "--file", help="Execute commands from FILE, then exit")
202
203
  parser.add_option('--debug', action='store_true',
203
204
  help='Show additional debugging information')
205
+ parser.add_option('--driver-debug', action='store_true',
206
+ help='Show additional driver debugging information')
204
207
  parser.add_option('--coverage', action='store_true',
205
208
  help='Collect coverage data')
206
209
  parser.add_option("--encoding", help="Specify a non-default encoding for output."
@@ -488,7 +491,7 @@ class Shell(cmd.Cmd):
488
491
  if os.path.exists(self.hostname) and stat.S_ISSOCK(os.stat(self.hostname).st_mode):
489
492
  kwargs['contact_points'] = (UnixSocketEndPoint(self.hostname),)
490
493
  self.profiles[EXEC_PROFILE_DEFAULT].load_balancing_policy = WhiteListRoundRobinPolicy([UnixSocketEndPoint(self.hostname)])
491
- else:
494
+ else:
492
495
  kwargs['contact_points'] = (self.hostname,)
493
496
  self.profiles[EXEC_PROFILE_DEFAULT].load_balancing_policy = WhiteListRoundRobinPolicy([self.hostname])
494
497
  kwargs['port'] = self.port
@@ -1008,6 +1011,21 @@ class Shell(cmd.Cmd):
1008
1011
  cmdword = tokens[0][1]
1009
1012
  if cmdword == '?':
1010
1013
  cmdword = 'help'
1014
+
1015
+ cmdword_lower = cmdword.lower()
1016
+
1017
+ # Describe statements get special treatment: we first want to
1018
+ # send the request to the server and only when it fails will
1019
+ # we attempt to perform it locally. That's why we don't want
1020
+ # to follow the logic below that starts with parsing.
1021
+ #
1022
+ # The reason for that is changes in Scylla may need to be reflected
1023
+ # in the grammar used in cqlsh. We want Scylla to be "independent"
1024
+ # in that regard, so unless necessary, we don't want to do the parsing
1025
+ # here.
1026
+ if cmdword_lower == 'describe' or cmdword_lower == 'desc':
1027
+ return self.perform_describe(cmdword, tokens, srcstr)
1028
+
1011
1029
  custom_handler = getattr(self, 'do_' + cmdword.lower(), None)
1012
1030
  if custom_handler:
1013
1031
  parsed = cqlruleset.cql_whole_parse_tokens(tokens, srcstr=srcstr,
@@ -1497,8 +1515,8 @@ class Shell(cmd.Cmd):
1497
1515
  self.print_recreate_keyspace(k, sys.stdout)
1498
1516
  print('')
1499
1517
 
1500
- def do_describe(self, parsed):
1501
-
1518
+ # Precondition: the first token in `srcstr.lower()` is either `describe` or `desc`.
1519
+ def perform_describe(self, cmdword, tokens, srcstr):
1502
1520
  """
1503
1521
  DESCRIBE [cqlsh only]
1504
1522
 
@@ -1589,10 +1607,8 @@ class Shell(cmd.Cmd):
1589
1607
  where object can be either a keyspace or a table or an index or a materialized
1590
1608
  view (in this order).
1591
1609
  """
1592
- self._do_describe(parsed, force_client_side_describe=False)
1593
1610
 
1594
- def _do_describe(self, parsed, force_client_side_describe):
1595
- if force_client_side_describe:
1611
+ def perform_describe_locally(parsed):
1596
1612
  what = parsed.matched[1][1].lower()
1597
1613
  if what == 'functions':
1598
1614
  self.describe_functions_client(self.current_keyspace)
@@ -1650,40 +1666,45 @@ class Shell(cmd.Cmd):
1650
1666
  if not name:
1651
1667
  name = self.cql_unprotect_name(parsed.get_binding('mvname', None))
1652
1668
  self.describe_object_client(ks, name)
1653
- else:
1654
- stmt = SimpleStatement(parsed.extract_orig(), consistency_level=cassandra.ConsistencyLevel.LOCAL_ONE,
1655
- fetch_size=self.page_size if self.use_paging else None)
1656
- future = self.session.execute_async(stmt)
1657
- try:
1658
- result = future.result()
1659
-
1660
- what = parsed.matched[1][1].lower()
1661
-
1662
- if what in ('columnfamilies', 'tables', 'types', 'functions', 'aggregates'):
1663
- self.describe_list(result)
1664
- elif what == 'keyspaces':
1665
- self.describe_keyspaces(result)
1666
- elif what == 'cluster':
1667
- self.describe_cluster(result)
1668
- elif what:
1669
- self.describe_element(result)
1670
-
1671
- except cassandra.protocol.SyntaxException:
1672
- # Server doesn't support DESCRIBE query, retry with
1673
- # client-side DESCRIBE implementation
1674
- self._do_describe(parsed, force_client_side_describe=True)
1675
- except CQL_ERRORS as err:
1676
- err_msg = err.message if hasattr(err, 'message') else str(err)
1677
- self.printerr(err_msg.partition("message=")[2].strip('"'))
1678
- except Exception:
1679
- import traceback
1680
- self.printerr(traceback.format_exc())
1681
1669
 
1682
- if future:
1683
- if future.warnings:
1684
- self.print_warnings(future.warnings)
1670
+ stmt = SimpleStatement(srcstr, consistency_level=cassandra.ConsistencyLevel.LOCAL_ONE,
1671
+ fetch_size=self.page_size if self.use_paging else None)
1672
+ future = self.session.execute_async(stmt)
1673
+ try:
1674
+ result = future.result()
1675
+
1676
+ # The second token in the statement indicates which
1677
+ # kind of DESCRIBE we're performing.
1678
+ what = srcstr.split()[1].lower().rstrip(';')
1679
+
1680
+ if what in ('columnfamilies', 'tables', 'types', 'functions', 'aggregates'):
1681
+ self.describe_list(result)
1682
+ elif what == 'keyspaces':
1683
+ self.describe_keyspaces(result)
1684
+ elif what == 'cluster':
1685
+ self.describe_cluster(result)
1686
+ elif what:
1687
+ self.describe_element(result)
1688
+
1689
+ except cassandra.protocol.SyntaxException:
1690
+ # Server doesn't support DESCRIBE query, retry with
1691
+ # client-side DESCRIBE implementation
1692
+ parsed = cqlruleset.cql_whole_parse_tokens(tokens, srcstr=srcstr,
1693
+ startsymbol='cqlshCommand')
1694
+ if parsed and not parsed.remainder:
1695
+ return perform_describe_locally(parsed)
1696
+ else:
1697
+ return self.handle_parse_error(cmdword, tokens, parsed, srcstr)
1698
+ except CQL_ERRORS as err:
1699
+ err_msg = err.message if hasattr(err, 'message') else str(err)
1700
+ self.printerr(err_msg.partition("message=")[2].strip('"'))
1701
+ except Exception:
1702
+ import traceback
1703
+ self.printerr(traceback.format_exc())
1685
1704
 
1686
- do_desc = do_describe
1705
+ if future:
1706
+ if future.warnings:
1707
+ self.print_warnings(future.warnings)
1687
1708
 
1688
1709
  def describe_keyspaces(self, rows):
1689
1710
  """
@@ -2454,7 +2475,7 @@ def read_options(cmdlineargs, environment):
2454
2475
  optvalues.timezone = option_with_default(configs.get, 'ui', 'timezone', None)
2455
2476
 
2456
2477
  optvalues.debug = False
2457
-
2478
+ optvalues.driver_debug = False
2458
2479
  optvalues.coverage = False
2459
2480
  if 'CQLSH_COVERAGE' in environment.keys():
2460
2481
  optvalues.coverage = True
@@ -2520,7 +2541,7 @@ def read_options(cmdlineargs, environment):
2520
2541
  parser.error("Cannot use --cloudconf with hostname or port")
2521
2542
  if options.ssl:
2522
2543
  parser.error("Cannot use --cloudconf with --ssl. Cloud connection encryption parameters are provided by cloud config bundle.")
2523
-
2544
+
2524
2545
 
2525
2546
  hostname = option_with_default(configs.get, 'connection', 'hostname', DEFAULT_HOST)
2526
2547
  port = option_with_default(configs.get, 'connection', 'port', DEFAULT_PORT)
@@ -2607,6 +2628,11 @@ def save_history():
2607
2628
 
2608
2629
 
2609
2630
  def main(options, hostname, port):
2631
+ if options.driver_debug:
2632
+ logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
2633
+ stream=sys.stdout)
2634
+ logging.getLogger("cassandra").setLevel(logging.DEBUG)
2635
+
2610
2636
  setup_cqlruleset(options.cqlmodule)
2611
2637
  setup_cqldocs(options.cqlmodule)
2612
2638
  init_history()
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '6.0.21'
16
- __version_tuple__ = version_tuple = (6, 0, 21)
15
+ __version__ = version = '6.0.24'
16
+ __version_tuple__ = version_tuple = (6, 0, 24)