execsql2 2.29.0__py3-none-any.whl → 2.30.0__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.
Files changed (50) hide show
  1. execsql/__main__.py +4 -5
  2. execsql/api.py +5 -0
  3. execsql/cli/__init__.py +3 -14
  4. execsql/cli/application.py +5 -3
  5. execsql/cli/commands/lint.py +4 -1
  6. execsql/cli/commands/lsp.py +42 -0
  7. execsql/cli/dsn.py +3 -1
  8. execsql/cli/lint.py +14 -6
  9. execsql/cli/run.py +17 -9
  10. execsql/config.py +32 -6
  11. execsql/db/duckdb.py +96 -14
  12. execsql/gui/__init__.py +3 -31
  13. execsql/lsp/_util.py +21 -0
  14. execsql/lsp/cache.py +73 -0
  15. execsql/lsp/code_actions.py +10 -14
  16. execsql/lsp/completion.py +8 -15
  17. execsql/lsp/diagnostics.py +14 -2
  18. execsql/lsp/document.py +139 -41
  19. execsql/lsp/hover.py +5 -13
  20. execsql/lsp/navigation.py +7 -10
  21. execsql/lsp/server.py +111 -29
  22. execsql/manifest.py +29 -9
  23. execsql/metacommands/__init__.py +0 -2
  24. execsql/metacommands/io_fileops.py +5 -0
  25. execsql/script/executor.py +2 -21
  26. execsql/state.py +6 -3
  27. execsql/state.pyi +2 -0
  28. execsql/utils/errors.py +19 -36
  29. execsql/utils/fileio.py +44 -48
  30. execsql/utils/regex.py +0 -5
  31. {execsql2-2.29.0.dist-info → execsql2-2.30.0.dist-info}/METADATA +2 -4
  32. {execsql2-2.29.0.dist-info → execsql2-2.30.0.dist-info}/RECORD +50 -48
  33. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/README.md +0 -0
  34. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/config_settings.sqlite +0 -0
  35. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/example_config_prompt.sql +0 -0
  36. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/make_config_db.sql +0 -0
  37. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/md_compare.sql +0 -0
  38. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/md_glossary.sql +0 -0
  39. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/md_upsert.sql +0 -0
  40. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/pg_compare.sql +0 -0
  41. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/pg_glossary.sql +0 -0
  42. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/pg_upsert.sql +0 -0
  43. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/script_template.sql +0 -0
  44. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/ss_compare.sql +0 -0
  45. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/ss_glossary.sql +0 -0
  46. {execsql2-2.29.0.data → execsql2-2.30.0.data}/data/execsql2_extras/ss_upsert.sql +0 -0
  47. {execsql2-2.29.0.dist-info → execsql2-2.30.0.dist-info}/WHEEL +0 -0
  48. {execsql2-2.29.0.dist-info → execsql2-2.30.0.dist-info}/entry_points.txt +0 -0
  49. {execsql2-2.29.0.dist-info → execsql2-2.30.0.dist-info}/licenses/LICENSE.txt +0 -0
  50. {execsql2-2.29.0.dist-info → execsql2-2.30.0.dist-info}/licenses/NOTICE +0 -0
execsql/utils/fileio.py CHANGED
@@ -34,7 +34,6 @@ import threading
34
34
  import time
35
35
  import weakref
36
36
  from collections.abc import Callable
37
- from encodings.aliases import aliases as codec_dict
38
37
  from typing import Any, NamedTuple, cast
39
38
 
40
39
  from execsql.exceptions import ErrInfo
@@ -47,14 +46,11 @@ __all__ = [
47
46
  "EncodedFile",
48
47
  "Logger",
49
48
  "TempFileMgr",
50
- "list_encodings",
51
49
  "filewriter_filestatus",
52
50
  "filewriter_write",
53
51
  "filewriter_open_as_new",
54
52
  "filewriter_close",
55
53
  "filewriter_close_all_after_write",
56
- "filewriter_closeall",
57
- "filewriter_shutdown",
58
54
  "filewriter_end",
59
55
  "redact",
60
56
  "register_secret",
@@ -216,9 +212,8 @@ class FileWriter(threading.Thread):
216
212
  CMD_OPEN_AS_NEW,
217
213
  CMD_CLOSE_ALL_AFTER_WRITE,
218
214
  CMD_CLOSED_STATUS,
219
- CMD_PING,
220
215
  CMD_OPEN_FAILURES,
221
- ) = range(10)
216
+ ) = range(9)
222
217
 
223
218
  class FileControl:
224
219
  STATUS_OPEN, STATUS_WAITING, STATUS_UNOPENED, STATUS_CLOSED, STATUS_OPENFAILURE, STATUS_WRITEFAILURE = range(6)
@@ -375,7 +370,6 @@ class FileWriter(threading.Thread):
375
370
  self.open_as_new,
376
371
  self.close_all_after_write,
377
372
  self.closed_status,
378
- self.ping,
379
373
  self.open_failures,
380
374
  )
381
375
 
@@ -417,10 +411,6 @@ class FileWriter(threading.Thread):
417
411
  if fc.status != self.FileControl.STATUS_CLOSED and fc.status not in fc.FAILED:
418
412
  self._on_file(fc, fc.clean_close)
419
413
 
420
- def ping(self, token: object) -> None:
421
- """Echo *token* back on the return queue — used to synchronize callers."""
422
- self.return_msg_queue.put(token)
423
-
424
414
  def retry_waiting(self) -> None:
425
415
  """Re-attempt opening every file still waiting on a lock.
426
416
 
@@ -526,7 +516,7 @@ class FileWriter(threading.Thread):
526
516
  the rest, so one bad command cannot stop the thread (and with it
527
517
  every later write, to any file).
528
518
  """
529
- filename = argtuple[0] if command != self.CMD_PING and argtuple and isinstance(argtuple[0], str) else ""
519
+ filename = argtuple[0] if argtuple and isinstance(argtuple[0], str) else ""
530
520
  lost = LostOutput(filename, 0, str(exc), "writer")
531
521
  if command == self.CMD_OPEN_FAILURES:
532
522
  self.return_msg_queue.put([lost])
@@ -535,7 +525,6 @@ class FileWriter(threading.Thread):
535
525
  replies: dict[int, Any] = {
536
526
  self.CMD_GET_STATUS: self.FileControl.STATUS_CLOSED,
537
527
  self.CMD_CLOSED_STATUS: self.FileControl.STATUS_CLOSED,
538
- self.CMD_PING: argtuple[0] if argtuple else None,
539
528
  }
540
529
  if command in replies:
541
530
  self.return_msg_queue.put(replies[command])
@@ -745,20 +734,6 @@ def _lost_output_message(lost: LostOutput, open_timeout: int) -> str:
745
734
  return f"{cause}; {lost.dropped} line(s) of output to it were discarded" if lost.dropped else cause
746
735
 
747
736
 
748
- def filewriter_closeall() -> None:
749
- fw = _active_writer()
750
- if fw is None:
751
- return
752
- fw.input_queue.put((FileWriter.CMD_CLOSE_ALL, ()))
753
-
754
-
755
- def filewriter_shutdown() -> None:
756
- fw = _active_writer()
757
- if fw is None:
758
- return
759
- fw.input_queue.put((FileWriter.CMD_SHUTDOWN, ()))
760
-
761
-
762
737
  def filewriter_end(writer: FileWriter | None = None) -> None:
763
738
  """Close every file and stop *writer*, or the active run's writer if omitted.
764
739
 
@@ -894,6 +869,8 @@ class Logger:
894
869
  self.server_name = server_name
895
870
  self.cmdline_options = cmdline_options
896
871
  self._redaction_values: list[str] = []
872
+ # Of those, the -a / --var values: masked in the log, not in the manifest.
873
+ self._argument_values: set[str] = set()
897
874
  if log_file_name:
898
875
  self.log_file_name = log_file_name
899
876
  else:
@@ -956,9 +933,9 @@ class Logger:
956
933
  )
957
934
  self.writelog(self._redact(msg) or "")
958
935
  if server_name:
959
- msg = f"run_db_server\t{self.run_id}\t{server_name}\t{db_name}\n"
936
+ msg = f"run_db_server\t{self.run_id}\t{self._redact(server_name)}\t{self._redact(db_name)}\n"
960
937
  else:
961
- msg = f"run_db_file\t{self.run_id}\t{db_name}\n"
938
+ msg = f"run_db_file\t{self.run_id}\t{self._redact(db_name)}\n"
962
939
  self.writelog(msg)
963
940
  self.seq_no = 0
964
941
  atexit.register(self.close)
@@ -974,20 +951,41 @@ class Logger:
974
951
 
975
952
  return _datetime.datetime.now().isoformat(timespec="seconds")
976
953
 
977
- def add_redaction_value(self, value: str | None) -> None:
954
+ def add_redaction_value(self, value: str | None, *, argument: bool = False) -> None:
955
+ """Mask *value* in every later log record.
956
+
957
+ *argument* marks an ``-a`` / ``--var`` value: it may be a secret, so
958
+ the log masks it, but it is just as often part of a path, so the
959
+ ``--manifest`` JSON (``redact(..., arguments=False)``) does not. A
960
+ value registered both ways is a secret.
961
+ """
978
962
  if value is None:
979
963
  return
980
964
  value = str(value)
981
- if not value or value in self._redaction_values:
965
+ if not value:
966
+ return
967
+ if not argument:
968
+ self._argument_values.discard(value)
969
+ if value in self._redaction_values:
982
970
  return
983
971
  self._redaction_values.append(value)
972
+ if argument:
973
+ self._argument_values.add(value)
974
+
975
+ def _redact(self, msg: str | None, *, arguments: bool = True) -> str | None:
976
+ """*msg* with registered secrets and common secret shapes replaced by ``***``.
984
977
 
985
- def _redact(self, msg: str | None) -> str | None:
978
+ Every record applies it to its free-text fields (messages, names,
979
+ paths), never to a whole line: a registered value can be as short as
980
+ a ``-a 2024`` argument, which would otherwise mask timestamps and
981
+ sequence numbers.
982
+ """
986
983
  if msg is None:
987
984
  return None
988
985
  redacted = str(msg)
989
986
  for value in sorted(self._redaction_values, key=len, reverse=True):
990
- redacted = redacted.replace(value, "***")
987
+ if arguments or value not in self._argument_values:
988
+ redacted = redacted.replace(value, "***")
991
989
  for pattern in self._COMMON_SECRET_PATTERNS:
992
990
  if pattern.pattern.startswith("(?i)(://"):
993
991
  redacted = pattern.sub(r"\1***\3", redacted)
@@ -1026,12 +1024,13 @@ class Logger:
1026
1024
 
1027
1025
  def log_db_connect(self, db: Any) -> None:
1028
1026
  self.seq_no += 1
1029
- msg = f"connect\t{self.run_id}\t{self.seq_no}\t{self._ts()}\t{db.name()}\n"
1027
+ msg = f"connect\t{self.run_id}\t{self.seq_no}\t{self._ts()}\t{self._redact(db.name())}\n"
1030
1028
  self.writelog(msg)
1031
1029
 
1032
1030
  def log_action_export(self, line_no: int, query_name: str, export_file_name: str) -> None:
1033
1031
  self.seq_no += 1
1034
- msg = f"action\t{self.run_id}\t{self.seq_no}\t{self._ts()}\texport\t{line_no}\tQuery {query_name} exported to {export_file_name}\n"
1032
+ description = self._redact(f"Query {query_name} exported to {export_file_name}")
1033
+ msg = f"action\t{self.run_id}\t{self.seq_no}\t{self._ts()}\texport\t{line_no}\t{description}\n"
1035
1034
  self.writelog(msg)
1036
1035
 
1037
1036
  def log_status_exception(self, msg: str | None) -> None:
@@ -1087,7 +1086,7 @@ class Logger:
1087
1086
  self.exit_type = "halt"
1088
1087
  self.exit_scriptfile = script_file_name
1089
1088
  self.exit_lno = line_no
1090
- self.exit_description = msg
1089
+ self.exit_description = None if not msg else msg.replace("\n", "")
1091
1090
 
1092
1091
  def log_exit_interrupted(self) -> None:
1093
1092
  # Save values to be used by exit() function triggered on program exit
@@ -1121,9 +1120,9 @@ class Logger:
1121
1120
  wmsg = "exit\t{}\t{}\t{}({})\t{}\t{:.1f}s\n".format(
1122
1121
  self.run_id,
1123
1122
  self.exit_type,
1124
- self.exit_scriptfile or "",
1123
+ self._redact(self.exit_scriptfile) or "",
1125
1124
  str(self.exit_lno or ""),
1126
- self.exit_description or "",
1125
+ self._redact(self.exit_description) or "", # a HALT MESSAGE can hold any variable's value
1127
1126
  elapsed,
1128
1127
  )
1129
1128
  self.writelog(wmsg)
@@ -1144,12 +1143,16 @@ def register_secret(value: str | None) -> None:
1144
1143
  add(value)
1145
1144
 
1146
1145
 
1147
- def redact(text: str) -> str:
1148
- """*text* with the active run's registered secrets and common secret shapes replaced by ``***``."""
1146
+ def redact(text: str, *, arguments: bool = True) -> str:
1147
+ """*text* with the active run's registered secrets and common secret shapes replaced by ``***``.
1148
+
1149
+ With *arguments* false, ``-a`` / ``--var`` values are left as they are
1150
+ (see :meth:`Logger.add_redaction_value`).
1151
+ """
1149
1152
  import execsql.state as _state
1150
1153
 
1151
1154
  redactor = getattr(_state.exec_log, "_redact", None)
1152
- return redactor(text) if redactor is not None else text
1155
+ return (redactor(text, arguments=arguments) or "") if redactor is not None else text
1153
1156
 
1154
1157
 
1155
1158
  class TempFileMgr:
@@ -1188,10 +1191,3 @@ _live_tempfile_mgrs: weakref.WeakSet[TempFileMgr] = weakref.WeakSet()
1188
1191
  def _remove_all_temp_files() -> None:
1189
1192
  for mgr in list(_live_tempfile_mgrs):
1190
1193
  mgr.remove_all()
1191
-
1192
-
1193
- def list_encodings() -> None:
1194
- enc = list(codec_dict.keys())
1195
- enc.sort()
1196
- msg = f"Encodings: {', '.join(enc)}\n"
1197
- print(msg)
execsql/utils/regex.py CHANGED
@@ -16,7 +16,6 @@ import os
16
16
 
17
17
  __all__ = [
18
18
  "ins_rxs",
19
- "ins_quoted_rx",
20
19
  "ins_schema_rxs",
21
20
  "ins_table_rxs",
22
21
  "ins_table_list_rxs",
@@ -42,10 +41,6 @@ def ins_rxs(rx_list: tuple[str, ...], fragment1: object, fragment2: object) -> t
42
41
  return tuple(rv)
43
42
 
44
43
 
45
- def ins_quoted_rx(fragment1: object, fragment2: object, rx: str) -> tuple[str, ...]:
46
- return ins_rxs((rx, rf'"{rx}"'), fragment1, fragment2)
47
-
48
-
49
44
  def ins_schema_rxs(fragment1: object, fragment2: object, suffix: str | None = None) -> tuple[str, ...]:
50
45
  schema_exprs: tuple[str, ...] = (
51
46
  r'"(?P<schema>[A-Za-z0-9_\- ]+)"',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: execsql2
3
- Version: 2.29.0
3
+ Version: 2.30.0
4
4
  Summary: Runs a SQL script against a PostgreSQL, SQLite, MariaDB/MySQL, DuckDB, Firebird, MS-Access, MS-SQL-Server, or Oracle database, or an ODBC DSN. Provides metacommands to import and export data, copy data between databases, conditionally execute SQL and metacommands, and dynamically alter SQL and metacommands with substitution variables.
5
5
  Project-URL: Homepage, https://execsql2.readthedocs.io
6
6
  Project-URL: Repository, https://github.com/geocoug/execsql
@@ -83,7 +83,6 @@ Provides-Extra: auth-plaintext
83
83
  Requires-Dist: keyring>=25.0; extra == 'auth-plaintext'
84
84
  Requires-Dist: keyrings-alt>=5.0; extra == 'auth-plaintext'
85
85
  Provides-Extra: dev
86
- Requires-Dist: build>=1.2.2.post1; extra == 'dev'
87
86
  Requires-Dist: bump-my-version>=1.2.7; extra == 'dev'
88
87
  Requires-Dist: defusedxml>=0.7; extra == 'dev'
89
88
  Requires-Dist: jinja2>=3.1; extra == 'dev'
@@ -104,7 +103,6 @@ Requires-Dist: ruff>=0.4; extra == 'dev'
104
103
  Requires-Dist: sqlglot<30.22,>=30.21.0; extra == 'dev'
105
104
  Requires-Dist: tables>=3.10; extra == 'dev'
106
105
  Requires-Dist: tox-uv>=1.13.1; extra == 'dev'
107
- Requires-Dist: twine>=6.1.0; extra == 'dev'
108
106
  Requires-Dist: xlrd>=2.0; extra == 'dev'
109
107
  Requires-Dist: zensical==0.0.67; extra == 'dev'
110
108
  Provides-Extra: duckdb
@@ -466,7 +464,7 @@ execsql format --no-sql --in-place scripts/
466
464
  ```yaml
467
465
  repos:
468
466
  - repo: https://github.com/geocoug/execsql
469
- rev: v2.29.0
467
+ rev: v2.30.0
470
468
  hooks:
471
469
  - id: execsql-format
472
470
  - id: execsql-lint
@@ -1,34 +1,34 @@
1
1
  execsql/__init__.py,sha256=ZeVnpEWu8M2bn3qLmVM72NhWRueUGNbsX8UAPTermo0,901
2
- execsql/__main__.py,sha256=HdbK-SAhyUmfB6xINY5AzxdMSxGzWSGEG_2dv42Jn64,315
3
- execsql/api.py,sha256=UJJSlFHySuINeoExaMXqhl00hVSPH1s7G4m8T0NX_xI,26484
4
- execsql/config.py,sha256=GUKE3sLGExMMhMkmxi8eXXBWmN74E0vqnt1eTBPRsG4,38166
2
+ execsql/__main__.py,sha256=Nnh7_QgjYTTzd1Kog2thl7wzNpoxfnZ3YaurSOMzE_U,270
3
+ execsql/api.py,sha256=xcnqVy1IN1mHuBT3SslHkpx1z4ica8ez8HL4bWOTltQ,26722
4
+ execsql/config.py,sha256=-BbdMrWwdDDC7cMJqyYMxet2pMCA_aH3_VFkVx3-aq4,39149
5
5
  execsql/config_validation.py,sha256=a4ZszyJFGTNgs1jkvXE3yMCaYFtF1Uqih2ojMDVh1v8,10556
6
6
  execsql/exceptions.py,sha256=aHavdblmP7m5ZLxyyKKmPSwwbdmP962j4ShP1Gd9r64,9651
7
7
  execsql/format.py,sha256=z-KZ8VY1muz8S6iaErZX9E_7wE_VtjEcUB7e_KyhfyI,59565
8
8
  execsql/interactive.py,sha256=7vm7NAlcarBJJOIffcLOcJqH9ZCInvHB_CmC2sQsXf8,8241
9
- execsql/manifest.py,sha256=ibceEZtH2FqsUiujbTGy5D3W0WgO4tFCs7bjIHVdep4,8062
9
+ execsql/manifest.py,sha256=eJp39R8bYuFuJiGaBbDsk_lua13uJHXPOdwWdUfE-CQ,9027
10
10
  execsql/models.py,sha256=caUGQ3C9hvFaj6c6-GwBzZc8FAGTD1ZSJYd8bFyRh5I,16410
11
11
  execsql/parser.py,sha256=bw26e1lD-PZscV11VtBdqSLkjpcYfNLQC2EYfYD5UwU,16012
12
12
  execsql/plugins.py,sha256=RykMlIjTyWcnQc9ygjLErS3wdcsZSsG9QTIvg4DwfAI,13626
13
13
  execsql/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- execsql/state.py,sha256=NDAtv38b2cmknz-jEgOaOeqZCc6GdxN6mz-KCqb9pqg,23263
15
- execsql/state.pyi,sha256=pEuTT4G6VNiwy4Ii7OUXc1RvzcQvjFkeFazSGEOprs0,4300
14
+ execsql/state.py,sha256=rXhxx58dVFjhG58HGOXm3ewloVlvpcaYnW1rij4qjkM,23478
15
+ execsql/state.pyi,sha256=ZDHZ1DPKYu4Qs4bcJT31XNv4GOt6O4s_zH4UHCowovw,4344
16
16
  execsql/types.py,sha256=zey_bc2AzbUduLoK-nps16qX2zazDYf_iapWkG_cbmA,33130
17
- execsql/cli/__init__.py,sha256=8wDwIAFq7AI9iSGuw-Xfky-izN_7oHjUegr_brEBot0,3197
18
- execsql/cli/application.py,sha256=qKjkhDMWB7fEjEbqOLZ3pNFw80piBnRSeW_DfZg-9MA,12448
17
+ execsql/cli/__init__.py,sha256=FHg2lm2gt4L-XBnlVORn3qWHZ4739Ao-uwBIURfVIjg,2798
18
+ execsql/cli/application.py,sha256=lrBmuTfe9nKc_btGFeT_58Ij__w8FOEZvMqfb4rjc-k,12542
19
19
  execsql/cli/dispatch.py,sha256=deyN2QQYvdzMSqGGa3CSMpaqdLNeMgc5Uke0mUbl764,2704
20
- execsql/cli/dsn.py,sha256=uBspf8DXCn2pXmT1Ug1c4IG7IgR5IFGKp9138puaubo,3289
20
+ execsql/cli/dsn.py,sha256=vMabu01EEVAC5O3rpcyJnl4jWR2DQtjDeLLSg8CZqkM,3460
21
21
  execsql/cli/help.py,sha256=bEy6ssVjyIw73JD_UPLXnCtnCifdVCKJr_cydAAVxhk,8220
22
- execsql/cli/lint.py,sha256=8dZhwPrkc-_0WFd1D_qjBdKuql0SP5dpkdBRFd25xC8,47604
22
+ execsql/cli/lint.py,sha256=5V_th4la5DkUwZrPVj7mFZcM96Oq2DzoUfjXLdWtfDc,48125
23
23
  execsql/cli/options.py,sha256=Srhf1gEOB5yy_7PxkTKBv07xK8Qzw8H-z7PUUnItpwE,2916
24
- execsql/cli/run.py,sha256=5f0SX6QyNl8Ur2MwuW2GaN1OqVpWbEI8CQV3k-hBwH8,41987
24
+ execsql/cli/run.py,sha256=PHaYBD9VACnlH8Yko4SD2duYHV6G8u95DzMHa1LnB-E,42610
25
25
  execsql/cli/commands/__init__.py,sha256=FVe_xF7w98krP-USxqf-BIcflA1ctMYVsV8p0i6cChA,572
26
26
  execsql/cli/commands/config.py,sha256=V7CGGkhSCqeJIlAXxAYyG_xNhnsORiwqth2XWEVPzss,8213
27
27
  execsql/cli/commands/format.py,sha256=3awfNmCc6kImeyXKZo1Jt1qXbEuWk86ZllqEOY5vxzw,4456
28
28
  execsql/cli/commands/init.py,sha256=kmuFgGz8sv_1KfiNh190E3A23evqkgYZeBRTU6vdjbs,5465
29
- execsql/cli/commands/lint.py,sha256=Lba5IDsXtiUbQ6DkhC9fdLnoSpfoaewoAWF-ei3h59s,8189
29
+ execsql/cli/commands/lint.py,sha256=Lkj_LEeZsLCVzRS9KxJFvx6fHJyf5enmR9pu5VZh4Yw,8435
30
30
  execsql/cli/commands/listing.py,sha256=thtkJ-ILGd0SPs57oVIMkkCGpXsfS0hQxueMc2ccRVw,3514
31
- execsql/cli/commands/lsp.py,sha256=4Xng1xtoCxF6X0eQ8oC4KnV0ovEeGmlDb0tpdjJnskg,2483
31
+ execsql/cli/commands/lsp.py,sha256=8xIrqA4dnapdlLqbGGb53YtFTnsX2YqpLYvrrl-Z6pE,4051
32
32
  execsql/cli/commands/run.py,sha256=sGFDku66CazJrorr0mmrhUI3QDvQVSMEYlU8G1Pd5fQ,16492
33
33
  execsql/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
34
  execsql/data/execsql.conf.template,sha256=pqh7G21ifYO0BjZoTgUhGyQAx4eKOmbIr6nToc1V7QA,12494
@@ -37,7 +37,7 @@ execsql/db/__init__.py,sha256=jTbuafuKOqYtXFR1wvCOoKK5Lr3l1uErfaIbIr6UywI,1063
37
37
  execsql/db/access.py,sha256=xfBzcgP1qJovxSYwrpu0bdxqyJWqMoMP8i4FsaCTYXA,21306
38
38
  execsql/db/base.py,sha256=5f-1YxaaopRPnCPVs4OVOkYmWFtG1V71sk2XFoBUE_Y,42849
39
39
  execsql/db/dsn.py,sha256=CaISffisqO5IjSE-elEpwK9vXLaArp3ItpV8lvRTu-I,6920
40
- execsql/db/duckdb.py,sha256=2iVlbjQdOSAwhI2LxWEm7FYZxjjVcKiE8rT_3VJdRIo,7761
40
+ execsql/db/duckdb.py,sha256=KC8Tqbnemg3wsYH_efnFmxtybPbMXElFDsoeq_FeVus,11143
41
41
  execsql/db/factory.py,sha256=cMptU3BL1Nsilo7LKLAI5RR-LiC9RTH-3UC9rHT2JLQ,5519
42
42
  execsql/db/firebird.py,sha256=CoNnzFtOFAkp8OJByXXXclitCPAAjM23eFJGfy3C7IE,10171
43
43
  execsql/db/mysql.py,sha256=PexKdOzqR7cpkD_nIjPDwSEK_Or8AkWvBh_TEqsIMhU,22231
@@ -70,7 +70,7 @@ execsql/exporters/xlsx.py,sha256=7sm-3KniYlB2K-n6xQmIoHbAvl2ryJhFWU95SEkR7e4,127
70
70
  execsql/exporters/xml.py,sha256=t1PSr3i8xvTCWzd9jaxxAy5NcRpl6sqjnZALafKCqpM,2575
71
71
  execsql/exporters/yaml.py,sha256=ex2h91E12wItvh84AarjrDTcZ4SDx9uq0c9wtr-NuQM,3084
72
72
  execsql/exporters/zip.py,sha256=0vDkXB19WzLzgCACBVNnGJYxacgBwEehQDL7Inl-rgw,5002
73
- execsql/gui/__init__.py,sha256=oCb-cyhLZzVpWJ4WU5HbqEDBrV-lm0ytEwxemrOZyqs,2048
73
+ execsql/gui/__init__.py,sha256=5qsg3aWsaC0HfTDrGeh_2x40QRuivGgzT7cKvaM7jS0,1269
74
74
  execsql/gui/base.py,sha256=DMTqHLlpZlGCsNKyrLlJPbaxvukC0n1YmR4aHEN3jPY,14983
75
75
  execsql/gui/console.py,sha256=dzdSl4NJNvRd9VvlwRCXHvfnXjQPimyTx7NcibcUZC8,18305
76
76
  execsql/gui/desktop.py,sha256=y-T317NzSs9kcA4-NZW-Dx2cZ4Bv1mPoCr7hwQCJYoo,59467
@@ -83,17 +83,19 @@ execsql/importers/json.py,sha256=fL47h09Zzx4Qw3TTQRQJbdPdD3qVMiU-kK9C7j1IQzg,553
83
83
  execsql/importers/ods.py,sha256=VsxIkr7opBamB0PbSFmMWt7G11w8lLUH1k_kRwz28zw,2847
84
84
  execsql/importers/xls.py,sha256=D7Ul42gIRYZZC5QxD35ft_wmqQv2f1jNMSbnqlzV0ZA,3851
85
85
  execsql/lsp/__init__.py,sha256=KXpbN_CfnfMcvHmE0xPz9ddpp9CAaQH_O7mzBi4O4X8,259
86
- execsql/lsp/code_actions.py,sha256=QEzp7KnIS_9QeanClcpmC2miMCT9ehxxOWUth4ZHPzg,8884
87
- execsql/lsp/completion.py,sha256=-_HNiWzRgtJDisErNGiBHWwsKeVWBHNnAOu235XV_ys,8148
88
- execsql/lsp/diagnostics.py,sha256=Rf5izQN7BX2SUjll-kA5_D12BybFKdj5f4mEPQ0C2q4,2496
89
- execsql/lsp/document.py,sha256=E9FfnAypzggO__QGWSlbfa6AhYE_1IMpIbyrwkEKx8s,8774
86
+ execsql/lsp/_util.py,sha256=8CypObGywKZP1aRetq0ytNBqlMelIdJWduR1JnEuW1E,729
87
+ execsql/lsp/cache.py,sha256=wAiZAzNdVseqRDJQ4aiKJF6WVHBV20tt9lQ7kvwlMeo,3149
88
+ execsql/lsp/code_actions.py,sha256=5UH_W22MY00PMXCc_IV0xv4v1WnvUvKMu3QWnk7qf-w,8579
89
+ execsql/lsp/completion.py,sha256=podEPbgDwGbvGdOWPQRuxsYpQ4f1mybuVgAkwwd7MGQ,7875
90
+ execsql/lsp/diagnostics.py,sha256=jCqilTXgcRmCYmH4KrFjvDG6apBQwPOT0mX3lr7v7og,3076
91
+ execsql/lsp/document.py,sha256=9Q3AG0ErAU3Uv-iQYxD8bOY2WM9DiZR8oX-weWX8u7A,12285
90
92
  execsql/lsp/folding.py,sha256=PgwehzXnPcR68myldo2SYrqbfGla4f6gb_UrhKmaqyQ,2752
91
93
  execsql/lsp/formatting.py,sha256=9YpCfLsi09M1PZovB2HJN-Tp9Jqgk-2xxit5g5NrTqU,1217
92
- execsql/lsp/hover.py,sha256=yihlkc0i8f50rtYz8afnd-a81H1ocXOlkYb09m-VkqU,5379
93
- execsql/lsp/navigation.py,sha256=GYZKHUP7ozdQ_yVk0yL2h8qcF1uuT5IoT6n1wiasxIY,6587
94
+ execsql/lsp/hover.py,sha256=JemZqJ8d7FHouMhW92jkfek14fL9rl6JBQU7JIXJHos,5038
95
+ execsql/lsp/navigation.py,sha256=_f-zW82P4Wkelbsdedz_5l_ztFt-CFD8VSiVE5JaSAM,6436
94
96
  execsql/lsp/rename.py,sha256=fYk1gDSWWhqyoIGZO5hVIHPYYdGKNjgZS0mijFDFpac,3756
95
- execsql/lsp/server.py,sha256=R9QBhPyZONpTa9yfrmvxftVrOVyX5NXwoEqcBnKnq-M,16047
96
- execsql/metacommands/__init__.py,sha256=H_D1Z5kN6zfYtxatejQhQhQV1tlVZ7rcdFZ_9uhXu2Q,13010
97
+ execsql/lsp/server.py,sha256=gTjk1agZbygdbcowa3jkL45WJ37sxhJ58oiLB7BM6Bw,19893
98
+ execsql/metacommands/__init__.py,sha256=MO5cF84jHakrgYDR8C4-YzeMTLU6oCDeB7x-kUpoVws,12970
97
99
  execsql/metacommands/conditions.py,sha256=4DsMXr6vnfbtcKqgnxYV4UK4NmAfE_hpfgkFjlH0bjo,29844
98
100
  execsql/metacommands/connect.py,sha256=SPk4h9yiUgTD3w1gNOT_oYx8VShggsO357by5Hoy6OI,15344
99
101
  execsql/metacommands/control.py,sha256=9swW6X8jXDUpu5cHiAnQVx1ahFyWxlx7mjg4dqYfX5Y,9355
@@ -103,7 +105,7 @@ execsql/metacommands/dispatch.py,sha256=so0ebcnv66NhVDtA1Bt4GelD0hsC5w7gy7rItz2M
103
105
  execsql/metacommands/effects.py,sha256=cRSo48R4nRJzkRR3OGHLhJzofcdAaNIobaxmn1N9TGw,3813
104
106
  execsql/metacommands/io.py,sha256=vlGBje5sgnqeilooMdhJDgSRIhysHy5_7LrKtik9Xjs,3011
105
107
  execsql/metacommands/io_export.py,sha256=YamxQwURRjZRpCG2z8W3QurncCmEmAyLFqDkxtHo5dY,14434
106
- execsql/metacommands/io_fileops.py,sha256=JkuHBsZFDZvAW3wUJtdWwm4qGkpXObqkQNcZalhJVkE,12766
108
+ execsql/metacommands/io_fileops.py,sha256=sLTyh8CA-1rdDFLwh3ciACCPuM8r7xJJgk6tQS6CmwI,12939
107
109
  execsql/metacommands/io_import.py,sha256=gJICeK1MOfG6D73I7m8zBCalvr_ZJzD-QBKOpKYeYXo,15684
108
110
  execsql/metacommands/io_write.py,sha256=yXDkMbQ3haDARVATVUYZprakyJHSyk1NywdKkFLpQ14,12783
109
111
  execsql/metacommands/prompt.py,sha256=PlXhtBYCembG_1SSCrwpQR10mGF3_jXodu4aCSHlSCM,37950
@@ -115,7 +117,7 @@ execsql/script/__init__.py,sha256=I7hVO6wm3iOocxRRGEcFHhjdtL1moKbUYLB-wKbjPdk,32
115
117
  execsql/script/ast.py,sha256=WqCpFxhxrT2IIGvbArTp3QS0BZryRZAb7IL4ri3I6xg,20591
116
118
  execsql/script/control.py,sha256=WqLy-HLPqHG3vEzYpKMiIJsD7LpORjyQuUWzFzcGz4w,2327
117
119
  execsql/script/engine.py,sha256=wjXKwPIis-T2Y8rLnRXQ_ymUFdXff1MlI2IIYmxihKo,18448
118
- execsql/script/executor.py,sha256=lvMFjKe2h4fafhKNiuoXAYpDe8pLHHuYMiwPkLYJe9I,41527
120
+ execsql/script/executor.py,sha256=p3Aj7Ab8HwZRnmYds_e6h6yhRzCCa9XXbdVDkpg6NaQ,40855
119
121
  execsql/script/parser.py,sha256=z73v6t6ZbPUKkRu-UOIL6q1cCRDeoRvG2aXXC8NpMvE,37162
120
122
  execsql/script/variables.py,sha256=Tb01aHqOdWZbkgj-oW0ky3KWNy5N34XLD-Fm2eShYZM,17462
121
123
  execsql/utils/__init__.py,sha256=0uR6JwVJQRX3vceByNBduCAf5dd5assKjeqJUWvpZoA,278
@@ -123,31 +125,31 @@ execsql/utils/auth.py,sha256=BV7VtLM-ID8jNB42vx7GEz8yb3Z1Qs9xCr4cUMqL864,14539
123
125
  execsql/utils/color.py,sha256=goQqhnLg8yERpFolQikA9zYSVcuAm0unKTJiWTbQm-U,634
124
126
  execsql/utils/crypto.py,sha256=KlT6lPk-v0-qQQfAMfWvT9Q6kRdCD3_5JVaLajNocKM,3051
125
127
  execsql/utils/datetime.py,sha256=rqtGrc0t37V00mvirJ8wJKHmDtDSYzTg_UgCyIBzv9E,5583
126
- execsql/utils/errors.py,sha256=NA-JXP4cyEZ8Y_KNOPLS_ebXTJhQ50gNMBSTTcnsLIc,12350
127
- execsql/utils/fileio.py,sha256=ADp8Iltf_zfv0PL0VRdO0BDIHkVpKVVh59_5zmkTfkw,47564
128
+ execsql/utils/errors.py,sha256=yUyA61vlY8cNmC4-XR7hpACG_T6wUK82FF0AnRxDrBs,11693
129
+ execsql/utils/fileio.py,sha256=IqIEhun9aOnr1oBCWK2z2VAPVo95bZ54cVglLW4rV9M,48208
128
130
  execsql/utils/gui.py,sha256=1iiupP9AsLdR6ST0gcLE143o6y6YGUFlNv_pdVPxfCE,23943
129
131
  execsql/utils/mail.py,sha256=4RiKtXa_sqij_YGdYmjQ3PG0u3G9qjs-9caQwBErtBw,7278
130
132
  execsql/utils/numeric.py,sha256=_7bi5R6pHjMCkOPne_Sh5nUj-B8e9g6WFmjptFHaunA,1573
131
- execsql/utils/regex.py,sha256=B3mSBhRRx_DpUnX_t9IoYd05KvWAebiLMCZqQAmEwcw,3885
133
+ execsql/utils/regex.py,sha256=DGzPBl0Kt4--RbwPhoZI6Bm6N_CBUvI0DbqE4EF6qp8,3718
132
134
  execsql/utils/strings.py,sha256=UQNjpRCEFa1UO6feU-M-9e24wWAvizs_iu_4fFusLxo,8516
133
135
  execsql/utils/timer.py,sha256=eDYf5VzCNFk7oo90InJucUm3XcBdhYMogjZMqeg9xzc,1899
134
- execsql2-2.29.0.data/data/execsql2_extras/README.md,sha256=7SG9FbBpdqkgQTTt1aBTbCgymBZyV0rLrQMQrendzxs,5032
135
- execsql2-2.29.0.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
136
- execsql2-2.29.0.data/data/execsql2_extras/example_config_prompt.sql,sha256=2e8KzzVWhho8KxYVHETSVmZdhW7wodioDsqBLSL6m4s,7487
137
- execsql2-2.29.0.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
138
- execsql2-2.29.0.data/data/execsql2_extras/md_compare.sql,sha256=qYYVAjSeHZzjszxV3Bv6bg8Ckbq2kMHl87_gh4sywMU,24140
139
- execsql2-2.29.0.data/data/execsql2_extras/md_glossary.sql,sha256=hkZ2Onn57LAKKsuXxzhR8tPtcWXkmWEQkwPE58-Tm2k,10796
140
- execsql2-2.29.0.data/data/execsql2_extras/md_upsert.sql,sha256=_CAK4BzEboRXTNy03SJR-oOjcEdSNMuRBPL6noWUptY,112560
141
- execsql2-2.29.0.data/data/execsql2_extras/pg_compare.sql,sha256=1zJd4hVUKHR0tncc2qTBC9B4qVV4Us2ITkJpsjN3tMw,24352
142
- execsql2-2.29.0.data/data/execsql2_extras/pg_glossary.sql,sha256=IKuwna-_8b20ljSkXZruuiQigrCpo7ueQdUqd1MXiuI,9908
143
- execsql2-2.29.0.data/data/execsql2_extras/pg_upsert.sql,sha256=HpPJtTHvpEjQy03j-3iPxDEOHMRkudOg7O4D4YR38UI,108315
144
- execsql2-2.29.0.data/data/execsql2_extras/script_template.sql,sha256=2J35ddZPguJ-vwTsz83wErv0jiWUyJcdW_JM0mNKDXA,11155
145
- execsql2-2.29.0.data/data/execsql2_extras/ss_compare.sql,sha256=j1qVNUPXQsEU7-DoVgDJCGcE0EuIl7whLBT3fgeiMAo,24833
146
- execsql2-2.29.0.data/data/execsql2_extras/ss_glossary.sql,sha256=2gLxv34xzKt0vy7hSzJH7a9JiMC3ETrv9MofxQwAibU,13065
147
- execsql2-2.29.0.data/data/execsql2_extras/ss_upsert.sql,sha256=G_8rQ0VzuKIZHWs24O_WrfzpC5S27R1JsL-bFBR3SUQ,117730
148
- execsql2-2.29.0.dist-info/METADATA,sha256=eqv9-m8EsFEa1OBzwYfK66_d6vGY2Fv5BTmKyy1ashY,27854
149
- execsql2-2.29.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
150
- execsql2-2.29.0.dist-info/entry_points.txt,sha256=jOf53-4IVGjEZeNYUOF1GGaiPNfVZcNKxP3vDFKEyMA,58
151
- execsql2-2.29.0.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
152
- execsql2-2.29.0.dist-info/licenses/NOTICE,sha256=McYzgxYav3U1OaVsY4Su1sfBrfmplpRdA9b6-gCDQCg,342
153
- execsql2-2.29.0.dist-info/RECORD,,
136
+ execsql2-2.30.0.data/data/execsql2_extras/README.md,sha256=7SG9FbBpdqkgQTTt1aBTbCgymBZyV0rLrQMQrendzxs,5032
137
+ execsql2-2.30.0.data/data/execsql2_extras/config_settings.sqlite,sha256=aY5cxR7Q7J6zJ4bC9lu5mHUrhy211Cq3MNKPQVCt02E,20480
138
+ execsql2-2.30.0.data/data/execsql2_extras/example_config_prompt.sql,sha256=2e8KzzVWhho8KxYVHETSVmZdhW7wodioDsqBLSL6m4s,7487
139
+ execsql2-2.30.0.data/data/execsql2_extras/make_config_db.sql,sha256=WwyC6dK-Eh5CAVppiBCDHqiI1_wEI9U95Ytpr4lsZkg,8726
140
+ execsql2-2.30.0.data/data/execsql2_extras/md_compare.sql,sha256=qYYVAjSeHZzjszxV3Bv6bg8Ckbq2kMHl87_gh4sywMU,24140
141
+ execsql2-2.30.0.data/data/execsql2_extras/md_glossary.sql,sha256=hkZ2Onn57LAKKsuXxzhR8tPtcWXkmWEQkwPE58-Tm2k,10796
142
+ execsql2-2.30.0.data/data/execsql2_extras/md_upsert.sql,sha256=_CAK4BzEboRXTNy03SJR-oOjcEdSNMuRBPL6noWUptY,112560
143
+ execsql2-2.30.0.data/data/execsql2_extras/pg_compare.sql,sha256=1zJd4hVUKHR0tncc2qTBC9B4qVV4Us2ITkJpsjN3tMw,24352
144
+ execsql2-2.30.0.data/data/execsql2_extras/pg_glossary.sql,sha256=IKuwna-_8b20ljSkXZruuiQigrCpo7ueQdUqd1MXiuI,9908
145
+ execsql2-2.30.0.data/data/execsql2_extras/pg_upsert.sql,sha256=HpPJtTHvpEjQy03j-3iPxDEOHMRkudOg7O4D4YR38UI,108315
146
+ execsql2-2.30.0.data/data/execsql2_extras/script_template.sql,sha256=2J35ddZPguJ-vwTsz83wErv0jiWUyJcdW_JM0mNKDXA,11155
147
+ execsql2-2.30.0.data/data/execsql2_extras/ss_compare.sql,sha256=j1qVNUPXQsEU7-DoVgDJCGcE0EuIl7whLBT3fgeiMAo,24833
148
+ execsql2-2.30.0.data/data/execsql2_extras/ss_glossary.sql,sha256=2gLxv34xzKt0vy7hSzJH7a9JiMC3ETrv9MofxQwAibU,13065
149
+ execsql2-2.30.0.data/data/execsql2_extras/ss_upsert.sql,sha256=G_8rQ0VzuKIZHWs24O_WrfzpC5S27R1JsL-bFBR3SUQ,117730
150
+ execsql2-2.30.0.dist-info/METADATA,sha256=FvWAXbU-34Ip_HUkL7e3-OQ4HJdZUBNGPtgZF8wWz6M,27760
151
+ execsql2-2.30.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
152
+ execsql2-2.30.0.dist-info/entry_points.txt,sha256=jOf53-4IVGjEZeNYUOF1GGaiPNfVZcNKxP3vDFKEyMA,58
153
+ execsql2-2.30.0.dist-info/licenses/LICENSE.txt,sha256=LBdhuxejF8_bLCHZ2kWfmDXpDGUu914Gbd6_3JjCRe0,676
154
+ execsql2-2.30.0.dist-info/licenses/NOTICE,sha256=McYzgxYav3U1OaVsY4Su1sfBrfmplpRdA9b6-gCDQCg,342
155
+ execsql2-2.30.0.dist-info/RECORD,,