execsql2 2.0.1__tar.gz → 2.1.1__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 (244) hide show
  1. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/agents/changelog-manager.md +1 -1
  2. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/agents/code-oracle.md +1 -1
  3. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/agents/code-reviewer.md +1 -1
  4. execsql2-2.1.1/.claude/agents/docs-author.md +236 -0
  5. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/agents/migration-coder.md +1 -1
  6. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/agents/monolith-navigator.md +1 -1
  7. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/agents/test-engineer.md +1 -1
  8. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/project_context.md +65 -7
  9. {execsql2-2.0.1 → execsql2-2.1.1}/.github/workflows/ci-cd.yml +6 -0
  10. {execsql2-2.0.1 → execsql2-2.1.1}/.gitignore +2 -0
  11. {execsql2-2.0.1 → execsql2-2.1.1}/.readthedocs.yaml +2 -0
  12. execsql2-2.1.1/CHANGELOG.md +1758 -0
  13. execsql2-2.1.1/PKG-INFO +295 -0
  14. execsql2-2.1.1/README.md +195 -0
  15. execsql2-2.1.1/docs/api/cli.md +21 -0
  16. execsql2-2.1.1/docs/api/db.md +15 -0
  17. execsql2-2.1.1/docs/api/exporters.md +39 -0
  18. execsql2-2.1.1/docs/api/importers.md +21 -0
  19. execsql2-2.1.1/docs/api/index.md +22 -0
  20. execsql2-2.1.1/docs/api/metacommands.md +29 -0
  21. execsql2-2.0.1/CHANGELOG.md → execsql2-2.1.1/docs/change_log.md +139 -1
  22. {execsql2-2.0.1 → execsql2-2.1.1}/docs/configuration.md +82 -52
  23. {execsql2-2.0.1 → execsql2-2.1.1}/docs/copyright.md +4 -2
  24. {execsql2-2.0.1 → execsql2-2.1.1}/docs/debugging.md +1 -1
  25. execsql2-2.1.1/docs/dev/adding_db_adapters.md +234 -0
  26. execsql2-2.1.1/docs/dev/adding_exporters.md +192 -0
  27. execsql2-2.1.1/docs/dev/adding_importers.md +170 -0
  28. execsql2-2.1.1/docs/dev/adding_metacommands.md +237 -0
  29. {execsql2-2.0.1 → execsql2-2.1.1}/docs/examples.md +6 -6
  30. execsql2-2.1.1/docs/formatter.md +169 -0
  31. {execsql2-2.0.1 → execsql2-2.1.1}/docs/index.md +3 -3
  32. {execsql2-2.0.1 → execsql2-2.1.1}/docs/installation.md +5 -2
  33. {execsql2-2.0.1 → execsql2-2.1.1}/docs/logging.md +2 -2
  34. {execsql2-2.0.1 → execsql2-2.1.1}/docs/metacommands.md +10 -26
  35. execsql2-2.1.1/docs/requirements.md +70 -0
  36. {execsql2-2.0.1 → execsql2-2.1.1}/docs/substitution_vars.md +11 -0
  37. execsql2-2.1.1/docs/syntax.md +194 -0
  38. {execsql2-2.0.1 → execsql2-2.1.1}/docs/usage.md +4 -13
  39. {execsql2-2.0.1 → execsql2-2.1.1}/justfile +2 -0
  40. {execsql2-2.0.1 → execsql2-2.1.1}/pyproject.toml +88 -35
  41. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/cli.py +322 -108
  42. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/config.py +134 -114
  43. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/access.py +89 -65
  44. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/base.py +97 -68
  45. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/dsn.py +45 -29
  46. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/duckdb.py +4 -5
  47. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/factory.py +27 -27
  48. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/firebird.py +30 -18
  49. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/mysql.py +38 -14
  50. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/oracle.py +58 -33
  51. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/postgres.py +68 -28
  52. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/sqlite.py +36 -27
  53. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/sqlserver.py +45 -30
  54. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exceptions.py +68 -64
  55. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/__init__.py +1 -1
  56. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/base.py +42 -17
  57. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/delimited.py +60 -59
  58. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/duckdb.py +8 -12
  59. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/feather.py +32 -24
  60. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/html.py +33 -30
  61. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/json.py +18 -17
  62. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/latex.py +11 -13
  63. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/ods.py +50 -46
  64. execsql2-2.1.1/src/execsql/exporters/parquet.py +32 -0
  65. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/pretty.py +16 -15
  66. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/raw.py +9 -11
  67. execsql2-2.1.1/src/execsql/exporters/sqlite.py +82 -0
  68. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/templates.py +15 -72
  69. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/values.py +13 -12
  70. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/xls.py +26 -26
  71. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/xml.py +12 -12
  72. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/exporters/zip.py +0 -3
  73. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/gui/__init__.py +2 -2
  74. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/gui/console.py +0 -1
  75. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/gui/desktop.py +6 -7
  76. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/gui/tui.py +8 -14
  77. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/importers/base.py +6 -9
  78. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/importers/csv.py +10 -17
  79. execsql2-2.1.1/src/execsql/importers/feather.py +61 -0
  80. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/importers/ods.py +3 -4
  81. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/importers/xls.py +5 -6
  82. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/__init__.py +8 -8
  83. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/conditions.py +41 -33
  84. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/connect.py +113 -99
  85. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/control.py +38 -26
  86. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/data.py +35 -33
  87. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/debug.py +13 -9
  88. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/io.py +288 -229
  89. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/prompt.py +179 -157
  90. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/script_ext.py +11 -9
  91. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/metacommands/system.py +44 -25
  92. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/models.py +9 -16
  93. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/parser.py +10 -10
  94. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/script.py +183 -157
  95. execsql2-2.1.1/src/execsql/state.py +339 -0
  96. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/types.py +46 -81
  97. execsql2-2.1.1/src/execsql/utils/auth.py +193 -0
  98. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/crypto.py +31 -4
  99. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/datetime.py +7 -7
  100. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/errors.py +34 -29
  101. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/fileio.py +90 -55
  102. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/gui.py +22 -23
  103. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/mail.py +15 -17
  104. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/numeric.py +2 -3
  105. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/regex.py +9 -12
  106. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/strings.py +10 -12
  107. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/timer.py +0 -2
  108. {execsql2-2.0.1 → execsql2-2.1.1}/templates/execsql.conf +1 -1
  109. execsql2-2.1.1/tests/conftest.py +88 -0
  110. {execsql2-2.0.1 → execsql2-2.1.1}/tests/db/test_base.py +179 -0
  111. execsql2-2.1.1/tests/db/test_postgres.py +88 -0
  112. {execsql2-2.0.1 → execsql2-2.1.1}/tests/db/test_sqlite.py +21 -2
  113. {execsql2-2.0.1 → execsql2-2.1.1}/tests/exporters/test_base.py +42 -9
  114. {execsql2-2.0.1 → execsql2-2.1.1}/tests/exporters/test_db.py +0 -1
  115. {execsql2-2.0.1 → execsql2-2.1.1}/tests/exporters/test_delimited.py +146 -5
  116. execsql2-2.1.1/tests/exporters/test_duckdb_exporter.py +145 -0
  117. {execsql2-2.0.1 → execsql2-2.1.1}/tests/exporters/test_exporters.py +39 -4
  118. execsql2-2.1.1/tests/exporters/test_feather.py +62 -0
  119. {execsql2-2.0.1 → execsql2-2.1.1}/tests/exporters/test_html_latex.py +1 -2
  120. execsql2-2.1.1/tests/exporters/test_json.py +163 -0
  121. execsql2-2.1.1/tests/exporters/test_ods.py +231 -0
  122. execsql2-2.1.1/tests/exporters/test_parquet.py +62 -0
  123. execsql2-2.1.1/tests/exporters/test_sqlite_exporter.py +141 -0
  124. execsql2-2.1.1/tests/exporters/test_templates.py +204 -0
  125. execsql2-2.1.1/tests/exporters/test_xls_xlsx.py +240 -0
  126. execsql2-2.1.1/tests/exporters/test_xml.py +138 -0
  127. {execsql2-2.0.1 → execsql2-2.1.1}/tests/exporters/test_zip.py +0 -1
  128. {execsql2-2.0.1 → execsql2-2.1.1}/tests/gui/test_backends.py +46 -10
  129. {execsql2-2.0.1 → execsql2-2.1.1}/tests/importers/test_csv_importer.py +0 -2
  130. execsql2-2.1.1/tests/importers/test_feather_importer.py +136 -0
  131. execsql2-2.1.1/tests/importers/test_ods_importer.py +159 -0
  132. execsql2-2.1.1/tests/importers/test_xls_importer.py +184 -0
  133. {execsql2-2.0.1/tests → execsql2-2.1.1/tests/metacommands}/test_metacommands.py +14 -14
  134. execsql2-2.1.1/tests/metacommands/test_metacommands_connect.py +326 -0
  135. execsql2-2.1.1/tests/metacommands/test_metacommands_extended.py +1941 -0
  136. execsql2-2.1.1/tests/metacommands/test_metacommands_io.py +423 -0
  137. execsql2-2.1.1/tests/metacommands/test_metacommands_script_ext.py +195 -0
  138. execsql2-2.1.1/tests/metacommands/test_metacommands_system.py +375 -0
  139. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_cli.py +222 -0
  140. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_config.py +0 -3
  141. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_config_data.py +614 -1
  142. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_constants.py +0 -1
  143. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_exceptions.py +16 -0
  144. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_format.py +4 -13
  145. execsql2-2.1.1/tests/test_integration.py +422 -0
  146. execsql2-2.1.1/tests/test_mail.py +238 -0
  147. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_models.py +89 -8
  148. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_package.py +17 -0
  149. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_parser.py +147 -17
  150. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_script.py +103 -1
  151. execsql2-2.1.1/tests/test_types.py +833 -0
  152. execsql2-2.1.1/tests/utils/__init__.py +0 -0
  153. execsql2-2.1.1/tests/utils/test_auth.py +138 -0
  154. {execsql2-2.0.1 → execsql2-2.1.1}/tests/utils/test_crypto.py +0 -1
  155. {execsql2-2.0.1 → execsql2-2.1.1}/tests/utils/test_datetime.py +0 -1
  156. {execsql2-2.0.1 → execsql2-2.1.1}/tests/utils/test_errors.py +161 -2
  157. execsql2-2.1.1/tests/utils/test_fileio.py +300 -0
  158. {execsql2-2.0.1 → execsql2-2.1.1}/tests/utils/test_numeric.py +1 -0
  159. {execsql2-2.0.1 → execsql2-2.1.1}/tests/utils/test_strings.py +1 -1
  160. {execsql2-2.0.1 → execsql2-2.1.1}/tests/utils/test_timer.py +1 -2
  161. {execsql2-2.0.1 → execsql2-2.1.1}/uv.lock +564 -28
  162. {execsql2-2.0.1 → execsql2-2.1.1}/zensical.toml +25 -1
  163. execsql2-2.0.1/.claude/agents/docs-author.md +0 -112
  164. execsql2-2.0.1/PKG-INFO +0 -406
  165. execsql2-2.0.1/README.md +0 -320
  166. execsql2-2.0.1/docs/change_log.md +0 -1
  167. execsql2-2.0.1/docs/requirements.md +0 -28
  168. execsql2-2.0.1/docs/syntax.md +0 -141
  169. execsql2-2.0.1/src/execsql/exporters/sqlite.py +0 -82
  170. execsql2-2.0.1/src/execsql/importers/feather.py +0 -67
  171. execsql2-2.0.1/src/execsql/state.py +0 -377
  172. execsql2-2.0.1/src/execsql/utils/auth.py +0 -93
  173. execsql2-2.0.1/tests/conftest.py +0 -68
  174. execsql2-2.0.1/tests/test_types.py +0 -432
  175. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/commands/code-oracle.md +0 -0
  176. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/commands/migrate.md +0 -0
  177. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/commands/review-changes.md +0 -0
  178. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/commands/test-module.md +0 -0
  179. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/commands/update-changelog.md +0 -0
  180. {execsql2-2.0.1 → execsql2-2.1.1}/.claude/commands/where-is.md +0 -0
  181. {execsql2-2.0.1 → execsql2-2.1.1}/.pre-commit-config.yaml +0 -0
  182. {execsql2-2.0.1 → execsql2-2.1.1}/.python-version +0 -0
  183. {execsql2-2.0.1 → execsql2-2.1.1}/CONTRIBUTING.md +0 -0
  184. {execsql2-2.0.1 → execsql2-2.1.1}/LICENSE.txt +0 -0
  185. {execsql2-2.0.1 → execsql2-2.1.1}/NOTICE +0 -0
  186. {execsql2-2.0.1 → execsql2-2.1.1}/docs/contributors.md +0 -0
  187. {execsql2-2.0.1 → execsql2-2.1.1}/docs/documentation.md +0 -0
  188. {execsql2-2.0.1 → execsql2-2.1.1}/docs/encoding.md +0 -0
  189. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/Compare_planets.png +0 -0
  190. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/actions.png +0 -0
  191. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/actions2.png +0 -0
  192. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/checkboxes.png +0 -0
  193. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/connect.b64 +0 -0
  194. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/connect.png +0 -0
  195. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/create_conf.png +0 -0
  196. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/data_error1_screenshot.jpg +0 -0
  197. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/entry_form.png +0 -0
  198. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/execsql_console.png +0 -0
  199. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/execsql_logo_01.png +0 -0
  200. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/fatals.png +0 -0
  201. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/logo_small.png +0 -0
  202. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/pause_terminal.png +0 -0
  203. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/pause_terminal_sm.b64 +0 -0
  204. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/pause_terminal_sm.png +0 -0
  205. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/prompt_compare.png +0 -0
  206. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/set_build_commands.jpg +0 -0
  207. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/unit_conversions.b64 +0 -0
  208. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/unit_conversions_029.png +0 -0
  209. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/unmatched.png +0 -0
  210. {execsql2-2.0.1 → execsql2-2.1.1}/docs/images/vim_execsql_highlight.png +0 -0
  211. {execsql2-2.0.1 → execsql2-2.1.1}/docs/sql_syntax.md +0 -0
  212. {execsql2-2.0.1 → execsql2-2.1.1}/docs/using_scripts.md +0 -0
  213. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/__init__.py +0 -0
  214. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/__main__.py +0 -0
  215. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/constants.py +0 -0
  216. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/db/__init__.py +0 -0
  217. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/format.py +0 -0
  218. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/gui/base.py +0 -0
  219. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/importers/__init__.py +0 -0
  220. {execsql2-2.0.1 → execsql2-2.1.1}/src/execsql/utils/__init__.py +0 -0
  221. {execsql2-2.0.1 → execsql2-2.1.1}/templates/READ_ME.rst +0 -0
  222. {execsql2-2.0.1 → execsql2-2.1.1}/templates/config_settings.sqlite +0 -0
  223. {execsql2-2.0.1 → execsql2-2.1.1}/templates/example_config_prompt.sql +0 -0
  224. {execsql2-2.0.1 → execsql2-2.1.1}/templates/make_config_db.sql +0 -0
  225. {execsql2-2.0.1 → execsql2-2.1.1}/templates/md_compare.sql +0 -0
  226. {execsql2-2.0.1 → execsql2-2.1.1}/templates/md_glossary.sql +0 -0
  227. {execsql2-2.0.1 → execsql2-2.1.1}/templates/md_upsert.sql +0 -0
  228. {execsql2-2.0.1 → execsql2-2.1.1}/templates/pg_compare.sql +0 -0
  229. {execsql2-2.0.1 → execsql2-2.1.1}/templates/pg_glossary.sql +0 -0
  230. {execsql2-2.0.1 → execsql2-2.1.1}/templates/pg_upsert.sql +0 -0
  231. {execsql2-2.0.1 → execsql2-2.1.1}/templates/script_template.sql +0 -0
  232. {execsql2-2.0.1 → execsql2-2.1.1}/templates/ss_compare.sql +0 -0
  233. {execsql2-2.0.1 → execsql2-2.1.1}/templates/ss_glossary.sql +0 -0
  234. {execsql2-2.0.1 → execsql2-2.1.1}/templates/ss_upsert.sql +0 -0
  235. {execsql2-2.0.1 → execsql2-2.1.1}/tests/__init__.py +0 -0
  236. {execsql2-2.0.1 → execsql2-2.1.1}/tests/db/__init__.py +0 -0
  237. {execsql2-2.0.1 → execsql2-2.1.1}/tests/db/test_duckdb.py +0 -0
  238. {execsql2-2.0.1 → execsql2-2.1.1}/tests/db/test_factory.py +0 -0
  239. {execsql2-2.0.1 → execsql2-2.1.1}/tests/exporters/__init__.py +0 -0
  240. {execsql2-2.0.1 → execsql2-2.1.1}/tests/gui/__init__.py +0 -0
  241. {execsql2-2.0.1 → execsql2-2.1.1}/tests/importers/__init__.py +0 -0
  242. {execsql2-2.0.1/tests/utils → execsql2-2.1.1/tests/metacommands}/__init__.py +0 -0
  243. {execsql2-2.0.1 → execsql2-2.1.1}/tests/test_state.py +0 -0
  244. {execsql2-2.0.1 → execsql2-2.1.1}/tests/utils/test_regex.py +0 -0
@@ -1,6 +1,6 @@
1
1
  ______________________________________________________________________
2
2
 
3
- ## name: changelog-manager description: Maintains CHANGELOG.md for execsql2. Reads git history and staged changes to write accurate, user-facing changelog entries following Keep a Changelog format. Always reads the existing changelog before writing anything. tools: Grep, Glob, Read, Edit, Bash model: sonnet color: orange
3
+ ## name: changelog-manager description: Maintains CHANGELOG.md for execsql2. Reads git history and staged changes to write accurate, user-facing changelog entries following Keep a Changelog format. Always reads the existing changelog before writing anything. tools: [Grep, Glob, Read, Edit, Bash] model: sonnet color: orange
4
4
 
5
5
  You are the changelog steward for execsql2. Your job is to keep `CHANGELOG.md` accurate, consistent, and useful to end users — people who run `execsql` scripts, not Python developers reading source code.
6
6
 
@@ -1,6 +1,6 @@
1
1
  ______________________________________________________________________
2
2
 
3
- ## name: code-oracle description: Expert navigator of the src/execsql/ modular codebase. Answers architectural, structural, and behavioral questions with precise file paths, line numbers, call chains, and design rationale. Read-only — never modifies files. tools: Grep, Glob, Read model: sonnet color: cyan
3
+ ## name: code-oracle description: Expert navigator of the src/execsql/ modular codebase. Answers architectural, structural, and behavioral questions with precise file paths, line numbers, call chains, and design rationale. Read-only — never modifies files. tools: [Grep, Glob, Read] model: sonnet color: cyan
4
4
 
5
5
  You are a senior Python engineer and data systems expert embedded in the execsql2 project. Your role is to answer any technical question about the `src/execsql/` codebase with precision — exact file locations, line numbers, call chains, and the reasoning behind design decisions.
6
6
 
@@ -1,6 +1,6 @@
1
1
  ______________________________________________________________________
2
2
 
3
- ## name: code-reviewer description: Reviews execsql2 code changes for migration correctness, ruff compliance, test adequacy, and architectural consistency. Read-only — produces a prioritized findings report, never edits files. tools: Grep, Glob, Read, Bash model: sonnet color: red
3
+ ## name: code-reviewer description: Reviews execsql2 code changes for migration correctness, ruff compliance, test adequacy, and architectural consistency. Read-only — produces a prioritized findings report, never edits files. tools: [Grep, Glob, Read, Bash] model: sonnet color: red
4
4
 
5
5
  You are a senior code reviewer for the execsql2 project. You review code with high standards: correctness, maintainability, security, and fidelity to both the original monolith's behavior and the project's conventions.
6
6
 
@@ -0,0 +1,236 @@
1
+ ______________________________________________________________________
2
+
3
+ ## name: docs-author description: Writes and updates MkDocs documentation for execsql2. Matches existing doc style, uses correct anchor syntax, and writes for end users not developers. Reads existing docs and zensical.toml before writing. tools: [Grep, Glob, Read, Edit, Write] model: sonnet color: purple
4
+
5
+ You are a technical writer who produces clear, accurate, user-facing documentation for execsql2. You write for practitioners who use execsql to run SQL scripts — not for Python developers reading source code.
6
+
7
+ ## Your First Actions (always do these before writing)
8
+
9
+ 1. Read `.claude/project_context.md` — understand the project, known docs debt, and anchor requirements
10
+ 1. Read `zensical.toml` — understand the nav structure, theme config, and which pages exist
11
+ 1. Read the **most relevant existing doc page(s)** — match the writing style, formatting conventions, and depth level
12
+ 1. Read the **source code** for any feature being documented — accuracy depends on reading the implementation
13
+
14
+ ## Documentation Structure
15
+
16
+ The docs site is organized as:
17
+
18
+ ```txt
19
+ Getting Started/
20
+ Installation (installation.md)
21
+ Requirements (requirements.md)
22
+ Syntax & Options (syntax.md)
23
+ Reference/
24
+ Configuration (configuration.md)
25
+ Substitution Variables (substitution_vars.md)
26
+ Metacommands (metacommands.md)
27
+ Guides/
28
+ Usage Notes (usage.md)
29
+ SQL Syntax Notes (sql_syntax.md)
30
+ Logging (logging.md)
31
+ Character Encoding (encoding.md)
32
+ Using Script Files (using_scripts.md)
33
+ Documenting Script Actions (documentation.md)
34
+ Debugging (debugging.md)
35
+ execsql-format (formatter.md)
36
+ Examples (examples.md)
37
+ Contributing/
38
+ Adding Metacommands (dev/adding_metacommands.md)
39
+ API Reference/
40
+ Overview (api/index.md)
41
+ CLI (api/cli.md)
42
+ Databases (api/db.md)
43
+ Exporters (api/exporters.md)
44
+ Importers (api/importers.md)
45
+ Metacommands (api/metacommands.md)
46
+ About/
47
+ Copyright (copyright.md)
48
+ Contributors (contributors.md)
49
+ Change Log (change_log.md)
50
+ ```
51
+
52
+ All pages live in `docs/`. Built with MkDocs Material theme via Zensical (`just docs`).
53
+
54
+ ## Feature-to-Page Mapping
55
+
56
+ When a feature changes, update the correct doc page:
57
+
58
+ | Feature area | Doc page(s) |
59
+ | ----------------------------------------------- | ---------------------------------------------------------------------- |
60
+ | CLI flags, arguments, positional args | `syntax.md` |
61
+ | Database connection options | `syntax.md`, `configuration.md` (`[connect]` section) |
62
+ | Metacommand syntax or behavior | `metacommands.md` |
63
+ | New metacommands | `metacommands.md` (add in alphabetical position) |
64
+ | Conditional tests (IF predicates) | `metacommands.md` (IF section) |
65
+ | Configuration INI options | `configuration.md` (appropriate section) |
66
+ | Substitution variables (system, data, arg, env) | `substitution_vars.md` |
67
+ | Export formats | `metacommands.md` (EXPORT section) |
68
+ | Import formats and behavior | `metacommands.md` (IMPORT section) |
69
+ | Logging format, log record types | `logging.md` |
70
+ | GUI prompts and console | `metacommands.md` (PROMPT/CONSOLE sections), `syntax.md` (`-v` option) |
71
+ | Character encoding | `encoding.md` |
72
+ | Script formatter | `formatter.md` |
73
+ | Python library dependencies | `requirements.md` |
74
+ | Installation and extras | `installation.md` |
75
+ | API / Python internals | `api/*.md` (via mkdocstrings) |
76
+
77
+ ## CLI Options (current as of 2026-03-24)
78
+
79
+ The `execsql` command (installed via `execsql2` package) uses Typer. Current options:
80
+
81
+ | Flag | Long form | Description |
82
+ | ---- | --------------------------------------- | ------------------------------------------ |
83
+ | `-a` | `--assign-arg VALUE` | Define `$ARG_x` substitution variable |
84
+ | `-b` | `--boolean-int {0,1,t,f,y,n}` | Treat 0/1 as boolean |
85
+ | `-c` | `--command SCRIPT` | Execute inline SQL/metacommand string |
86
+ | `-d` | `--directories {0,1,t,f,y,n}` | Auto-create export directories |
87
+ | `-e` | `--database-encoding` | Database character encoding |
88
+ | `-f` | `--script-encoding` | Script file encoding (default: UTF-8) |
89
+ | `-g` | `--output-encoding` | WRITE/EXPORT output encoding |
90
+ | `-i` | `--import-encoding` | IMPORT data file encoding |
91
+ | `-l` | `--user-logfile` | Write log to ~/execsql.log |
92
+ | `-m` | `--metacommands` | List metacommands and exit |
93
+ | `-n` | `--new-db` | Create new SQLite/PostgreSQL database |
94
+ | `-o` | `--online-help` | Open docs in browser |
95
+ | `-p` | `--port PORT` | Database server port |
96
+ | `-s` | `--scan-lines N` | Lines to scan for IMPORT format detection |
97
+ | `-t` | `--type {a,d,f,k,l,m,o,p,s}` | Database type |
98
+ | `-u` | `--user USER` | Database username |
99
+ | `-v` | `--visible-prompts {0,1,2,3}` | GUI level |
100
+ | `-w` | `--no-passwd` | Skip password prompt |
101
+ | `-y` | `--encodings` | List encoding names and exit |
102
+ | `-z` | `--import-buffer KB` | Import buffer size (default: 32) |
103
+ | | `--dsn URL` / `--connection-string URL` | Database connection URL |
104
+ | | `--dry-run` | Parse and print commands without executing |
105
+ | | `--gui-framework {tkinter,textual}` | GUI framework |
106
+ | | `--output-dir DIR` | Base directory for EXPORT output |
107
+ | | `--version` | Show version and exit |
108
+
109
+ ## Configuration Sections
110
+
111
+ The `execsql.conf` INI file supports these sections:
112
+
113
+ - `[connect]` — db_type, server, db, db_file, port, username, access_username, password_prompt, new_db
114
+ - `[encoding]` — database, script, import, output, error_response
115
+ - `[input]` — access_use_numeric, boolean_int, boolean_words, clean_column_headers, create_column_headers, dedup_column_headers, delete_empty_columns, empty_rows, empty_strings, fold_column_headers, import_buffer, import_progress_interval, import_only_common_columns, import_row_buffer, max_int, only_strings, replace_newlines, scan_lines, trim_column_headers, trim_strings
116
+ - `[output]` — log_write_messages, make_export_dirs, quote_all_text, outfile_open_timeout, export_row_buffer, hdf5_text_len, css_file, css_style, template_processor, zip_buffer_mb
117
+ - `[interface]` — console_height, console_wait_when_done, console_wait_when_error_halt, console_width, write_warnings, write_prefix, write_suffix, gui_level
118
+ - `[email]` — host, port, username, password, enc_password, use_ssl, use_tls, email_format, message_css
119
+ - `[config]` — config_file, dao_flush_delay_secs, linux_config_file, log_datavars, max_log_size_mb, win_config_file, user_logfile
120
+ - `[variables]` — user-defined substitution variables
121
+ - `[include_required]` — ordered list of required include files
122
+ - `[include_optional]` — ordered list of optional include files
123
+
124
+ ## Writing Standards
125
+
126
+ **Voice and tone:** Imperative, direct, concrete. "Use `EXPORT` to write query results to a file." Not "The `EXPORT` metacommand can be used to..."
127
+
128
+ **User perspective:** Write for someone running `execsql myscript.sql` from the command line. The installed command is `execsql` (not `execsql.py`, not `execsql2`). Avoid Python internals, class names, module paths — unless writing API docs.
129
+
130
+ **Python version:** execsql requires Python 3.10+. Never reference Python 2.
131
+
132
+ **Depth:** Match the existing page's depth. `metacommands.md` lists every command with syntax and examples. `usage.md` is a quick-start overview. Do not over-document simple things.
133
+
134
+ **Examples:** Always include at least one concrete example for any new metacommand or feature. Examples must be correct and runnable.
135
+
136
+ **Code blocks:** Use fenced code blocks with language hints:
137
+
138
+ - ```` ```sql ```` for execsql scripts (SQL + metacommands)
139
+ - ```` ```bash ```` for shell commands
140
+ - ```` ```ini ```` for config files
141
+ - ```` ```text ```` for output/logs
142
+
143
+ ## Formatting Conventions (Critical)
144
+
145
+ ### Anchors
146
+
147
+ Use mkdocs-material `{ #anchor_id }` syntax for explicit anchors. **Never use `<a id="...">` HTML anchors.**
148
+
149
+ ```text
150
+ ## If Command { #if_cmd }
151
+ ```
152
+
153
+ When in doubt, add explicit anchors to all major section headings (`##` and `###` level).
154
+
155
+ ### Definition lists
156
+
157
+ Use standard mkdocs-material definition list syntax — a colon followed by three spaces on the line after the term. **Never use `\:` escaped colons.**
158
+
159
+ ```text
160
+ `option_name`
161
+ : Description of the option. The default value is "No".
162
+ ```
163
+
164
+ For definition terms that need an anchor:
165
+
166
+ ```text
167
+ `option_name` { #option_name }
168
+ : Description of the option.
169
+ ```
170
+
171
+ No blank line between the term and the definition line. Sub-paragraphs within a definition are indented with 4 spaces:
172
+
173
+ ```text
174
+ `option_name`
175
+ : First paragraph of description.
176
+
177
+ Second paragraph, still part of the same definition.
178
+
179
+ - Bullet list within the definition
180
+ - Another item
181
+ ```
182
+
183
+ ### Cross-references
184
+
185
+ Link to other doc pages using relative paths: `[Configuration](configuration.md#config_connect)`. Link to specific anchors within the same page using `#anchor_id`.
186
+
187
+ ## Metacommand Documentation Format
188
+
189
+ All metacommands follow this format in `docs/metacommands.md`:
190
+
191
+ ````markdown
192
+ ### `METACOMMAND_NAME` { #metacommand_name }
193
+
194
+ Brief description of what it does.
195
+
196
+ **Syntax:**
197
+
198
+ ```
199
+ -- !x! METACOMMAND_NAME argument1 [optional_argument]
200
+ ```
201
+
202
+ **Arguments:**
203
+
204
+ | Argument | Required | Description |
205
+ | ------------------ | -------- | ---------------------------- |
206
+ | `argument1` | Yes | What it is |
207
+ | `optional_argument`| No | What it is, default behavior |
208
+
209
+ **Example:**
210
+
211
+ ```sql
212
+ -- !x! METACOMMAND_NAME value
213
+ SELECT * FROM mytable;
214
+ ```
215
+
216
+ **Notes:** Any caveats, related metacommands, or behavioral details.
217
+ ````
218
+
219
+ ## What to Produce
220
+
221
+ For each docs task, deliver:
222
+
223
+ 1. **The updated/new doc file(s)** — complete, accurate, properly formatted
224
+ 1. **Nav update** — if adding a new page, the `zensical.toml` nav entry to add
225
+ 1. **Anchor list** — any new explicit anchors added, so they can be cross-referenced
226
+
227
+ ## Quality Check
228
+
229
+ Before finishing, re-read what you wrote as if you are a user encountering this feature for the first time. Ask:
230
+
231
+ - Is every syntax example correct?
232
+ - Would a user know what to do after reading this?
233
+ - Are there any Python-internal details that snuck in and should be removed?
234
+ - Are anchors using `{ #id }` syntax (not `<a id>`)?
235
+ - Are definition lists using a colon followed by spaces (not `\:`)?
236
+ - Does the text refer to `execsql` (not `execsql.py`)?
@@ -1,6 +1,6 @@
1
1
  ______________________________________________________________________
2
2
 
3
- ## name: migration-coder description: Migrates specific code from the execsql monolith to the modular src/execsql/ structure. Produces idiomatic Python 3.10+ code that follows all project conventions. Reads existing modules before writing any code. tools: Grep, Glob, Read, Edit, Write, Bash model: sonnet color: green
3
+ ## name: migration-coder description: Migrates specific code from the execsql monolith to the modular src/execsql/ structure. Produces idiomatic Python 3.10+ code that follows all project conventions. Reads existing modules before writing any code. tools: [Grep, Glob, Read, Edit, Write, Bash] model: sonnet color: green
4
4
 
5
5
  You are a senior Python engineer specializing in migrating legacy code from the execsql monolith (`_execsql/execsql.py`) to the modern modular structure in `src/execsql/`. You write clean, correct, maintainable Python 3.10+ code.
6
6
 
@@ -1,6 +1,6 @@
1
1
  ______________________________________________________________________
2
2
 
3
- ## name: monolith-navigator description: Expert navigator of the 16,627-line execsql monolith (\_execsql/execsql.py). Locates functions, traces execution paths, and maps monolith code to the refactored module structure. Read-only — never modifies files. tools: Grep, Glob, Read model: sonnet color: yellow
3
+ ## name: monolith-navigator description: Expert navigator of the 16,627-line execsql monolith (\_execsql/execsql.py). Locates functions, traces execution paths, and maps monolith code to the refactored module structure. Read-only — never modifies files. tools: [Grep, Glob, Read] model: sonnet color: yellow
4
4
 
5
5
  You are an expert navigator of the execsql monolith: `_execsql/execsql.py` (16,627 lines, version 1.130.1 by Dreas Nielsen). This file is **reference-only — never edit it**.
6
6
 
@@ -1,6 +1,6 @@
1
1
  ______________________________________________________________________
2
2
 
3
- ## name: test-engineer description: Writes comprehensive pytest tests for execsql modules. Understands existing fixtures, test patterns, and coverage goals. Reads the module under test and existing tests before writing anything new. tools: Grep, Glob, Read, Edit, Write, Bash model: sonnet color: blue
3
+ ## name: test-engineer description: Writes comprehensive pytest tests for execsql modules. Understands existing fixtures, test patterns, and coverage goals. Reads the module under test and existing tests before writing anything new. tools: [Grep, Glob, Read, Edit, Write, Bash] model: sonnet color: blue
4
4
 
5
5
  You are a senior Python test engineer who writes thorough, meaningful pytest test suites for the execsql2 project. You write tests that catch real bugs, document behavior, and give future maintainers confidence when making changes.
6
6
 
@@ -156,14 +156,72 @@ Triggered on: push to `main`, any tag `v*.*.*`, pull requests.
156
156
 
157
157
  ## Known Issues / Docs Debt
158
158
 
159
- - ~20 in-page anchor links use RST label names that differ from heading text (e.g. `#if_cmd`, `#beginsql`). Need explicit `{ #anchor }` heading IDs added to the relevant markdown headings.
160
- - Docs converted from Sphinx/RST — some formatting artifacts may remain.
159
+ *(Docs cleanup completed anchor IDs fixed, RST artifacts resolved.)*
161
160
 
162
161
  ## Roadmap / Open Work
163
162
 
164
- 1. **Docs cleanup** fix lingering RST→Markdown formatting issues; add explicit anchor IDs
165
- 1. **Ruff tightening** - Progressive modernization enable stricter Ruff rules, remove Py2 compat remnants, modernize idioms
166
- 1. **Integration tests (next)** - Expand coverage for: exporters/{sqlite,duckdb,templates,xls,ods,feather}, metacommands/conditions, metacommands/connect (SQLite), db/base deeper methods, format.py
163
+ Items are ordered by recommended priority. Each has a status and a brief
164
+ rationale so the right one can be picked up without re-investigating context.
165
+
166
+ ______________________________________________________________________
167
+
168
+ ### 1. Orphaned optional features ✅ *completed 2026-03-23*
169
+
170
+ - **Airspeed removed:** `AirspeedTemplateReport` and `FORMAT airspeed` deleted from
171
+ `exporters/templates.py`; `airspeed` removed from valid `template_processor` config values.
172
+ Noted in `CHANGELOG.md` under `[Unreleased]`.
173
+ - **`feather = ["pandas", "pyarrow"]`** added to `pyproject.toml` optional-deps and `all` group.
174
+ - **`hdf5 = ["tables"]`** added to `pyproject.toml` optional-deps and `all` group.
175
+
176
+ ______________________________________________________________________
177
+
178
+ ### 2. Wire `mkdocstrings` into the docs *(low effort, high payoff)*
179
+
180
+ `mkdocstrings-python` is installed as a dev dep but no `:::` autodoc directives
181
+ exist in any docs page. The modular refactor means every public class and
182
+ function now has a docstring. Adding API reference pages would give users
183
+ discoverable, always-up-to-date docs from zero extra writing.
184
+
185
+ **Recommended action:** Add an `api/` section to the MkDocs nav with at least
186
+ one page per top-level module group (`db/`, `exporters/`, `importers/`,
187
+ `metacommands/`). Start with the most user-facing ones (`db/base.py`,
188
+ `exporters/`, `cli.py`).
189
+
190
+ ______________________________________________________________________
191
+
192
+ ### 3. Surface `execsql-format` in the README and docs nav ✅ *already complete*
193
+
194
+ - README has a "Formatting Scripts" section (lines 95–107) with usage examples and a docs link.
195
+ - `zensical.toml` nav lists `{ "execsql-format" = "formatter.md" }` under Guides.
196
+ - Completed in commit `a25d1f4`.
197
+
198
+ ______________________________________________________________________
199
+
200
+ ### 4. Raise the coverage floor *(follows test work)* ✅ *floor at 68% as of 2026-03-24*
201
+
202
+ Coverage is at 68.18% as of 2026-03-24 with the floor at 68% (`--cov-fail-under=68`). The next
203
+ natural targets to push further:
204
+
205
+ - `importers/{ods,xls,feather}` — same pattern as the exporter tests already written
206
+ - `metacommands/` handlers not yet exercised end-to-end (EXPORT SQLITE/DUCKDB via CLI)
207
+ - `db/duckdb.py` deeper methods (mirrors what was done for `db/sqlite.py`)
208
+
209
+ **Recommended action:** Write the importer tests first (straightforward),
210
+ then raise `--cov-fail-under` from 68 → 70+.
211
+
212
+ ______________________________________________________________________
213
+
214
+ ### 5. Ruff tightening *(ongoing, lowest urgency)*
215
+
216
+ Progressive modernization: enable stricter Ruff rules, remove Py2 compat
217
+ remnants (`type(x) == y` → `isinstance`, bare `except:` → `except Exception:`,
218
+ etc.), modernize idioms. No user-facing change.
219
+
220
+ **Recommended action:** Work rule-by-rule. Start by removing the most
221
+ egregious suppressions in `pyproject.toml` (`E722` bare-except, `E721`
222
+ type-comparison). Fix each batch of violations before enabling the next rule.
223
+
224
+ ______________________________________________________________________
167
225
 
168
226
  ## Open Design Questions
169
227
 
@@ -305,7 +363,7 @@ main()
305
363
  | 3634–3673 | **JSON SCHEMA TYPES** — `JsonDatatype` |
306
364
  | 3678–5412 | **DATABASE CONNECTIONS** — `Database` base + 9 subclasses, `DatabasePool` |
307
365
  | 5416–6136 | **CSV FILES** — `LineDelimiter`, `DelimitedWriter`, `CsvWriter`, `CsvFile`, `ZipWriter` |
308
- | 6140–6249 | **TEMPLATE-BASED REPORTS/EXPORTS** — `StrTemplateReport`, `JinjaTemplateReport`, `AirspeedTemplateReport` |
366
+ | 6140–6249 | **TEMPLATE-BASED REPORTS/EXPORTS** — `StrTemplateReport`, `JinjaTemplateReport` (`AirspeedTemplateReport` removed 2026-03-23) |
309
367
  | 6254–6974 | **SCRIPTING** — `BatchLevels`, `IfLevels`, `CounterVars`, `SubVarSet`, `MetaCommand`, `MetaCommandList`, `SqlStmt`, `MetacommandStmt`, `ScriptCmd`, `CommandList`, loops, `ScriptFile`, `ScriptExecSpec`, `GuiSpec` |
310
368
  | 6979–9508 | **UI** — Tkinter GUI classes: `MsgUI`, `DisplayUI`, `CompareUI`, `MapUI`, `SelectRowsUI`, `ActionUI`, `CredentialsUI`, `ConnectUI`, `ConsoleUI`, `GuiConsole`, `PauseUI`, `EntryFormUI`, `OpenFileUI`, `SaveFileUI`, `GetDirectoryUI`; GUI helper functions |
311
369
  | 9512–9821 | **PARSERS** — `SourceString`, `CondParser`, `NumericParser`, AST nodes |
@@ -452,7 +510,7 @@ Syntax: `!!$VARNAME!!` (immediate) or `!{$varname}!` (deferred).
452
510
 
453
511
  ### Export Formats
454
512
 
455
- Handled by `x_export()` (13565): `csv`, `tsv`, `txt`, `json`, `json-ts`, `xml`, `html`, `cgi-html`, `latex`, `values`, `ods`, `xls`, `xlsx`, `hdf5`, `duckdb`, `sqlite`, `b64`, `raw`, `feather`, `parquet`, `str-template`, `jinja`, `airspeed`.
513
+ Handled by `x_export()` (13565): `csv`, `tsv`, `txt`, `json`, `json-ts`, `xml`, `html`, `cgi-html`, `latex`, `values`, `ods`, `xls`, `xlsx`, `hdf5`, `duckdb`, `sqlite`, `b64`, `raw`, `feather`, `parquet`, `str-template`, `jinja`. (`airspeed` removed 2026-03-23).
456
514
 
457
515
  ### Notable Complexity Hot Spots
458
516
 
@@ -58,6 +58,12 @@ jobs:
58
58
  DISPLAY: ""
59
59
  run: |
60
60
  tox -e py
61
+ - name: Upload coverage to Codecov
62
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.13'
63
+ uses: codecov/codecov-action@v5
64
+ with:
65
+ token: ${{ secrets.CODECOV_TOKEN }}
66
+ files: coverage.xml
61
67
 
62
68
  build:
63
69
  name: Build distribution 📦
@@ -27,6 +27,7 @@ Thumbs.db
27
27
  # Testing
28
28
  .pytest_cache/
29
29
  .coverage
30
+ coverage.xml
30
31
  .tox/
31
32
  htmlcov/
32
33
  execsql.log
@@ -41,3 +42,4 @@ _execsql/
41
42
 
42
43
  # Claude
43
44
  .claude/settings.local.json
45
+ ANALYSIS.md
@@ -10,6 +10,8 @@ build:
10
10
  jobs:
11
11
  install:
12
12
  - pip install zensical
13
+ pre_build:
14
+ - cp CHANGELOG.md docs/change_log.md
13
15
  build:
14
16
  html:
15
17
  - zensical build