kaqing 2.0.14__py3-none-any.whl → 2.0.189__py3-none-any.whl
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 kaqing might be problematic. Click here for more details.
- adam/__init__.py +0 -2
- adam/app_session.py +9 -12
- adam/apps.py +20 -6
- adam/batch.py +16 -6
- adam/checks/check_utils.py +19 -49
- adam/checks/compactionstats.py +1 -1
- adam/checks/cpu.py +9 -3
- adam/checks/cpu_metrics.py +52 -0
- adam/checks/disk.py +3 -4
- adam/checks/gossip.py +1 -1
- adam/checks/memory.py +3 -3
- adam/checks/status.py +1 -1
- adam/columns/columns.py +3 -1
- adam/columns/cpu.py +3 -1
- adam/columns/cpu_metrics.py +22 -0
- adam/columns/memory.py +3 -4
- adam/commands/__init__.py +24 -0
- adam/commands/alter_tables.py +66 -0
- adam/commands/app/app.py +38 -0
- adam/commands/{app_ping.py → app/app_ping.py} +8 -14
- adam/commands/app/show_app_actions.py +49 -0
- adam/commands/{show → app}/show_app_id.py +9 -12
- adam/commands/{show → app}/show_app_queues.py +8 -14
- adam/commands/app/utils_app.py +106 -0
- adam/commands/audit/__init__.py +0 -0
- adam/commands/audit/audit.py +67 -0
- adam/commands/audit/audit_repair_tables.py +72 -0
- adam/commands/audit/audit_run.py +50 -0
- adam/commands/audit/completions_l.py +15 -0
- adam/commands/audit/show_last10.py +36 -0
- adam/commands/audit/show_slow10.py +36 -0
- adam/commands/audit/show_top10.py +36 -0
- adam/commands/audit/utils_show_top10.py +71 -0
- adam/commands/bash/__init__.py +5 -0
- adam/commands/bash/bash.py +36 -0
- adam/commands/bash/bash_completer.py +93 -0
- adam/commands/bash/utils_bash.py +16 -0
- adam/commands/cat.py +36 -0
- adam/commands/cd.py +14 -88
- adam/commands/check.py +18 -21
- adam/commands/cli_commands.py +11 -7
- adam/commands/clipboard_copy.py +87 -0
- adam/commands/code.py +57 -0
- adam/commands/command.py +220 -19
- adam/commands/commands_utils.py +28 -31
- adam/commands/cql/__init__.py +0 -0
- adam/commands/cql/completions_c.py +28 -0
- adam/commands/{cqlsh.py → cql/cqlsh.py} +13 -32
- adam/commands/cql/utils_cql.py +305 -0
- adam/commands/deploy/code_start.py +7 -10
- adam/commands/deploy/code_stop.py +4 -21
- adam/commands/deploy/code_utils.py +5 -5
- adam/commands/deploy/deploy.py +4 -40
- adam/commands/deploy/deploy_frontend.py +15 -18
- adam/commands/deploy/deploy_pg_agent.py +4 -7
- adam/commands/deploy/deploy_pod.py +74 -77
- adam/commands/deploy/deploy_utils.py +16 -26
- adam/commands/deploy/undeploy.py +4 -40
- adam/commands/deploy/undeploy_frontend.py +5 -8
- adam/commands/deploy/undeploy_pg_agent.py +7 -8
- adam/commands/deploy/undeploy_pod.py +16 -17
- adam/commands/devices/__init__.py +0 -0
- adam/commands/devices/device.py +149 -0
- adam/commands/devices/device_app.py +163 -0
- adam/commands/devices/device_auit_log.py +49 -0
- adam/commands/devices/device_cass.py +179 -0
- adam/commands/devices/device_export.py +87 -0
- adam/commands/devices/device_postgres.py +160 -0
- adam/commands/devices/devices.py +25 -0
- adam/commands/download_file.py +47 -0
- adam/commands/exit.py +1 -4
- adam/commands/export/__init__.py +0 -0
- adam/commands/export/clean_up_all_export_sessions.py +37 -0
- adam/commands/export/clean_up_export_sessions.py +39 -0
- adam/commands/export/completions_x.py +11 -0
- adam/commands/export/download_export_session.py +40 -0
- adam/commands/export/drop_export_database.py +39 -0
- adam/commands/export/drop_export_databases.py +37 -0
- adam/commands/export/export.py +37 -0
- adam/commands/export/export_databases.py +246 -0
- adam/commands/export/export_select.py +34 -0
- adam/commands/export/export_sessions.py +209 -0
- adam/commands/export/export_use.py +49 -0
- adam/commands/export/export_x_select.py +48 -0
- adam/commands/export/exporter.py +332 -0
- adam/commands/export/import_files.py +44 -0
- adam/commands/export/import_session.py +44 -0
- adam/commands/export/importer.py +81 -0
- adam/commands/export/importer_athena.py +148 -0
- adam/commands/export/importer_sqlite.py +67 -0
- adam/commands/export/show_column_counts.py +45 -0
- adam/commands/export/show_export_databases.py +39 -0
- adam/commands/export/show_export_session.py +39 -0
- adam/commands/export/show_export_sessions.py +37 -0
- adam/commands/export/utils_export.py +344 -0
- adam/commands/find_files.py +51 -0
- adam/commands/find_processes.py +76 -0
- adam/commands/head.py +36 -0
- adam/commands/help.py +14 -9
- adam/commands/intermediate_command.py +52 -0
- adam/commands/issues.py +14 -40
- adam/commands/kubectl.py +38 -0
- adam/commands/login.py +26 -25
- adam/commands/logs.py +5 -7
- adam/commands/ls.py +11 -115
- adam/commands/medusa/medusa.py +4 -46
- adam/commands/medusa/medusa_backup.py +22 -29
- adam/commands/medusa/medusa_restore.py +51 -49
- adam/commands/medusa/medusa_show_backupjobs.py +20 -21
- adam/commands/medusa/medusa_show_restorejobs.py +16 -21
- adam/commands/medusa/utils_medusa.py +15 -0
- adam/commands/nodetool.py +8 -17
- adam/commands/param_get.py +11 -14
- adam/commands/param_set.py +9 -13
- adam/commands/postgres/completions_p.py +22 -0
- adam/commands/postgres/postgres.py +49 -73
- adam/commands/postgres/postgres_databases.py +270 -0
- adam/commands/postgres/postgres_ls.py +4 -8
- adam/commands/postgres/postgres_preview.py +5 -9
- adam/commands/postgres/utils_postgres.py +79 -0
- adam/commands/preview_table.py +10 -69
- adam/commands/pwd.py +14 -43
- adam/commands/reaper/reaper.py +6 -49
- adam/commands/reaper/reaper_forward.py +49 -56
- adam/commands/reaper/reaper_forward_session.py +6 -0
- adam/commands/reaper/reaper_forward_stop.py +10 -16
- adam/commands/reaper/reaper_restart.py +8 -15
- adam/commands/reaper/reaper_run_abort.py +8 -33
- adam/commands/reaper/reaper_runs.py +43 -58
- adam/commands/reaper/reaper_runs_abort.py +29 -49
- adam/commands/reaper/reaper_schedule_activate.py +14 -33
- adam/commands/reaper/reaper_schedule_start.py +9 -33
- adam/commands/reaper/reaper_schedule_stop.py +9 -33
- adam/commands/reaper/reaper_schedules.py +4 -14
- adam/commands/reaper/reaper_status.py +8 -16
- adam/commands/reaper/utils_reaper.py +203 -0
- adam/commands/repair/repair.py +4 -46
- adam/commands/repair/repair_log.py +6 -12
- adam/commands/repair/repair_run.py +29 -36
- adam/commands/repair/repair_scan.py +33 -41
- adam/commands/repair/repair_stop.py +6 -13
- adam/commands/report.py +25 -21
- adam/commands/restart.py +27 -28
- adam/commands/rollout.py +20 -25
- adam/commands/shell.py +12 -4
- adam/commands/show/show.py +15 -46
- adam/commands/show/show_adam.py +3 -3
- adam/commands/show/show_cassandra_repairs.py +37 -0
- adam/commands/show/show_cassandra_status.py +48 -52
- adam/commands/show/show_cassandra_version.py +5 -18
- adam/commands/show/show_cli_commands.py +56 -0
- adam/commands/show/show_host.py +33 -0
- adam/commands/show/show_login.py +23 -27
- adam/commands/show/show_params.py +2 -5
- adam/commands/show/show_processes.py +18 -21
- adam/commands/show/show_storage.py +11 -20
- adam/commands/watch.py +27 -30
- adam/config.py +8 -6
- adam/embedded_params.py +1 -1
- adam/log.py +4 -4
- adam/pod_exec_result.py +13 -5
- adam/repl.py +136 -120
- adam/repl_commands.py +66 -24
- adam/repl_session.py +8 -1
- adam/repl_state.py +343 -73
- adam/sql/__init__.py +0 -0
- adam/sql/lark_completer.py +284 -0
- adam/sql/lark_parser.py +604 -0
- adam/sql/sql_completer.py +118 -0
- adam/sql/sql_state_machine.py +630 -0
- adam/sql/term_completer.py +76 -0
- adam/sso/authn_ad.py +7 -9
- adam/sso/authn_okta.py +4 -6
- adam/sso/cred_cache.py +4 -6
- adam/sso/idp.py +10 -13
- adam/utils.py +539 -11
- adam/utils_athena.py +145 -0
- adam/utils_audits.py +102 -0
- adam/utils_issues.py +32 -0
- adam/utils_k8s/__init__.py +0 -0
- adam/utils_k8s/app_clusters.py +28 -0
- adam/utils_k8s/app_pods.py +36 -0
- adam/utils_k8s/cassandra_clusters.py +44 -0
- adam/{k8s_utils → utils_k8s}/cassandra_nodes.py +12 -5
- adam/{k8s_utils → utils_k8s}/custom_resources.py +16 -17
- adam/{k8s_utils → utils_k8s}/deployment.py +2 -2
- adam/{k8s_utils → utils_k8s}/ingresses.py +2 -2
- adam/{k8s_utils → utils_k8s}/jobs.py +7 -11
- adam/utils_k8s/k8s.py +96 -0
- adam/{k8s_utils → utils_k8s}/kube_context.py +3 -3
- adam/{k8s_utils → utils_k8s}/pods.py +132 -83
- adam/{k8s_utils → utils_k8s}/secrets.py +7 -3
- adam/{k8s_utils → utils_k8s}/service_accounts.py +5 -4
- adam/{k8s_utils → utils_k8s}/services.py +2 -2
- adam/{k8s_utils → utils_k8s}/statefulsets.py +9 -16
- adam/utils_local.py +4 -0
- adam/utils_net.py +24 -0
- adam/utils_repl/__init__.py +0 -0
- adam/utils_repl/appendable_completer.py +6 -0
- adam/utils_repl/automata_completer.py +48 -0
- adam/utils_repl/repl_completer.py +172 -0
- adam/utils_repl/state_machine.py +173 -0
- adam/utils_sqlite.py +137 -0
- adam/version.py +1 -1
- {kaqing-2.0.14.dist-info → kaqing-2.0.189.dist-info}/METADATA +1 -1
- kaqing-2.0.189.dist-info/RECORD +253 -0
- kaqing-2.0.189.dist-info/top_level.txt +2 -0
- teddy/__init__.py +0 -0
- teddy/lark_parser.py +436 -0
- teddy/lark_parser2.py +618 -0
- adam/commands/app.py +0 -67
- adam/commands/bash.py +0 -87
- adam/commands/cp.py +0 -95
- adam/commands/cql_utils.py +0 -53
- adam/commands/devices.py +0 -89
- adam/commands/postgres/postgres_session.py +0 -247
- adam/commands/reaper/reaper_session.py +0 -159
- adam/commands/show/show_app_actions.py +0 -53
- adam/commands/show/show_commands.py +0 -61
- adam/commands/show/show_repairs.py +0 -47
- adam/k8s_utils/cassandra_clusters.py +0 -48
- kaqing-2.0.14.dist-info/RECORD +0 -167
- kaqing-2.0.14.dist-info/top_level.txt +0 -1
- /adam/{k8s_utils → commands/app}/__init__.py +0 -0
- /adam/{k8s_utils → utils_k8s}/config_maps.py +0 -0
- /adam/{k8s_utils → utils_k8s}/volumes.py +0 -0
- {kaqing-2.0.14.dist-info → kaqing-2.0.189.dist-info}/WHEEL +0 -0
- {kaqing-2.0.14.dist-info → kaqing-2.0.189.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
import os
|
|
3
|
+
from typing import Iterable
|
|
4
|
+
from prompt_toolkit.completion import CompleteEvent, Completer, Completion, NestedCompleter, WordCompleter
|
|
5
|
+
from prompt_toolkit.document import Document
|
|
6
|
+
|
|
7
|
+
from adam.config import Config
|
|
8
|
+
from adam.sql.lark_parser import LarkParser
|
|
9
|
+
from adam.utils import debug, log_timing, offload
|
|
10
|
+
from adam.utils_repl.appendable_completer import AppendableCompleter
|
|
11
|
+
from adam.utils_repl.repl_completer import merge_completions, preload
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"LarkCompleter",
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
def default_columns(x: list[str]):
|
|
18
|
+
return 'id,x.,y.,z.'.split(',')
|
|
19
|
+
|
|
20
|
+
class LarkCompleter(Completer, AppendableCompleter):
|
|
21
|
+
SYSTEM = 'system'
|
|
22
|
+
|
|
23
|
+
def __init__(self,
|
|
24
|
+
dml: str = None,
|
|
25
|
+
expandables: dict = {},
|
|
26
|
+
variant: str = 'c',
|
|
27
|
+
|
|
28
|
+
name: str = None,
|
|
29
|
+
options_lambda: callable = None,
|
|
30
|
+
auto: str = 'lazy',
|
|
31
|
+
debug = False
|
|
32
|
+
) -> None:
|
|
33
|
+
self.nested: NestedCompleter = None
|
|
34
|
+
self.options_lambda = options_lambda
|
|
35
|
+
if options_lambda and auto == 'lazy':
|
|
36
|
+
preload(options_lambda, log_key=name)
|
|
37
|
+
|
|
38
|
+
self.variant = variant
|
|
39
|
+
self.parser = None
|
|
40
|
+
self.dml = dml
|
|
41
|
+
self.expandables = expandables
|
|
42
|
+
|
|
43
|
+
self.display_dict = {}
|
|
44
|
+
self.meta_dict = {}
|
|
45
|
+
self.WORD = None
|
|
46
|
+
self.sentence = False
|
|
47
|
+
self.match_middle = False
|
|
48
|
+
self.pattern = None
|
|
49
|
+
|
|
50
|
+
self.debug = debug
|
|
51
|
+
|
|
52
|
+
if variant:
|
|
53
|
+
self.parser = LarkCompleter.lark_parser(variant)
|
|
54
|
+
self.preload_lazy_auto_completes()
|
|
55
|
+
|
|
56
|
+
def __repr__(self):
|
|
57
|
+
return f"LarkCompleter.{self.variant}"
|
|
58
|
+
|
|
59
|
+
def preload_lazy_auto_completes(self):
|
|
60
|
+
for key, value in self.expandables.items():
|
|
61
|
+
if callable(value):
|
|
62
|
+
if self.auto_complete(key) == 'lazy':
|
|
63
|
+
preload(value, log_key=key)
|
|
64
|
+
|
|
65
|
+
def from_lambda(name: str, options_lambda: callable, auto: str = 'lazy'):
|
|
66
|
+
return LarkCompleter(name=name, options_lambda=options_lambda, auto=auto, variant=None)
|
|
67
|
+
|
|
68
|
+
@functools.lru_cache()
|
|
69
|
+
def lark_parser(variant: str):
|
|
70
|
+
dir_path = os.path.dirname(os.path.realpath(__file__))
|
|
71
|
+
with open(dir_path + f"/qingl.lark") as f:
|
|
72
|
+
grammar: str = None
|
|
73
|
+
with log_timing(f'lark.{variant}.file-read'):
|
|
74
|
+
grammar = f.read()
|
|
75
|
+
|
|
76
|
+
common_contexts = {
|
|
77
|
+
'cd_command.file_name': 'direct-dirs',
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if variant in ['a', 'c0', 'p0', 'x0']:
|
|
81
|
+
grammar = grammar.replace('start: statement_sequence', f'start: qing_{variant}_statement')
|
|
82
|
+
contexts_by_path = {
|
|
83
|
+
} | common_contexts
|
|
84
|
+
|
|
85
|
+
debug(f'* GRAMMAR replaced to start: qing_{variant}_statement')
|
|
86
|
+
|
|
87
|
+
return LarkParser(grammar, contexts_by_path)
|
|
88
|
+
elif variant == 'system':
|
|
89
|
+
grammar = grammar.replace('start: statement_sequence', f'start: qing_{variant}_statement')
|
|
90
|
+
contexts_by_path = {
|
|
91
|
+
} | common_contexts
|
|
92
|
+
|
|
93
|
+
return LarkParser(grammar, contexts_by_path)
|
|
94
|
+
|
|
95
|
+
grammar = grammar.replace('qing_statement: qing_p_statement', f'qing_statement: qing_{variant}_statement')
|
|
96
|
+
debug(f'* GRAMMAR replaced to qing_statement: qing_{variant}_statement')
|
|
97
|
+
|
|
98
|
+
bash_contexts = {
|
|
99
|
+
'bash_statement.host_name': 'hosts',
|
|
100
|
+
'bash_statement.bash_command': 'bash-commands',
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
contexts_by_path = {
|
|
104
|
+
'describe_keyspace.keyspace_name': 'keyspaces',
|
|
105
|
+
'keyspace_ref.keyspace_path.namespace_ref.identifier_ref': 'tables',
|
|
106
|
+
'preview_table_statement.path.identifier_ref': 'tables',
|
|
107
|
+
|
|
108
|
+
'insert_statement.insert_select': 'column-names',
|
|
109
|
+
'update_statement.set_clause.path.identifier_ref': 'column-names',
|
|
110
|
+
'update_statement.where_clause.cond.expr.path.identifier_ref': 'column-names',
|
|
111
|
+
'delete_statement.where_clause.cond.expr.path.identifier_ref': 'column-names',
|
|
112
|
+
|
|
113
|
+
'select_clause.projection.result_expr.expr.path.identifier_ref': 'columns',
|
|
114
|
+
'select_from.where_clause.cond.expr.path.identifier_ref': 'columns',
|
|
115
|
+
'select_from.where_clause.cond.expr.logical_term.and_expr.cond.expr.path.identifier_ref': 'columns',
|
|
116
|
+
'select_from.group_by_clause.group_term.expr.path.identifier_ref': 'columns',
|
|
117
|
+
'select_statement.order_by_clause.ordering_term.expr.path.identifier_ref': 'columns',
|
|
118
|
+
'select_from.from_clause.from_terms.join_clause.ansi_join_clause.ansi_join_predicate.expr.path.identifier_ref': 'columns',
|
|
119
|
+
'select_from.from_clause.from_terms.join_clause.ansi_join_clause.ansi_join_predicate.expr.comparison_term.relational_expr.expr.path.identifier_ref': 'columns',
|
|
120
|
+
|
|
121
|
+
'select_from.from_clause.from_terms.from_generic.alias.identifier_ref': 'column-aliases',
|
|
122
|
+
|
|
123
|
+
'select_statement.limit_clause.expr.literal.nbr.digit': 'limits',
|
|
124
|
+
} | common_contexts
|
|
125
|
+
|
|
126
|
+
if variant == 'p':
|
|
127
|
+
contexts_by_path = bash_contexts | contexts_by_path
|
|
128
|
+
elif variant == 'c':
|
|
129
|
+
contexts_by_path = {
|
|
130
|
+
'export_table.path.identifier_ref': 'tables',
|
|
131
|
+
'show_column_counts_command.path.identifier_ref': 'tables',
|
|
132
|
+
'export_statement.export_tables.keyspace_name': 'keyspaces',
|
|
133
|
+
|
|
134
|
+
'alter_cql_table_statement.properties.property.property_name': 'table-props',
|
|
135
|
+
'alter_tables_statement.properties.property.property_name': 'table-props',
|
|
136
|
+
'alter_cql_table_statement.properties.property.property_value.literal': 'table-props-value',
|
|
137
|
+
|
|
138
|
+
'select_clause.projection.result_expr.expr.path.identifier_ref': 'columns',
|
|
139
|
+
'export_statement.export_tables.export_table.column_name_list.column_name': 'columns',
|
|
140
|
+
|
|
141
|
+
'consistency_statement.consistency': 'consistencies',
|
|
142
|
+
'export_statement.export_to.export_database_type': 'export-database-types',
|
|
143
|
+
'drop_export_database.export_database_name': 'export-databases',
|
|
144
|
+
'use_export_db_statement.export_database_name': 'export-databases',
|
|
145
|
+
'clean_up_export_session_statement.clean_up_export_sessions.export_session_name': 'export-sessions',
|
|
146
|
+
'show_export_command.export_session_name': 'export-sessions',
|
|
147
|
+
'import_statement.import_session.export_session_name': 'export-sessions-incomplete',
|
|
148
|
+
'download_session_statement.export_session_name': 'export-sessions-incomplete',
|
|
149
|
+
} | bash_contexts | contexts_by_path
|
|
150
|
+
elif variant == 'l':
|
|
151
|
+
contexts_by_path = {
|
|
152
|
+
'add_partition_action.partition_ref.partition_name': 'partition-columns',
|
|
153
|
+
'show_topn_statement.topn_count': 'topn-counts',
|
|
154
|
+
'show_topn_statement.topn_type': 'topn-types',
|
|
155
|
+
'show_topn_statement.topn_window': 'topn-windows'
|
|
156
|
+
} | contexts_by_path
|
|
157
|
+
elif variant == 'x':
|
|
158
|
+
contexts_by_path = {
|
|
159
|
+
'show_column_counts_command.path.identifier_ref': 'tables',
|
|
160
|
+
'drop_export_database.export_database_name': 'export-databases',
|
|
161
|
+
'use_export_db_statement.export_database_name': 'export-databases',
|
|
162
|
+
} | contexts_by_path
|
|
163
|
+
|
|
164
|
+
grammar = grammar.replace('select_clause: "SELECT"i hint_comment? projection', 'select_clause: ("SELECT"i | "XELECT"i) hint_comment? projection')
|
|
165
|
+
|
|
166
|
+
with offload():
|
|
167
|
+
with open('/tmp/grammar.lark', 'wt') as f:
|
|
168
|
+
f.write(grammar)
|
|
169
|
+
|
|
170
|
+
return LarkParser(grammar, contexts_by_path)
|
|
171
|
+
|
|
172
|
+
def get_completions(
|
|
173
|
+
self, document: Document, complete_event: CompleteEvent
|
|
174
|
+
) -> Iterable[Completion]:
|
|
175
|
+
if not self.nested and self.options_lambda:
|
|
176
|
+
# for lazy completions
|
|
177
|
+
self.nested = NestedCompleter.from_nested_dict(self.options_lambda())
|
|
178
|
+
|
|
179
|
+
nested_words = set()
|
|
180
|
+
|
|
181
|
+
if self.nested:
|
|
182
|
+
# from NestedCompleter
|
|
183
|
+
|
|
184
|
+
# Split document.
|
|
185
|
+
text = document.text_before_cursor.lstrip()
|
|
186
|
+
stripped_len = len(document.text_before_cursor) - len(text)
|
|
187
|
+
|
|
188
|
+
# If there is a space, check for the first term, and use a
|
|
189
|
+
# subcompleter.
|
|
190
|
+
if " " in text:
|
|
191
|
+
first_term = text.split()[0]
|
|
192
|
+
completer = self.nested.options.get(first_term)
|
|
193
|
+
|
|
194
|
+
# If we have a sub completer, use this for the completions.
|
|
195
|
+
if completer is not None:
|
|
196
|
+
remaining_text = text[len(first_term) :].lstrip()
|
|
197
|
+
move_cursor = len(text) - len(remaining_text) + stripped_len
|
|
198
|
+
|
|
199
|
+
new_document = Document(
|
|
200
|
+
remaining_text,
|
|
201
|
+
cursor_position=document.cursor_position - move_cursor,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
for c in completer.get_completions(new_document, complete_event):
|
|
205
|
+
nested_words.add(c.text)
|
|
206
|
+
yield c
|
|
207
|
+
|
|
208
|
+
# No space in the input: behave exactly like `WordCompleter`.
|
|
209
|
+
else:
|
|
210
|
+
completer = WordCompleter(
|
|
211
|
+
list(self.nested.options.keys()), ignore_case=self.nested.ignore_case
|
|
212
|
+
)
|
|
213
|
+
for c in completer.get_completions(document, complete_event):
|
|
214
|
+
nested_words.add(c.text)
|
|
215
|
+
yield c
|
|
216
|
+
|
|
217
|
+
if self.parser:
|
|
218
|
+
full = document.text_before_cursor
|
|
219
|
+
if self.dml:
|
|
220
|
+
full = self.dml + ' ' + full
|
|
221
|
+
|
|
222
|
+
words0 = []
|
|
223
|
+
words1 = []
|
|
224
|
+
context = {}
|
|
225
|
+
for word in self.parser.next_terminals(full, context=context):
|
|
226
|
+
if ex := self.expandable(word):
|
|
227
|
+
if ex in self.expandables:
|
|
228
|
+
e = self.expandables[ex]
|
|
229
|
+
if callable(e):
|
|
230
|
+
if self.auto_complete(ex) != 'off':
|
|
231
|
+
ctx = None
|
|
232
|
+
if 'last-id' in context:
|
|
233
|
+
ctx = context['last-id']
|
|
234
|
+
e = e(ctx)
|
|
235
|
+
words0.extend(e)
|
|
236
|
+
else:
|
|
237
|
+
words0.extend(e)
|
|
238
|
+
else:
|
|
239
|
+
words1.append(word)
|
|
240
|
+
words = words0 + words1
|
|
241
|
+
|
|
242
|
+
word_before_cursor = document.get_word_before_cursor(
|
|
243
|
+
WORD=self.WORD, pattern=self.pattern
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
word_before_cursor = word_before_cursor.lower()
|
|
247
|
+
|
|
248
|
+
def word_matches(word: str) -> bool:
|
|
249
|
+
return word.lower().startswith(word_before_cursor)
|
|
250
|
+
|
|
251
|
+
for word in words:
|
|
252
|
+
if word_matches(word) and word not in nested_words:
|
|
253
|
+
display = self.display_dict.get(word, word)
|
|
254
|
+
display_meta = self.meta_dict.get(word, "")
|
|
255
|
+
yield Completion(
|
|
256
|
+
word,
|
|
257
|
+
-len(word_before_cursor),
|
|
258
|
+
display=display,
|
|
259
|
+
display_meta=display_meta,
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
def completions_for_nesting(self, dml: str = None):
|
|
263
|
+
if dml:
|
|
264
|
+
return {dml: LarkCompleter(dml, expandables=self.expandables, variant=self.variant)}
|
|
265
|
+
|
|
266
|
+
return {
|
|
267
|
+
word.text.lower(): LarkCompleter(word.text, expandables=self.expandables, variant=self.variant)
|
|
268
|
+
for word in self.get_completions(Document(''), None)
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
def expandable(self, word: str):
|
|
272
|
+
return word.strip('`') if word.startswith('`') else None
|
|
273
|
+
|
|
274
|
+
def append_completions(self, key: str, value: dict[str, any]):
|
|
275
|
+
if isinstance(value, LarkCompleter) and self.variant == value.variant:
|
|
276
|
+
return
|
|
277
|
+
|
|
278
|
+
if self.nested:
|
|
279
|
+
self.nested = NestedCompleter.from_nested_dict(merge_completions(self.nested.options, value))
|
|
280
|
+
else:
|
|
281
|
+
self.nested = NestedCompleter.from_nested_dict(value)
|
|
282
|
+
|
|
283
|
+
def auto_complete(self, key: str, default = 'lazy'):
|
|
284
|
+
return Config().get(f'auto-complete.{self.variant}.{key}', default=default)
|