execsql2 2.17.0__tar.gz → 2.17.2__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 (344) hide show
  1. {execsql2-2.17.0 → execsql2-2.17.2}/.github/workflows/ci-cd.yml +90 -2
  2. execsql2-2.17.2/CHANGELOG.md +2477 -0
  3. execsql2-2.17.2/NOTICE +11 -0
  4. {execsql2-2.17.0 → execsql2-2.17.2}/PKG-INFO +42 -36
  5. {execsql2-2.17.0 → execsql2-2.17.2}/README.md +38 -35
  6. {execsql2-2.17.0 → execsql2-2.17.2}/docs/about/divergence.md +58 -105
  7. {execsql2-2.17.0 → execsql2-2.17.2}/docs/api/cli.md +4 -4
  8. {execsql2-2.17.0 → execsql2-2.17.2}/docs/api/exporters.md +2 -0
  9. {execsql2-2.17.0 → execsql2-2.17.2}/docs/api/metacommands.md +13 -1
  10. {execsql2-2.17.0 → execsql2-2.17.2}/docs/dev/adding_db_adapters.md +8 -6
  11. {execsql2-2.17.0 → execsql2-2.17.2}/docs/dev/adding_exporters.md +3 -3
  12. {execsql2-2.17.0 → execsql2-2.17.2}/docs/dev/adding_importers.md +6 -3
  13. {execsql2-2.17.0 → execsql2-2.17.2}/docs/dev/adding_metacommands.md +15 -13
  14. execsql2-2.17.2/docs/dev/architecture.md +335 -0
  15. execsql2-2.17.2/docs/getting-started/installation.md +42 -0
  16. {execsql2-2.17.0 → execsql2-2.17.2}/docs/getting-started/requirements.md +1 -3
  17. {execsql2-2.17.0 → execsql2-2.17.2}/docs/getting-started/syntax.md +34 -35
  18. {execsql2-2.17.0 → execsql2-2.17.2}/docs/guides/debugging.md +19 -20
  19. {execsql2-2.17.0 → execsql2-2.17.2}/docs/guides/documentation.md +1 -1
  20. {execsql2-2.17.0 → execsql2-2.17.2}/docs/guides/encoding.md +1 -1
  21. {execsql2-2.17.0 → execsql2-2.17.2}/docs/guides/formatter.md +11 -71
  22. {execsql2-2.17.0 → execsql2-2.17.2}/docs/guides/logging.md +21 -0
  23. {execsql2-2.17.0 → execsql2-2.17.2}/docs/guides/sql_syntax.md +3 -2
  24. {execsql2-2.17.0 → execsql2-2.17.2}/docs/guides/usage.md +13 -63
  25. {execsql2-2.17.0 → execsql2-2.17.2}/docs/guides/using_scripts.md +1 -1
  26. {execsql2-2.17.0 → execsql2-2.17.2}/docs/index.md +15 -15
  27. {execsql2-2.17.0 → execsql2-2.17.2}/docs/reference/configuration.md +12 -32
  28. {execsql2-2.17.0 → execsql2-2.17.2}/docs/reference/metacommands.md +62 -3
  29. {execsql2-2.17.0 → execsql2-2.17.2}/docs/reference/security.md +7 -59
  30. {execsql2-2.17.0 → execsql2-2.17.2}/docs/reference/substitution_vars.md +26 -27
  31. execsql2-2.17.2/examples/prompt_map_demo.sql +68 -0
  32. {execsql2-2.17.0 → execsql2-2.17.2}/extras/vscode-execsql/syntaxes/execsql.tmLanguage.json +25 -25
  33. {execsql2-2.17.0 → execsql2-2.17.2}/pyproject.toml +6 -17
  34. {execsql2-2.17.0 → execsql2-2.17.2}/scripts/generate_vscode_grammar.py +57 -55
  35. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/__init__.py +6 -2
  36. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/api.py +25 -6
  37. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/cli/__init__.py +5 -3
  38. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/cli/lint.py +30 -34
  39. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/cli/run.py +10 -0
  40. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/config.py +145 -92
  41. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/access.py +54 -40
  42. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/base.py +33 -6
  43. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/firebird.py +3 -1
  44. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/mysql.py +4 -3
  45. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/oracle.py +36 -14
  46. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/postgres.py +8 -6
  47. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/sqlite.py +5 -2
  48. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/sqlserver.py +8 -6
  49. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/debug/repl.py +59 -21
  50. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exceptions.py +19 -4
  51. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/base.py +3 -2
  52. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/delimited.py +2 -3
  53. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/feather.py +3 -3
  54. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/ods.py +1 -1
  55. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/xls.py +12 -4
  56. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/xlsx.py +1 -1
  57. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/gui/desktop.py +129 -15
  58. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/importers/__init__.py +1 -1
  59. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/importers/ods.py +1 -1
  60. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/importers/xls.py +1 -1
  61. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/__init__.py +34 -5
  62. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/conditions.py +26 -14
  63. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/connect.py +21 -14
  64. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/control.py +55 -68
  65. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/data.py +25 -9
  66. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/debug.py +132 -77
  67. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/io_export.py +14 -2
  68. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/io_import.py +11 -2
  69. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/io_write.py +113 -11
  70. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/prompt.py +46 -32
  71. execsql2-2.17.2/src/execsql/metacommands/script_ext.py +95 -0
  72. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/system.py +4 -3
  73. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/script/__init__.py +28 -37
  74. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/script/ast.py +7 -7
  75. execsql2-2.17.2/src/execsql/script/control.py +67 -0
  76. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/script/engine.py +37 -251
  77. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/script/executor.py +181 -222
  78. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/script/parser.py +1 -3
  79. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/script/variables.py +8 -3
  80. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/state.py +125 -37
  81. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/errors.py +0 -2
  82. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/fileio.py +47 -3
  83. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/mail.py +3 -2
  84. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/strings.py +5 -5
  85. {execsql2-2.17.0 → execsql2-2.17.2}/tests/cli/test_profile.py +14 -12
  86. execsql2-2.17.2/tests/db/test_access_windows.py +233 -0
  87. execsql2-2.17.2/tests/db/test_db_adapters_mocked_extra.py +403 -0
  88. execsql2-2.17.2/tests/db/test_mysql_inprocess.py +399 -0
  89. execsql2-2.17.2/tests/db/test_postgres_inprocess.py +583 -0
  90. execsql2-2.17.2/tests/db/test_sqlserver_inprocess.py +378 -0
  91. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_base.py +8 -6
  92. execsql2-2.17.2/tests/exporters/test_ods_export.py +316 -0
  93. execsql2-2.17.2/tests/gui/test_backends_extended.py +479 -0
  94. execsql2-2.17.2/tests/gui/test_desktop_dialogs.py +584 -0
  95. execsql2-2.17.2/tests/gui/test_tui_pilot.py +353 -0
  96. execsql2-2.17.2/tests/gui/test_tui_pilot_complex.py +279 -0
  97. execsql2-2.17.2/tests/gui/test_utils_gui_extended.py +467 -0
  98. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_breakpoint.py +6 -6
  99. execsql2-2.17.2/tests/metacommands/test_conditions_extra.py +251 -0
  100. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands.py +3 -5
  101. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands_data.py +12 -20
  102. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands_extended.py +100 -329
  103. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands_io.py +1 -5
  104. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands_io_write_extra.py +166 -27
  105. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands_script_ext.py +71 -70
  106. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands_system.py +6 -24
  107. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands_system_extra.py +2 -2
  108. execsql2-2.17.2/tests/metacommands/test_prompt.py +956 -0
  109. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_row_count.py +3 -5
  110. execsql2-2.17.2/tests/test_api_extended.py +186 -0
  111. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_debug_repl.py +7 -5
  112. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_engine.py +29 -161
  113. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_error_messages.py +5 -172
  114. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_executor.py +23 -0
  115. execsql2-2.17.2/tests/test_executor_inprocess.py +463 -0
  116. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_package.py +1 -1
  117. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_script.py +10 -119
  118. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_state.py +11 -90
  119. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_errors_extra.py +2 -2
  120. {execsql2-2.17.0 → execsql2-2.17.2}/uv.lock +222 -2
  121. {execsql2-2.17.0 → execsql2-2.17.2}/zensical.toml +5 -0
  122. execsql2-2.17.0/CHANGELOG.md +0 -2795
  123. execsql2-2.17.0/NOTICE +0 -10
  124. execsql2-2.17.0/docs/dev/architecture.md +0 -429
  125. execsql2-2.17.0/docs/getting-started/installation.md +0 -39
  126. execsql2-2.17.0/src/execsql/metacommands/script_ext.py +0 -66
  127. execsql2-2.17.0/src/execsql/script/control.py +0 -164
  128. {execsql2-2.17.0 → execsql2-2.17.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  129. {execsql2-2.17.0 → execsql2-2.17.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  130. {execsql2-2.17.0 → execsql2-2.17.2}/.gitignore +0 -0
  131. {execsql2-2.17.0 → execsql2-2.17.2}/.pre-commit-config.yaml +0 -0
  132. {execsql2-2.17.0 → execsql2-2.17.2}/.pre-commit-hooks.yaml +0 -0
  133. {execsql2-2.17.0 → execsql2-2.17.2}/.python-version +0 -0
  134. {execsql2-2.17.0 → execsql2-2.17.2}/.readthedocs.yaml +0 -0
  135. {execsql2-2.17.0 → execsql2-2.17.2}/CONTRIBUTING.md +0 -0
  136. {execsql2-2.17.0 → execsql2-2.17.2}/LICENSE.txt +0 -0
  137. {execsql2-2.17.0 → execsql2-2.17.2}/SECURITY.md +0 -0
  138. {execsql2-2.17.0 → execsql2-2.17.2}/docs/about/contributors.md +0 -0
  139. {execsql2-2.17.0 → execsql2-2.17.2}/docs/about/copyright.md +0 -0
  140. {execsql2-2.17.0 → execsql2-2.17.2}/docs/api/db.md +0 -0
  141. {execsql2-2.17.0 → execsql2-2.17.2}/docs/api/importers.md +0 -0
  142. {execsql2-2.17.0 → execsql2-2.17.2}/docs/api/index.md +0 -0
  143. {execsql2-2.17.0 → execsql2-2.17.2}/docs/guides/examples.md +0 -0
  144. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/Compare_planets.png +0 -0
  145. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/actions.png +0 -0
  146. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/actions2.png +0 -0
  147. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/checkboxes.png +0 -0
  148. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/connect.b64 +0 -0
  149. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/connect.png +0 -0
  150. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/create_conf.png +0 -0
  151. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/data_error1_screenshot.jpg +0 -0
  152. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/entry_form.png +0 -0
  153. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/execsql_console.png +0 -0
  154. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/execsql_logo_01.png +0 -0
  155. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/fatals.png +0 -0
  156. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/logo_small.png +0 -0
  157. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/pause_terminal.png +0 -0
  158. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/pause_terminal_sm.b64 +0 -0
  159. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/pause_terminal_sm.png +0 -0
  160. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/prompt_compare.png +0 -0
  161. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/set_build_commands.jpg +0 -0
  162. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/unit_conversions.b64 +0 -0
  163. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/unit_conversions_029.png +0 -0
  164. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/unmatched.png +0 -0
  165. {execsql2-2.17.0 → execsql2-2.17.2}/docs/images/vim_execsql_highlight.png +0 -0
  166. {execsql2-2.17.0 → execsql2-2.17.2}/extras/plugin-template/README.md +0 -0
  167. {execsql2-2.17.0 → execsql2-2.17.2}/extras/plugin-template/pyproject.toml +0 -0
  168. {execsql2-2.17.0 → execsql2-2.17.2}/extras/plugin-template/src/execsql_plugin_YOURNAME/__init__.py +0 -0
  169. {execsql2-2.17.0 → execsql2-2.17.2}/extras/plugin-template/tests/test_plugin.py.example +0 -0
  170. {execsql2-2.17.0 → execsql2-2.17.2}/extras/vscode-execsql/README.md +0 -0
  171. {execsql2-2.17.0 → execsql2-2.17.2}/extras/vscode-execsql/package.json +0 -0
  172. {execsql2-2.17.0 → execsql2-2.17.2}/justfile +0 -0
  173. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/__main__.py +0 -0
  174. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/cli/dsn.py +0 -0
  175. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/cli/help.py +0 -0
  176. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/cli/lint_ast.py +0 -0
  177. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/data/__init__.py +0 -0
  178. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/data/execsql.conf.template +0 -0
  179. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/__init__.py +0 -0
  180. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/dsn.py +0 -0
  181. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/duckdb.py +0 -0
  182. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/db/factory.py +0 -0
  183. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/debug/__init__.py +0 -0
  184. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/__init__.py +0 -0
  185. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/duckdb.py +0 -0
  186. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/html.py +0 -0
  187. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/json.py +0 -0
  188. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/latex.py +0 -0
  189. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/markdown.py +0 -0
  190. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/parquet.py +0 -0
  191. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/pretty.py +0 -0
  192. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/protocol.py +0 -0
  193. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/raw.py +0 -0
  194. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/sqlite.py +0 -0
  195. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/templates.py +0 -0
  196. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/values.py +0 -0
  197. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/xml.py +0 -0
  198. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/yaml.py +0 -0
  199. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/exporters/zip.py +0 -0
  200. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/format.py +0 -0
  201. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/gui/__init__.py +0 -0
  202. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/gui/base.py +0 -0
  203. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/gui/console.py +0 -0
  204. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/gui/tui.py +0 -0
  205. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/importers/base.py +0 -0
  206. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/importers/csv.py +0 -0
  207. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/importers/feather.py +0 -0
  208. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/importers/json.py +0 -0
  209. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/dispatch.py +0 -0
  210. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/io.py +0 -0
  211. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/io_fileops.py +0 -0
  212. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/metacommands/upsert.py +0 -0
  213. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/models.py +0 -0
  214. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/parser.py +0 -0
  215. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/plugins.py +0 -0
  216. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/py.typed +0 -0
  217. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/types.py +0 -0
  218. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/__init__.py +0 -0
  219. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/auth.py +0 -0
  220. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/crypto.py +0 -0
  221. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/datetime.py +0 -0
  222. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/gui.py +0 -0
  223. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/numeric.py +0 -0
  224. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/regex.py +0 -0
  225. {execsql2-2.17.0 → execsql2-2.17.2}/src/execsql/utils/timer.py +0 -0
  226. {execsql2-2.17.0 → execsql2-2.17.2}/templates/README.md +0 -0
  227. {execsql2-2.17.0 → execsql2-2.17.2}/templates/config_settings.sqlite +0 -0
  228. {execsql2-2.17.0 → execsql2-2.17.2}/templates/example_config_prompt.sql +0 -0
  229. {execsql2-2.17.0 → execsql2-2.17.2}/templates/execsql.conf +0 -0
  230. {execsql2-2.17.0 → execsql2-2.17.2}/templates/make_config_db.sql +0 -0
  231. {execsql2-2.17.0 → execsql2-2.17.2}/templates/md_compare.sql +0 -0
  232. {execsql2-2.17.0 → execsql2-2.17.2}/templates/md_glossary.sql +0 -0
  233. {execsql2-2.17.0 → execsql2-2.17.2}/templates/md_upsert.sql +0 -0
  234. {execsql2-2.17.0 → execsql2-2.17.2}/templates/pg_compare.sql +0 -0
  235. {execsql2-2.17.0 → execsql2-2.17.2}/templates/pg_glossary.sql +0 -0
  236. {execsql2-2.17.0 → execsql2-2.17.2}/templates/pg_upsert.sql +0 -0
  237. {execsql2-2.17.0 → execsql2-2.17.2}/templates/script_template.sql +0 -0
  238. {execsql2-2.17.0 → execsql2-2.17.2}/templates/ss_compare.sql +0 -0
  239. {execsql2-2.17.0 → execsql2-2.17.2}/templates/ss_glossary.sql +0 -0
  240. {execsql2-2.17.0 → execsql2-2.17.2}/templates/ss_upsert.sql +0 -0
  241. {execsql2-2.17.0 → execsql2-2.17.2}/tests/__init__.py +0 -0
  242. {execsql2-2.17.0 → execsql2-2.17.2}/tests/cli/__init__.py +0 -0
  243. {execsql2-2.17.0 → execsql2-2.17.2}/tests/cli/test_cli.py +0 -0
  244. {execsql2-2.17.0 → execsql2-2.17.2}/tests/cli/test_cli_e2e.py +0 -0
  245. {execsql2-2.17.0 → execsql2-2.17.2}/tests/cli/test_cli_run.py +0 -0
  246. {execsql2-2.17.0 → execsql2-2.17.2}/tests/cli/test_lint.py +0 -0
  247. {execsql2-2.17.0 → execsql2-2.17.2}/tests/cli/test_ping.py +0 -0
  248. {execsql2-2.17.0 → execsql2-2.17.2}/tests/conftest.py +0 -0
  249. {execsql2-2.17.0 → execsql2-2.17.2}/tests/db/__init__.py +0 -0
  250. {execsql2-2.17.0 → execsql2-2.17.2}/tests/db/test_base.py +0 -0
  251. {execsql2-2.17.0 → execsql2-2.17.2}/tests/db/test_db_adapters_mocked.py +0 -0
  252. {execsql2-2.17.0 → execsql2-2.17.2}/tests/db/test_dsn.py +0 -0
  253. {execsql2-2.17.0 → execsql2-2.17.2}/tests/db/test_duckdb.py +0 -0
  254. {execsql2-2.17.0 → execsql2-2.17.2}/tests/db/test_factory.py +0 -0
  255. {execsql2-2.17.0 → execsql2-2.17.2}/tests/db/test_postgres.py +0 -0
  256. {execsql2-2.17.0 → execsql2-2.17.2}/tests/db/test_sqlite.py +0 -0
  257. {execsql2-2.17.0 → execsql2-2.17.2}/tests/db/test_sqlite_extra.py +0 -0
  258. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/__init__.py +0 -0
  259. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_db.py +0 -0
  260. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_delimited.py +0 -0
  261. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_duckdb_exporter.py +0 -0
  262. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_exporters.py +0 -0
  263. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_feather.py +0 -0
  264. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_html_extended.py +0 -0
  265. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_html_latex.py +0 -0
  266. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_json.py +0 -0
  267. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_json_extended.py +0 -0
  268. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_latex_extended.py +0 -0
  269. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_markdown.py +0 -0
  270. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_ods.py +0 -0
  271. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_parquet.py +0 -0
  272. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_pretty_extended.py +0 -0
  273. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_raw_extended.py +0 -0
  274. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_sqlite_exporter.py +0 -0
  275. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_templates.py +0 -0
  276. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_templates_extended.py +0 -0
  277. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_values_extended.py +0 -0
  278. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_xls_xlsx.py +0 -0
  279. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_xlsx.py +0 -0
  280. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_xml.py +0 -0
  281. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_yaml.py +0 -0
  282. {execsql2-2.17.0 → execsql2-2.17.2}/tests/exporters/test_zip.py +0 -0
  283. {execsql2-2.17.0 → execsql2-2.17.2}/tests/gui/__init__.py +0 -0
  284. {execsql2-2.17.0 → execsql2-2.17.2}/tests/gui/test_backends.py +0 -0
  285. {execsql2-2.17.0 → execsql2-2.17.2}/tests/gui/test_compare_stats.py +0 -0
  286. {execsql2-2.17.0 → execsql2-2.17.2}/tests/gui/test_compute_row_diffs.py +0 -0
  287. {execsql2-2.17.0 → execsql2-2.17.2}/tests/importers/__init__.py +0 -0
  288. {execsql2-2.17.0 → execsql2-2.17.2}/tests/importers/test_base_extended.py +0 -0
  289. {execsql2-2.17.0 → execsql2-2.17.2}/tests/importers/test_csv_edge_cases.py +0 -0
  290. {execsql2-2.17.0 → execsql2-2.17.2}/tests/importers/test_csv_importer.py +0 -0
  291. {execsql2-2.17.0 → execsql2-2.17.2}/tests/importers/test_feather_importer.py +0 -0
  292. {execsql2-2.17.0 → execsql2-2.17.2}/tests/importers/test_json_importer.py +0 -0
  293. {execsql2-2.17.0 → execsql2-2.17.2}/tests/importers/test_ods_importer.py +0 -0
  294. {execsql2-2.17.0 → execsql2-2.17.2}/tests/importers/test_xls_importer.py +0 -0
  295. {execsql2-2.17.0 → execsql2-2.17.2}/tests/integration/__init__.py +0 -0
  296. {execsql2-2.17.0 → execsql2-2.17.2}/tests/integration/conftest.py +0 -0
  297. {execsql2-2.17.0 → execsql2-2.17.2}/tests/integration/test_dsn.py +0 -0
  298. {execsql2-2.17.0 → execsql2-2.17.2}/tests/integration/test_duckdb.py +0 -0
  299. {execsql2-2.17.0 → execsql2-2.17.2}/tests/integration/test_mysql.py +0 -0
  300. {execsql2-2.17.0 → execsql2-2.17.2}/tests/integration/test_postgres.py +0 -0
  301. {execsql2-2.17.0 → execsql2-2.17.2}/tests/integration/test_sqlite.py +0 -0
  302. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/__init__.py +0 -0
  303. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_assert.py +0 -0
  304. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_connect.py +0 -0
  305. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_io_export.py +0 -0
  306. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_io_import.py +0 -0
  307. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands_connect.py +0 -0
  308. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_metacommands_fileops_extra.py +0 -0
  309. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_pg_upsert.py +0 -0
  310. {execsql2-2.17.0 → execsql2-2.17.2}/tests/metacommands/test_show_scripts.py +0 -0
  311. {execsql2-2.17.0 → execsql2-2.17.2}/tests/scripts/__init__.py +0 -0
  312. {execsql2-2.17.0 → execsql2-2.17.2}/tests/scripts/fixtures/control_flow.sql +0 -0
  313. {execsql2-2.17.0 → execsql2-2.17.2}/tests/scripts/fixtures/io_roundtrip.sql +0 -0
  314. {execsql2-2.17.0 → execsql2-2.17.2}/tests/scripts/fixtures/parse_only/parse_tree.sql +0 -0
  315. {execsql2-2.17.0 → execsql2-2.17.2}/tests/scripts/fixtures/smoke.sql +0 -0
  316. {execsql2-2.17.0 → execsql2-2.17.2}/tests/scripts/test_sql_scripts.py +0 -0
  317. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_api.py +0 -0
  318. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_ast.py +0 -0
  319. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_ast_parser.py +0 -0
  320. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_config.py +0 -0
  321. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_config_data.py +0 -0
  322. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_config_extended.py +0 -0
  323. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_exceptions.py +0 -0
  324. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_format.py +0 -0
  325. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_mail.py +0 -0
  326. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_models.py +0 -0
  327. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_parser.py +0 -0
  328. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_parser_params.py +0 -0
  329. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_plugins.py +0 -0
  330. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_registry.py +0 -0
  331. {execsql2-2.17.0 → execsql2-2.17.2}/tests/test_types.py +0 -0
  332. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/__init__.py +0 -0
  333. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_auth.py +0 -0
  334. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_auth_extra.py +0 -0
  335. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_crypto.py +0 -0
  336. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_datetime.py +0 -0
  337. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_errors.py +0 -0
  338. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_fileio.py +0 -0
  339. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_fileio_extra.py +0 -0
  340. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_numeric.py +0 -0
  341. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_regex.py +0 -0
  342. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_strings.py +0 -0
  343. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_timer.py +0 -0
  344. {execsql2-2.17.0 → execsql2-2.17.2}/tests/utils/test_timer_extra.py +0 -0
@@ -69,9 +69,19 @@ jobs:
69
69
  - name: Install tkinter (Ubuntu)
70
70
  if: runner.os == 'Linux'
71
71
  run: sudo apt-get install -y python3-tk
72
+ - name: Install unixodbc (macOS)
73
+ # tox installs the [all] extra which pulls in pyodbc; pyodbc's
74
+ # native .so depends on libodbc.2.dylib from the unixodbc
75
+ # package, otherwise importing it fails and any DSN test bails.
76
+ if: runner.os == 'macOS'
77
+ run: brew install unixodbc
72
78
  - name: Test with tox
73
79
  env:
74
80
  DISPLAY: ""
81
+ # Ubuntu finishes in ~9 min and Windows in ~16 min; 30 leaves
82
+ # ample headroom. Step-level timeout fails the step (not the
83
+ # job), so continue-on-error can mask it on macOS.
84
+ timeout-minutes: 30
75
85
  run: |
76
86
  tox -e py
77
87
  - name: Upload coverage to Codecov
@@ -115,6 +125,18 @@ jobs:
115
125
  options: >-
116
126
  --health-cmd "mysqladmin ping" --health-interval 10s
117
127
  --health-timeout 5s --health-retries 5
128
+ sqlserver:
129
+ image: mcr.microsoft.com/mssql/server:2022-latest
130
+ env:
131
+ ACCEPT_EULA: "Y"
132
+ MSSQL_SA_PASSWORD: "ExecSql_Test123!"
133
+ MSSQL_PID: "Developer"
134
+ ports:
135
+ - 1433:1433
136
+ options: >-
137
+ --health-cmd "/opt/mssql-tools18/bin/sqlcmd
138
+ -S localhost -U sa -P 'ExecSql_Test123!' -Q 'SELECT 1' -No || exit 1"
139
+ --health-interval 10s --health-timeout 5s --health-retries 20
118
140
  steps:
119
141
  - name: Check out repository code
120
142
  uses: actions/checkout@v6
@@ -122,13 +144,79 @@ jobs:
122
144
  uses: actions/setup-python@v6
123
145
  with:
124
146
  python-version: ${{ matrix.python-version }}
147
+ - name: Install tkinter (Ubuntu)
148
+ run: sudo apt-get update && sudo apt-get install -y python3-tk
149
+ - name: Install Microsoft ODBC Driver 18 for SQL Server
150
+ run: |
151
+ curl https://packages.microsoft.com/keys/microsoft.asc | sudo tee /etc/apt/trusted.gpg.d/microsoft.asc > /dev/null
152
+ curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list
153
+ sudo apt-get update
154
+ sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 unixodbc-dev
155
+ odbcinst -j
156
+ odbcinst -q -d
125
157
  - name: Install dependencies
126
158
  run: |
127
159
  python -m pip install --upgrade pip
128
- python -m pip install ".[dev,postgres,mysql]"
129
- - name: Run integration tests
160
+ python -m pip install ".[dev,postgres,mysql,mssql]"
161
+ - name: Run subprocess integration tests
130
162
  run: |
131
163
  python -m pytest tests/integration/test_postgres.py tests/integration/test_mysql.py -v --override-ini="addopts="
164
+ - name: Run in-process DB adapter tests with 86% coverage floor
165
+ env:
166
+ DISPLAY: ""
167
+ run: |
168
+ python -m pytest --cov=execsql --cov-branch --cov-report=xml --cov-fail-under=86
169
+ - name: Upload coverage to Codecov
170
+ uses: codecov/codecov-action@v6
171
+ with:
172
+ token: ${{ secrets.CODECOV_TOKEN }}
173
+ files: coverage.xml
174
+
175
+ access-tests-windows:
176
+ name: access-tests-windows
177
+ runs-on: windows-latest
178
+ # Best-effort: Access Database Engine install can be flaky on hosted
179
+ # runners. Failures don't gate the rest of the pipeline.
180
+ continue-on-error: true
181
+ strategy:
182
+ fail-fast: false
183
+ matrix:
184
+ python-version:
185
+ - "3.13"
186
+ permissions:
187
+ contents: read
188
+ steps:
189
+ - uses: actions/checkout@v6
190
+ - uses: actions/setup-python@v6
191
+ with:
192
+ python-version: ${{ matrix.python-version }}
193
+ - name: Install Microsoft Access Database Engine 2016 (x64)
194
+ # The chocolatey `accessdatabaseengine-x64` package was removed
195
+ # from the community feed; download the redistributable directly
196
+ # from Microsoft and run it silently instead.
197
+ run: |
198
+ $ErrorActionPreference = 'Stop'
199
+ $url = 'https://download.microsoft.com/download/3/5/C/35C84C36-661A-44E6-9324-8786B8DBE231/AccessDatabaseEngine_X64.exe'
200
+ $dst = Join-Path $env:RUNNER_TEMP 'AccessDatabaseEngine_X64.exe'
201
+ Write-Host "Downloading $url"
202
+ Invoke-WebRequest -Uri $url -OutFile $dst -UseBasicParsing
203
+ Write-Host "Installing $dst"
204
+ $proc = Start-Process -FilePath $dst -ArgumentList '/quiet','/norestart' -Wait -PassThru
205
+ Write-Host "Installer exit code: $($proc.ExitCode)"
206
+ # 0 = success, 3010 = success but reboot pending. Anything else is a failure.
207
+ if ($proc.ExitCode -ne 0 -and $proc.ExitCode -ne 3010) { exit $proc.ExitCode }
208
+ shell: pwsh
209
+ - name: Install Python dependencies
210
+ run: |
211
+ python -m pip install --upgrade pip
212
+ python -m pip install ".[dev,odbc]" pywin32
213
+ shell: pwsh
214
+ - name: Run Access real-driver tests
215
+ env:
216
+ DISPLAY: ""
217
+ run: |
218
+ python -m pytest tests/db/test_access_windows.py -v --override-ini="addopts="
219
+ shell: pwsh
132
220
 
133
221
  build:
134
222
  name: Build distribution 📦