kaqing 2.0.48__tar.gz → 2.0.50__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.
Files changed (191) hide show
  1. {kaqing-2.0.48 → kaqing-2.0.50}/PKG-INFO +1 -1
  2. {kaqing-2.0.48 → kaqing-2.0.50}/adam/batch.py +1 -1
  3. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/alter_tables.py +1 -1
  4. kaqing-2.0.50/adam/commands/cql/cql_completions.py +13 -0
  5. kaqing-2.0.50/adam/commands/cql/cql_table_completer.py +16 -0
  6. {kaqing-2.0.48/adam/commands → kaqing-2.0.50/adam/commands/cql}/cqlsh.py +7 -15
  7. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/describe/describe_keyspace.py +1 -1
  8. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/describe/describe_keyspaces.py +1 -1
  9. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/describe/describe_table.py +1 -1
  10. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/describe/describe_tables.py +1 -1
  11. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/ls.py +1 -1
  12. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/medusa/medusa_restore.py +1 -2
  13. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/postgres/postgres.py +6 -2
  14. kaqing-2.0.50/adam/commands/postgres/psql_completions.py +11 -0
  15. kaqing-2.0.50/adam/commands/postgres/psql_table_completer.py +18 -0
  16. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/preview_table.py +5 -6
  17. {kaqing-2.0.48 → kaqing-2.0.50}/adam/repl.py +2 -1
  18. {kaqing-2.0.48 → kaqing-2.0.50}/adam/repl_commands.py +1 -1
  19. kaqing-2.0.50/adam/sql/__init__.py +0 -0
  20. kaqing-2.0.48/adam/commands/postgres/pg_table_completer.py → kaqing-2.0.50/adam/sql/any_completer.py +24 -23
  21. kaqing-2.0.50/adam/sql/sql_completer.py +53 -0
  22. kaqing-2.0.50/adam/sql/sql_utils.py +5 -0
  23. kaqing-2.0.50/adam/sql/table_name_completer.py +17 -0
  24. kaqing-2.0.50/adam/sso/__init__.py +0 -0
  25. kaqing-2.0.50/adam/version.py +5 -0
  26. {kaqing-2.0.48 → kaqing-2.0.50}/kaqing.egg-info/PKG-INFO +1 -1
  27. {kaqing-2.0.48 → kaqing-2.0.50}/kaqing.egg-info/SOURCES.txt +12 -4
  28. {kaqing-2.0.48 → kaqing-2.0.50}/setup.py +1 -1
  29. kaqing-2.0.48/adam/commands/postgres/pg_completions.py +0 -17
  30. kaqing-2.0.48/adam/version.py +0 -5
  31. {kaqing-2.0.48 → kaqing-2.0.50}/README +0 -0
  32. {kaqing-2.0.48 → kaqing-2.0.50}/adam/__init__.py +0 -0
  33. {kaqing-2.0.48 → kaqing-2.0.50}/adam/app_session.py +0 -0
  34. {kaqing-2.0.48 → kaqing-2.0.50}/adam/apps.py +0 -0
  35. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/__init__.py +0 -0
  36. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/check.py +0 -0
  37. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/check_context.py +0 -0
  38. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/check_result.py +0 -0
  39. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/check_utils.py +0 -0
  40. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/compactionstats.py +0 -0
  41. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/cpu.py +0 -0
  42. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/disk.py +0 -0
  43. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/gossip.py +0 -0
  44. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/issue.py +0 -0
  45. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/memory.py +0 -0
  46. {kaqing-2.0.48 → kaqing-2.0.50}/adam/checks/status.py +0 -0
  47. {kaqing-2.0.48 → kaqing-2.0.50}/adam/cli.py +0 -0
  48. {kaqing-2.0.48 → kaqing-2.0.50}/adam/cli_group.py +0 -0
  49. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/__init__.py +0 -0
  50. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/column.py +0 -0
  51. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/columns.py +0 -0
  52. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/compactions.py +0 -0
  53. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/cpu.py +0 -0
  54. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/dir_data.py +0 -0
  55. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/dir_snapshots.py +0 -0
  56. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/gossip.py +0 -0
  57. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/host_id.py +0 -0
  58. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/memory.py +0 -0
  59. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/node_address.py +0 -0
  60. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/node_load.py +0 -0
  61. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/node_owns.py +0 -0
  62. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/node_status.py +0 -0
  63. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/node_tokens.py +0 -0
  64. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/node_utils.py +0 -0
  65. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/pod_name.py +0 -0
  66. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/volume_cassandra.py +0 -0
  67. {kaqing-2.0.48 → kaqing-2.0.50}/adam/columns/volume_root.py +0 -0
  68. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/__init__.py +0 -0
  69. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/app.py +0 -0
  70. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/app_ping.py +0 -0
  71. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/bash.py +0 -0
  72. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/cd.py +0 -0
  73. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/check.py +0 -0
  74. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/cli_commands.py +0 -0
  75. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/command.py +0 -0
  76. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/command_helpers.py +0 -0
  77. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/commands_utils.py +0 -0
  78. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/cp.py +0 -0
  79. {kaqing-2.0.48/adam/commands/deploy → kaqing-2.0.50/adam/commands/cql}/__init__.py +0 -0
  80. {kaqing-2.0.48/adam/commands → kaqing-2.0.50/adam/commands/cql}/cql_utils.py +0 -0
  81. {kaqing-2.0.48/adam/commands/describe → kaqing-2.0.50/adam/commands/deploy}/__init__.py +0 -0
  82. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/code_start.py +0 -0
  83. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/code_stop.py +0 -0
  84. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/code_utils.py +0 -0
  85. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/deploy.py +0 -0
  86. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/deploy_frontend.py +0 -0
  87. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/deploy_pg_agent.py +0 -0
  88. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/deploy_pod.py +0 -0
  89. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/deploy_utils.py +0 -0
  90. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/undeploy.py +0 -0
  91. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/undeploy_frontend.py +0 -0
  92. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/undeploy_pg_agent.py +0 -0
  93. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/deploy/undeploy_pod.py +0 -0
  94. {kaqing-2.0.48/adam/commands/medusa → kaqing-2.0.50/adam/commands/describe}/__init__.py +0 -0
  95. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/describe/describe.py +0 -0
  96. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/devices.py +0 -0
  97. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/exit.py +0 -0
  98. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/help.py +0 -0
  99. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/issues.py +0 -0
  100. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/login.py +0 -0
  101. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/logs.py +0 -0
  102. {kaqing-2.0.48/adam/commands/postgres → kaqing-2.0.50/adam/commands/medusa}/__init__.py +0 -0
  103. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/medusa/medusa.py +0 -0
  104. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/medusa/medusa_backup.py +0 -0
  105. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/medusa/medusa_show_backupjobs.py +0 -0
  106. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/medusa/medusa_show_restorejobs.py +0 -0
  107. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/nodetool.py +0 -0
  108. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/nodetool_commands.py +0 -0
  109. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/param_get.py +0 -0
  110. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/param_set.py +0 -0
  111. {kaqing-2.0.48/adam/commands/reaper → kaqing-2.0.50/adam/commands/postgres}/__init__.py +0 -0
  112. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/postgres/postgres_ls.py +0 -0
  113. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/postgres/postgres_preview.py +0 -0
  114. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/postgres/postgres_session.py +0 -0
  115. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/postgres/postgres_utils.py +0 -0
  116. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/pwd.py +0 -0
  117. {kaqing-2.0.48/adam/commands/repair → kaqing-2.0.50/adam/commands/reaper}/__init__.py +0 -0
  118. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper.py +0 -0
  119. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_forward.py +0 -0
  120. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_forward_stop.py +0 -0
  121. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_restart.py +0 -0
  122. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_run_abort.py +0 -0
  123. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_runs.py +0 -0
  124. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_runs_abort.py +0 -0
  125. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_schedule_activate.py +0 -0
  126. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_schedule_start.py +0 -0
  127. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_schedule_stop.py +0 -0
  128. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_schedules.py +0 -0
  129. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_session.py +0 -0
  130. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/reaper/reaper_status.py +0 -0
  131. {kaqing-2.0.48/adam/commands/show → kaqing-2.0.50/adam/commands/repair}/__init__.py +0 -0
  132. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/repair/repair.py +0 -0
  133. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/repair/repair_log.py +0 -0
  134. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/repair/repair_run.py +0 -0
  135. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/repair/repair_scan.py +0 -0
  136. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/repair/repair_stop.py +0 -0
  137. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/report.py +0 -0
  138. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/restart.py +0 -0
  139. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/rollout.py +0 -0
  140. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/shell.py +0 -0
  141. {kaqing-2.0.48/adam/k8s_utils → kaqing-2.0.50/adam/commands/show}/__init__.py +0 -0
  142. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show.py +0 -0
  143. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_adam.py +0 -0
  144. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_app_actions.py +0 -0
  145. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_app_id.py +0 -0
  146. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_app_queues.py +0 -0
  147. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_cassandra_status.py +0 -0
  148. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_cassandra_version.py +0 -0
  149. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_commands.py +0 -0
  150. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_login.py +0 -0
  151. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_params.py +0 -0
  152. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_processes.py +0 -0
  153. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_repairs.py +0 -0
  154. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/show/show_storage.py +0 -0
  155. {kaqing-2.0.48 → kaqing-2.0.50}/adam/commands/watch.py +0 -0
  156. {kaqing-2.0.48 → kaqing-2.0.50}/adam/config.py +0 -0
  157. {kaqing-2.0.48 → kaqing-2.0.50}/adam/embedded_apps.py +0 -0
  158. {kaqing-2.0.48 → kaqing-2.0.50}/adam/embedded_params.py +0 -0
  159. {kaqing-2.0.48/adam/sso → kaqing-2.0.50/adam/k8s_utils}/__init__.py +0 -0
  160. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/cassandra_clusters.py +0 -0
  161. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/cassandra_nodes.py +0 -0
  162. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/config_maps.py +0 -0
  163. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/custom_resources.py +0 -0
  164. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/deployment.py +0 -0
  165. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/ingresses.py +0 -0
  166. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/jobs.py +0 -0
  167. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/kube_context.py +0 -0
  168. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/pods.py +0 -0
  169. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/secrets.py +0 -0
  170. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/service_accounts.py +0 -0
  171. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/services.py +0 -0
  172. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/statefulsets.py +0 -0
  173. {kaqing-2.0.48 → kaqing-2.0.50}/adam/k8s_utils/volumes.py +0 -0
  174. {kaqing-2.0.48 → kaqing-2.0.50}/adam/log.py +0 -0
  175. {kaqing-2.0.48 → kaqing-2.0.50}/adam/pod_exec_result.py +0 -0
  176. {kaqing-2.0.48 → kaqing-2.0.50}/adam/repl_session.py +0 -0
  177. {kaqing-2.0.48 → kaqing-2.0.50}/adam/repl_state.py +0 -0
  178. {kaqing-2.0.48 → kaqing-2.0.50}/adam/sso/authenticator.py +0 -0
  179. {kaqing-2.0.48 → kaqing-2.0.50}/adam/sso/authn_ad.py +0 -0
  180. {kaqing-2.0.48 → kaqing-2.0.50}/adam/sso/authn_okta.py +0 -0
  181. {kaqing-2.0.48 → kaqing-2.0.50}/adam/sso/cred_cache.py +0 -0
  182. {kaqing-2.0.48 → kaqing-2.0.50}/adam/sso/id_token.py +0 -0
  183. {kaqing-2.0.48 → kaqing-2.0.50}/adam/sso/idp.py +0 -0
  184. {kaqing-2.0.48 → kaqing-2.0.50}/adam/sso/idp_login.py +0 -0
  185. {kaqing-2.0.48 → kaqing-2.0.50}/adam/sso/idp_session.py +0 -0
  186. {kaqing-2.0.48 → kaqing-2.0.50}/adam/sso/sso_config.py +0 -0
  187. {kaqing-2.0.48 → kaqing-2.0.50}/adam/utils.py +0 -0
  188. {kaqing-2.0.48 → kaqing-2.0.50}/kaqing.egg-info/dependency_links.txt +0 -0
  189. {kaqing-2.0.48 → kaqing-2.0.50}/kaqing.egg-info/entry_points.txt +0 -0
  190. {kaqing-2.0.48 → kaqing-2.0.50}/kaqing.egg-info/top_level.txt +0 -0
  191. {kaqing-2.0.48 → kaqing-2.0.50}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.48
3
+ Version: 2.0.50
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -5,7 +5,7 @@ from adam.commands.check import Check, CheckCommandHelper
5
5
  from adam.commands.cp import ClipboardCopy, CopyCommandHelper
6
6
  from adam.commands.command import Command
7
7
  from adam.commands.command_helpers import ClusterCommandHelper, ClusterOrPodCommandHelper, PodCommandHelper
8
- from adam.commands.cqlsh import CqlCommandHelper, Cqlsh
8
+ from adam.commands.cql.cqlsh import CqlCommandHelper, Cqlsh
9
9
  from adam.commands.deploy.deploy import Deploy, DeployCommandHelper
10
10
  from adam.commands.deploy.undeploy import Undeploy, UndeployCommandHelper
11
11
  from adam.commands.describe.describe import Describe, DescribeCommandHelper
@@ -1,5 +1,5 @@
1
1
  from adam.commands.command import Command
2
- from adam.commands.cql_utils import tables as get_tables, run_cql
2
+ from adam.commands.cql.cql_utils import tables as get_tables, run_cql
3
3
  from adam.config import Config
4
4
  from adam.pod_exec_result import PodExecResult
5
5
  from adam.repl_state import ReplState, RequiredState
@@ -0,0 +1,13 @@
1
+ from adam.commands.cql.cql_table_completer import CqlTableNameCompleter
2
+ from adam.commands.cql.cql_utils import table_names
3
+ from adam.repl_state import ReplState
4
+ from adam.sql.sql_completer import SqlCompleter
5
+
6
+ def cql_completions(state: ReplState) -> dict[str, any]:
7
+ table_name_completer = CqlTableNameCompleter(table_names(state))
8
+ return {
9
+ 'describe': {
10
+ 'keyspaces': None,
11
+ 'table': table_name_completer,
12
+ 'tables': None},
13
+ } | SqlCompleter.completions(table_name_completer)
@@ -0,0 +1,16 @@
1
+ from adam.sql.table_name_completer import NestedDict, TableNameCompleter
2
+
3
+ class CqlTableNameCompleter(TableNameCompleter):
4
+ def __init__(self, tables: list[str], nested_dict: NestedDict = {}, ignore_case: bool = True):
5
+ self._tables = tables
6
+ self.ignore_case = ignore_case
7
+ self.append_nested_dict(nested_dict)
8
+
9
+ def __repr__(self) -> str:
10
+ return "CqlTableCompleter(%r)" % (len(self._tables))
11
+
12
+ def nested(self, data: NestedDict) -> 'TableNameCompleter':
13
+ return CqlTableNameCompleter(self._tables).append_nested_dict(data)
14
+
15
+ def tables(self) -> list[str]:
16
+ return self._tables
@@ -2,7 +2,8 @@ import click
2
2
 
3
3
  from adam.commands.command import Command
4
4
  from adam.commands.command_helpers import ClusterOrPodCommandHelper
5
- from adam.commands.cql_utils import run_cql, table_names, tables
5
+ from adam.commands.cql.cql_completions import cql_completions
6
+ from .cql_utils import run_cql, table_names
6
7
  from adam.repl_state import ReplState, RequiredState
7
8
  from adam.utils import log, log2
8
9
 
@@ -53,21 +54,12 @@ class Cqlsh(Command):
53
54
  return run_cql(state, cql, opts, show_out=True)
54
55
 
55
56
  def completion(self, state: ReplState) -> dict[str, any]:
57
+ if state.device != state.C:
58
+ # conflicts with psql completions
59
+ return {}
60
+
56
61
  if state.sts or state.pod:
57
- ts = table_names(state)
58
- return {Cqlsh.COMMAND: None} | {
59
- 'delete': {'from': {t: {'where': {'id': {'=': None}}} for t in ts}},
60
- 'insert': {'into': {t: {'values': None} for t in ts}},
61
- 'select': {'*': {'from': {t: {
62
- 'limit': {'1': None},
63
- 'where': {'id': {'=': None}}
64
- } for t in ts}}},
65
- 'update': {t: {'set': None} for t in ts},
66
- 'describe': {
67
- 'keyspaces': None,
68
- 'table': {t: None for t in ts},
69
- 'tables': None},
70
- }
62
+ return {Cqlsh.COMMAND: None} | cql_completions(state)
71
63
 
72
64
  return {}
73
65
 
@@ -1,5 +1,5 @@
1
1
  from adam.commands.command import Command
2
- from adam.commands.cql_utils import keyspaces, run_cql
2
+ from adam.commands.cql.cql_utils import keyspaces, run_cql
3
3
  from adam.pod_exec_result import PodExecResult
4
4
  from adam.repl_state import ReplState, RequiredState
5
5
  from adam.utils import log2
@@ -1,5 +1,5 @@
1
1
  from adam.commands.command import Command
2
- from adam.commands.cql_utils import run_cql
2
+ from adam.commands.cql.cql_utils import run_cql
3
3
  from adam.pod_exec_result import PodExecResult
4
4
  from adam.repl_state import ReplState, RequiredState
5
5
  from adam.utils import log2
@@ -1,5 +1,5 @@
1
1
  from adam.commands.command import Command
2
- from adam.commands.cql_utils import run_cql, table_names
2
+ from adam.commands.cql.cql_utils import run_cql, table_names
3
3
  from adam.pod_exec_result import PodExecResult
4
4
  from adam.repl_state import ReplState, RequiredState
5
5
  from adam.utils import log2
@@ -1,5 +1,5 @@
1
1
  from adam.commands.command import Command
2
- from adam.commands.cql_utils import run_cql
2
+ from adam.commands.cql.cql_utils import run_cql
3
3
  from adam.pod_exec_result import PodExecResult
4
4
  from adam.repl_state import ReplState, RequiredState
5
5
  from adam.utils import log2
@@ -2,7 +2,7 @@ import copy
2
2
 
3
3
  from adam.commands.command import Command
4
4
  from adam.commands.commands_utils import show_pods, show_rollout
5
- from adam.commands.cqlsh import Cqlsh
5
+ from adam.commands.cql.cqlsh import Cqlsh
6
6
  from adam.commands.postgres.postgres_utils import pg_database_names, pg_table_names
7
7
  from adam.commands.postgres.postgres_session import PostgresSession
8
8
  from adam.config import Config
@@ -59,8 +59,7 @@ class MedusaRestore(Command):
59
59
  now_dtformat = datetime.now().strftime("%Y-%m-%d.%H.%M.%S")
60
60
  rtname = 'medusa-' + now_dtformat + '-restore-from-' + bkname
61
61
  try:
62
- print('SEAN doing')
63
- # CustomResources.create_medusa_restorejob(rtname, bkname, dc, ns)
62
+ CustomResources.create_medusa_restorejob(rtname, bkname, dc, ns)
64
63
  except Exception as e:
65
64
  log2("Exception: MedusaRestore failed: %s\n" % e)
66
65
 
@@ -1,7 +1,7 @@
1
1
  import click
2
2
 
3
3
  from adam.commands.command import Command
4
- from adam.commands.postgres.pg_completions import pg_completions
4
+ from adam.commands.postgres.psql_completions import psql_completions
5
5
  from adam.commands.postgres.postgres_utils import pg_table_names
6
6
  from .postgres_ls import PostgresLs
7
7
  from .postgres_preview import PostgresPreview
@@ -65,11 +65,15 @@ class Postgres(Command):
65
65
  PostgresSession(state.namespace, state.pg_path).run_sql(' '.join(args))
66
66
 
67
67
  def completion(self, state: ReplState):
68
+ if state.device != state.P:
69
+ # conflicts with cql completions
70
+ return {}
71
+
68
72
  leaf = {}
69
73
  session = PostgresSession(state.namespace, state.pg_path)
70
74
  if session.db:
71
75
  if pg_table_names(state.namespace, state.pg_path):
72
- leaf = pg_completions(state.namespace, state.pg_path)
76
+ leaf = psql_completions(state.namespace, state.pg_path)
73
77
  elif state.pg_path:
74
78
  leaf = {
75
79
  '\h': None,
@@ -0,0 +1,11 @@
1
+ from adam.commands.postgres.psql_table_completer import PsqlTableNameCompleter
2
+ from adam.sql.sql_completer import SqlCompleter
3
+
4
+ def psql_completions(ns: str, pg_path: str):
5
+ return {
6
+ '\h': None,
7
+ '\d': None,
8
+ '\dt': None,
9
+ '\du': None
10
+ } | SqlCompleter.completions(PsqlTableNameCompleter(ns, pg_path))
11
+ # } | PsqlTableCompleter(ns, pg_path).completions()
@@ -0,0 +1,18 @@
1
+ from adam.commands.postgres.postgres_utils import pg_table_names
2
+ from adam.sql.table_name_completer import NestedDict, TableNameCompleter
3
+
4
+ class PsqlTableNameCompleter(TableNameCompleter):
5
+ def __init__(self, namespace: str, pg_path: str, nested_dict: NestedDict = {}, ignore_case: bool = True):
6
+ self.namespace = namespace
7
+ self.pg_path = pg_path
8
+ self.ignore_case = ignore_case
9
+ self.append_nested_dict(nested_dict)
10
+
11
+ def __repr__(self) -> str:
12
+ return "PsqlTableCompleter(%r, pg_path=%r)" % (self.namespace, self.pg_path)
13
+
14
+ def nested(self, data: NestedDict) -> 'TableNameCompleter':
15
+ return PsqlTableNameCompleter(self.namespace, self.pg_path).append_nested_dict(data)
16
+
17
+ def tables(self) -> list[str]:
18
+ return pg_table_names(self.namespace, self.pg_path)
@@ -1,8 +1,9 @@
1
1
  import functools
2
2
 
3
3
  from adam.commands.command import Command
4
- from adam.commands.cql_utils import run_cql, tables
5
- from adam.commands.postgres.pg_table_completer import PgTableCompleter
4
+ from adam.commands.cql.cql_table_completer import CqlTableNameCompleter
5
+ from adam.commands.cql.cql_utils import run_cql, table_names, tables
6
+ from adam.commands.postgres.psql_table_completer import PsqlTableNameCompleter
6
7
  from adam.commands.postgres.postgres_session import PostgresSession
7
8
  from adam.config import Config
8
9
  from adam.repl_state import ReplState, RequiredState
@@ -72,11 +73,9 @@ class PreviewTable(Command):
72
73
 
73
74
  def completion(self, state: ReplState):
74
75
  if state.device == ReplState.P:
75
- # return {PreviewTable.COMMAND: {f'<pg_tables:{state.namespace}:{state.pg_path}>': None}}
76
- return {PreviewTable.COMMAND: PgTableCompleter(state.namespace, state.pg_path)}
76
+ return {PreviewTable.COMMAND: PsqlTableNameCompleter(state.namespace, state.pg_path)}
77
77
  elif state.sts:
78
- tables = PreviewTable.cql_tables(state)
79
- return {PreviewTable.COMMAND: {f'{k}.{t}': None for k, ts in tables.items() for t in ts}}
78
+ return {PreviewTable.COMMAND: CqlTableNameCompleter(table_names(state))}
80
79
 
81
80
  return {}
82
81
 
@@ -18,6 +18,7 @@ from adam.log import Log
18
18
  from adam.repl_commands import ReplCommands
19
19
  from adam.repl_session import ReplSession
20
20
  from adam.repl_state import ReplState
21
+ from adam.sql.sql_completer import SqlCompleter
21
22
  from adam.utils import deep_merge_dicts, deep_sort_dict, lines_to_tabular, log2
22
23
  from adam.apps import Apps
23
24
  from . import __version__
@@ -108,7 +109,7 @@ def enter_repl(state: ReplState):
108
109
  log2(f'Timing auto-completion-calc {cmd.command()}: {time.time() - s1:.2f}')
109
110
 
110
111
  # print(json.dumps(completions, indent=4))
111
- completer = NestedCompleter.from_nested_dict(completions)
112
+ completer = SqlCompleter.from_nested_dict(completions)
112
113
 
113
114
  cmd = session.prompt(prompt_msg(), completer=completer, key_bindings=kb)
114
115
  s0 = time.time()
@@ -23,7 +23,7 @@ from adam.commands.bash import Bash
23
23
  from adam.commands.cd import Cd
24
24
  from adam.commands.check import Check
25
25
  from adam.commands.command import Command
26
- from adam.commands.cqlsh import Cqlsh
26
+ from adam.commands.cql.cqlsh import Cqlsh
27
27
  from adam.commands.devices import DeviceApp, DeviceCass, DevicePostgres
28
28
  from adam.commands.exit import Exit
29
29
  from adam.commands.medusa.medusa import Medusa
File without changes
@@ -2,24 +2,17 @@ from typing import Any, Dict, Iterable, Mapping, Optional, Set, Union
2
2
  from prompt_toolkit.completion import CompleteEvent, Completer, Completion, NestedCompleter, WordCompleter
3
3
  from prompt_toolkit.document import Document
4
4
 
5
- from adam.commands.postgres.postgres_utils import pg_table_names
5
+ from adam.sql.sql_utils import safe_terms
6
6
 
7
7
  NestedDict = Mapping[str, Union[Any, Set[str], None, Completer]]
8
8
 
9
- class PgTableCompleter(Completer):
10
- def __init__(self, namespace: str, pg_path: str, nested_dict: NestedDict = {}, ignore_case: bool = True):
11
- self.namespace = namespace
12
- self.pg_path = pg_path
9
+ class AnyCompleter(Completer):
10
+ def __init__(self, default: str = None, nested_dict: NestedDict = {}, ignore_case: bool = True):
11
+ self.default = default
13
12
  self.ignore_case = ignore_case
14
13
  self.append_nested_dict(nested_dict)
15
14
 
16
- def __repr__(self) -> str:
17
- return "PgTableCompleter(%r, pg_path=%r)" % (self.namespace, self.pg_path)
18
-
19
- def nested(self, data: NestedDict):
20
- return PgTableCompleter(self.namespace, self.pg_path).append_nested_dict(data)
21
-
22
- def append_nested_dict(self, data: NestedDict) -> "PgTableCompleter":
15
+ def append_nested_dict(self, data: NestedDict) -> "AnyCompleter":
23
16
  options: Dict[str, Optional[Completer]] = {}
24
17
  for key, value in data.items():
25
18
  if isinstance(value, Completer):
@@ -42,18 +35,18 @@ class PgTableCompleter(Completer):
42
35
  text = document.text_before_cursor.lstrip()
43
36
  stripped_len = len(document.text_before_cursor) - len(text)
44
37
 
45
- if " " in text:
38
+ terms, has_space = safe_terms(text)
39
+ if has_space:
46
40
  second_term = None
47
- tokens = text.split()
48
- if len(tokens) > 1:
49
- second_term = tokens[1]
41
+ if len(terms) > 1:
42
+ second_term = terms[1]
50
43
 
51
44
  yielded = False
52
45
  if second_term:
53
46
  completer = self.options.get(second_term)
54
47
 
55
48
  if completer is not None:
56
- first_term = tokens[0]
49
+ first_term = terms[0]
57
50
  remaining_text = text[len(first_term) :].lstrip()
58
51
  move_cursor = len(text) - len(remaining_text) + stripped_len
59
52
 
@@ -75,9 +68,17 @@ class PgTableCompleter(Completer):
75
68
  )
76
69
  for c in completer.get_completions(document, complete_event):
77
70
  yield c
78
- else:
79
- completer = WordCompleter(
80
- list(pg_table_names(self.namespace, self.pg_path)), ignore_case=self.ignore_case
81
- )
82
- for c in completer.get_completions(document, complete_event):
83
- yield c
71
+ elif words := self.words():
72
+ for c in words.get_completions(document, complete_event):
73
+ yield c
74
+
75
+ def words(self):
76
+ if not self.default:
77
+ return None
78
+
79
+ return WordCompleter(
80
+ [self.default], ignore_case=self.ignore_case
81
+ )
82
+
83
+ def nested(self, data: NestedDict) -> 'AnyCompleter':
84
+ return AnyCompleter(self.default).append_nested_dict(data)
@@ -0,0 +1,53 @@
1
+ from typing import Dict, Iterable, Optional
2
+ from prompt_toolkit.completion import CompleteEvent, Completer, Completion, NestedCompleter, WordCompleter
3
+ from prompt_toolkit.document import Document
4
+
5
+ from adam.sql.any_completer import AnyCompleter as any
6
+ from adam.sql.sql_utils import safe_terms
7
+ from adam.sql.table_name_completer import TableNameCompleter
8
+
9
+ class SqlCompleter(NestedCompleter):
10
+ def __init__(
11
+ self, options: Dict[str, Optional[Completer]], ignore_case: bool = True
12
+ ) -> None:
13
+ super().__init__(options, ignore_case)
14
+
15
+ def get_completions(
16
+ self, document: Document, complete_event: CompleteEvent
17
+ ) -> Iterable[Completion]:
18
+ text = document.text_before_cursor.lstrip()
19
+ stripped_len = len(document.text_before_cursor) - len(text)
20
+
21
+ terms, has_space = safe_terms(text)
22
+ if has_space:
23
+ first_term = terms[0]
24
+ completer = self.options.get(first_term)
25
+
26
+ if completer is not None:
27
+ remaining_text = text[len(first_term) :].lstrip()
28
+ move_cursor = len(text) - len(remaining_text) + stripped_len
29
+
30
+ new_document = Document(
31
+ remaining_text,
32
+ cursor_position=document.cursor_position - move_cursor,
33
+ )
34
+
35
+ for c in completer.get_completions(new_document, complete_event):
36
+ yield c
37
+ else:
38
+ completer = WordCompleter(
39
+ list(self.options.keys()), ignore_case=self.ignore_case
40
+ )
41
+ for c in completer.get_completions(document, complete_event):
42
+ yield c
43
+
44
+ def completions(table: TableNameCompleter):
45
+ return {
46
+ 'delete': {'from': table.nested({'where': any('id').nested({'=': any("'id'")})})},
47
+ 'insert': {'into': table.nested({'values(': None})},
48
+ 'select': any('*').nested({'from': table.nested({
49
+ 'limit': any('1'),
50
+ 'where': any('id').nested({'=': any("'id'").nested({'limit': any('1')})})
51
+ })}),
52
+ 'update': table.nested({'set': {'column': {'=': None}}}),
53
+ }
@@ -0,0 +1,5 @@
1
+ import re
2
+
3
+ def safe_terms(text: str):
4
+ tokens = re.findall(r'"[^"]+"|\b\w+\b|\S', text)
5
+ return tokens, len(tokens) > 1 or text.startswith(' ') or text.endswith(' ')
@@ -0,0 +1,17 @@
1
+ from abc import abstractmethod
2
+ from prompt_toolkit.completion import WordCompleter
3
+
4
+ from .any_completer import AnyCompleter, NestedDict
5
+
6
+ class TableNameCompleter(AnyCompleter):
7
+ def __init__(self, nested_dict: NestedDict = {}, ignore_case: bool = True):
8
+ super().__init__(nested_dict=nested_dict, ignore_case=ignore_case)
9
+
10
+ def words(self):
11
+ return WordCompleter(
12
+ self.tables(), ignore_case=self.ignore_case
13
+ )
14
+
15
+ @abstractmethod
16
+ def tables(self) -> list[str]:
17
+ pass
File without changes
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ __version__ = "2.0.50" #: the working version
5
+ __release__ = "1.0.0" #: the release version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.48
3
+ Version: 2.0.50
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -60,8 +60,6 @@ adam/commands/command.py
60
60
  adam/commands/command_helpers.py
61
61
  adam/commands/commands_utils.py
62
62
  adam/commands/cp.py
63
- adam/commands/cql_utils.py
64
- adam/commands/cqlsh.py
65
63
  adam/commands/devices.py
66
64
  adam/commands/exit.py
67
65
  adam/commands/help.py
@@ -80,6 +78,11 @@ adam/commands/restart.py
80
78
  adam/commands/rollout.py
81
79
  adam/commands/shell.py
82
80
  adam/commands/watch.py
81
+ adam/commands/cql/__init__.py
82
+ adam/commands/cql/cql_completions.py
83
+ adam/commands/cql/cql_table_completer.py
84
+ adam/commands/cql/cql_utils.py
85
+ adam/commands/cql/cqlsh.py
83
86
  adam/commands/deploy/__init__.py
84
87
  adam/commands/deploy/code_start.py
85
88
  adam/commands/deploy/code_stop.py
@@ -106,13 +109,13 @@ adam/commands/medusa/medusa_restore.py
106
109
  adam/commands/medusa/medusa_show_backupjobs.py
107
110
  adam/commands/medusa/medusa_show_restorejobs.py
108
111
  adam/commands/postgres/__init__.py
109
- adam/commands/postgres/pg_completions.py
110
- adam/commands/postgres/pg_table_completer.py
111
112
  adam/commands/postgres/postgres.py
112
113
  adam/commands/postgres/postgres_ls.py
113
114
  adam/commands/postgres/postgres_preview.py
114
115
  adam/commands/postgres/postgres_session.py
115
116
  adam/commands/postgres/postgres_utils.py
117
+ adam/commands/postgres/psql_completions.py
118
+ adam/commands/postgres/psql_table_completer.py
116
119
  adam/commands/reaper/__init__.py
117
120
  adam/commands/reaper/reaper.py
118
121
  adam/commands/reaper/reaper_forward.py
@@ -162,6 +165,11 @@ adam/k8s_utils/service_accounts.py
162
165
  adam/k8s_utils/services.py
163
166
  adam/k8s_utils/statefulsets.py
164
167
  adam/k8s_utils/volumes.py
168
+ adam/sql/__init__.py
169
+ adam/sql/any_completer.py
170
+ adam/sql/sql_completer.py
171
+ adam/sql/sql_utils.py
172
+ adam/sql/table_name_completer.py
165
173
  adam/sso/__init__.py
166
174
  adam/sso/authenticator.py
167
175
  adam/sso/authn_ad.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='kaqing',
5
- version='2.0.48',
5
+ version='2.0.50',
6
6
  packages=find_packages(),
7
7
  entry_points={
8
8
  'console_scripts': [
@@ -1,17 +0,0 @@
1
- from adam.commands.postgres.pg_table_completer import PgTableCompleter
2
-
3
- def pg_completions(ns: str, pg_path: str):
4
- table = PgTableCompleter(ns, pg_path)
5
- return {
6
- '\h': None,
7
- '\d': None,
8
- '\dt': None,
9
- '\du': None,
10
- 'delete': {'from': table.nested({'where': {'id': {'=': {"'id'": None}}}})},
11
- 'insert': {'into': table.nested({'values(': None})},
12
- 'select': {'*': {'from': table.nested({
13
- 'limit': {'1': {'where': {'id': {'=': {"'id'": None}}}}},
14
- 'where': {'id': {'=': {"'id'": {'limit': {'1': None}}}}}
15
- })}},
16
- 'update': table.nested({'set': {'column': {'=': None}}}),
17
- }
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
-
4
- __version__ = "2.0.48" #: the working version
5
- __release__ = "1.0.0" #: the release version
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes