execsql2 2.0.1__tar.gz → 2.1.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.
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/agents/changelog-manager.md +1 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/agents/code-oracle.md +1 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/agents/code-reviewer.md +1 -1
- execsql2-2.1.2/.claude/agents/docs-author.md +236 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/agents/migration-coder.md +1 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/agents/monolith-navigator.md +1 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/agents/test-engineer.md +1 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/project_context.md +65 -7
- {execsql2-2.0.1 → execsql2-2.1.2}/.github/workflows/ci-cd.yml +6 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/.gitignore +2 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/.pre-commit-config.yaml +2 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/.readthedocs.yaml +4 -1
- execsql2-2.1.2/CHANGELOG.md +1774 -0
- execsql2-2.1.2/PKG-INFO +300 -0
- execsql2-2.1.2/README.md +200 -0
- execsql2-2.1.2/docs/api/cli.md +21 -0
- execsql2-2.1.2/docs/api/db.md +15 -0
- execsql2-2.1.2/docs/api/exporters.md +39 -0
- execsql2-2.1.2/docs/api/importers.md +21 -0
- execsql2-2.1.2/docs/api/index.md +22 -0
- execsql2-2.1.2/docs/api/metacommands.md +29 -0
- execsql2-2.0.1/CHANGELOG.md → execsql2-2.1.2/docs/change_log.md +139 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/configuration.md +82 -52
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/copyright.md +4 -2
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/debugging.md +1 -1
- execsql2-2.1.2/docs/dev/adding_db_adapters.md +234 -0
- execsql2-2.1.2/docs/dev/adding_exporters.md +192 -0
- execsql2-2.1.2/docs/dev/adding_importers.md +170 -0
- execsql2-2.1.2/docs/dev/adding_metacommands.md +237 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/examples.md +6 -6
- execsql2-2.1.2/docs/formatter.md +169 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/index.md +14 -14
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/installation.md +5 -2
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/logging.md +2 -2
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/metacommands.md +10 -26
- execsql2-2.1.2/docs/requirements.md +70 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/substitution_vars.md +11 -0
- execsql2-2.1.2/docs/syntax.md +194 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/usage.md +4 -13
- {execsql2-2.0.1 → execsql2-2.1.2}/justfile +2 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/pyproject.toml +88 -35
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/cli.py +322 -108
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/config.py +134 -114
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/access.py +89 -65
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/base.py +97 -68
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/dsn.py +45 -29
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/duckdb.py +4 -5
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/factory.py +27 -27
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/firebird.py +30 -18
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/mysql.py +38 -14
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/oracle.py +58 -33
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/postgres.py +68 -28
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/sqlite.py +36 -27
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/sqlserver.py +45 -30
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exceptions.py +68 -64
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/__init__.py +1 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/base.py +42 -17
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/delimited.py +60 -59
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/duckdb.py +8 -12
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/feather.py +32 -24
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/html.py +33 -30
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/json.py +18 -17
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/latex.py +11 -13
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/ods.py +50 -46
- execsql2-2.1.2/src/execsql/exporters/parquet.py +32 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/pretty.py +16 -15
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/raw.py +9 -11
- execsql2-2.1.2/src/execsql/exporters/sqlite.py +82 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/templates.py +15 -72
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/values.py +13 -12
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/xls.py +26 -26
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/xml.py +12 -12
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/exporters/zip.py +0 -3
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/gui/__init__.py +2 -2
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/gui/console.py +0 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/gui/desktop.py +6 -7
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/gui/tui.py +8 -14
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/importers/base.py +6 -9
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/importers/csv.py +10 -17
- execsql2-2.1.2/src/execsql/importers/feather.py +61 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/importers/ods.py +3 -4
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/importers/xls.py +5 -6
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/__init__.py +8 -8
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/conditions.py +41 -33
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/connect.py +113 -99
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/control.py +38 -26
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/data.py +35 -33
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/debug.py +13 -9
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/io.py +288 -229
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/prompt.py +179 -157
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/script_ext.py +11 -9
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/metacommands/system.py +44 -25
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/models.py +9 -16
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/parser.py +10 -10
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/script.py +183 -157
- execsql2-2.1.2/src/execsql/state.py +339 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/types.py +46 -81
- execsql2-2.1.2/src/execsql/utils/auth.py +193 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/crypto.py +31 -4
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/datetime.py +7 -7
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/errors.py +34 -29
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/fileio.py +90 -55
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/gui.py +22 -23
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/mail.py +15 -17
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/numeric.py +2 -3
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/regex.py +9 -12
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/strings.py +10 -12
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/timer.py +0 -2
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/execsql.conf +1 -1
- execsql2-2.1.2/tests/conftest.py +88 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/db/test_base.py +179 -0
- execsql2-2.1.2/tests/db/test_postgres.py +88 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/db/test_sqlite.py +21 -2
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/exporters/test_base.py +42 -9
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/exporters/test_db.py +0 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/exporters/test_delimited.py +146 -5
- execsql2-2.1.2/tests/exporters/test_duckdb_exporter.py +145 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/exporters/test_exporters.py +39 -4
- execsql2-2.1.2/tests/exporters/test_feather.py +62 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/exporters/test_html_latex.py +1 -2
- execsql2-2.1.2/tests/exporters/test_json.py +163 -0
- execsql2-2.1.2/tests/exporters/test_ods.py +231 -0
- execsql2-2.1.2/tests/exporters/test_parquet.py +62 -0
- execsql2-2.1.2/tests/exporters/test_sqlite_exporter.py +141 -0
- execsql2-2.1.2/tests/exporters/test_templates.py +204 -0
- execsql2-2.1.2/tests/exporters/test_xls_xlsx.py +240 -0
- execsql2-2.1.2/tests/exporters/test_xml.py +138 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/exporters/test_zip.py +0 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/gui/test_backends.py +46 -10
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/importers/test_csv_importer.py +0 -2
- execsql2-2.1.2/tests/importers/test_feather_importer.py +136 -0
- execsql2-2.1.2/tests/importers/test_ods_importer.py +159 -0
- execsql2-2.1.2/tests/importers/test_xls_importer.py +184 -0
- {execsql2-2.0.1/tests → execsql2-2.1.2/tests/metacommands}/test_metacommands.py +14 -14
- execsql2-2.1.2/tests/metacommands/test_metacommands_connect.py +326 -0
- execsql2-2.1.2/tests/metacommands/test_metacommands_extended.py +1941 -0
- execsql2-2.1.2/tests/metacommands/test_metacommands_io.py +423 -0
- execsql2-2.1.2/tests/metacommands/test_metacommands_script_ext.py +195 -0
- execsql2-2.1.2/tests/metacommands/test_metacommands_system.py +375 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_cli.py +222 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_config.py +0 -3
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_config_data.py +614 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_constants.py +0 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_exceptions.py +16 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_format.py +4 -13
- execsql2-2.1.2/tests/test_integration.py +422 -0
- execsql2-2.1.2/tests/test_mail.py +238 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_models.py +89 -8
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_package.py +17 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_parser.py +147 -17
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_script.py +103 -1
- execsql2-2.1.2/tests/test_types.py +833 -0
- execsql2-2.1.2/tests/utils/__init__.py +0 -0
- execsql2-2.1.2/tests/utils/test_auth.py +138 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/utils/test_crypto.py +0 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/utils/test_datetime.py +0 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/utils/test_errors.py +161 -2
- execsql2-2.1.2/tests/utils/test_fileio.py +300 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/utils/test_numeric.py +1 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/utils/test_strings.py +1 -1
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/utils/test_timer.py +1 -2
- {execsql2-2.0.1 → execsql2-2.1.2}/uv.lock +564 -28
- {execsql2-2.0.1 → execsql2-2.1.2}/zensical.toml +25 -1
- execsql2-2.0.1/.claude/agents/docs-author.md +0 -112
- execsql2-2.0.1/PKG-INFO +0 -406
- execsql2-2.0.1/README.md +0 -320
- execsql2-2.0.1/docs/change_log.md +0 -1
- execsql2-2.0.1/docs/requirements.md +0 -28
- execsql2-2.0.1/docs/syntax.md +0 -141
- execsql2-2.0.1/src/execsql/exporters/sqlite.py +0 -82
- execsql2-2.0.1/src/execsql/importers/feather.py +0 -67
- execsql2-2.0.1/src/execsql/state.py +0 -377
- execsql2-2.0.1/src/execsql/utils/auth.py +0 -93
- execsql2-2.0.1/tests/conftest.py +0 -68
- execsql2-2.0.1/tests/test_types.py +0 -432
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/commands/code-oracle.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/commands/migrate.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/commands/review-changes.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/commands/test-module.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/commands/update-changelog.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/.claude/commands/where-is.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/.python-version +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/CONTRIBUTING.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/LICENSE.txt +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/NOTICE +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/contributors.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/documentation.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/encoding.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/Compare_planets.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/actions.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/actions2.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/checkboxes.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/connect.b64 +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/connect.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/create_conf.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/data_error1_screenshot.jpg +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/entry_form.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/execsql_console.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/execsql_logo_01.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/fatals.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/logo_small.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/pause_terminal.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/pause_terminal_sm.b64 +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/pause_terminal_sm.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/prompt_compare.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/set_build_commands.jpg +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/unit_conversions.b64 +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/unit_conversions_029.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/unmatched.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/images/vim_execsql_highlight.png +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/sql_syntax.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/docs/using_scripts.md +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/__init__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/__main__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/constants.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/db/__init__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/format.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/gui/base.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/importers/__init__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/src/execsql/utils/__init__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/READ_ME.rst +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/config_settings.sqlite +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/example_config_prompt.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/make_config_db.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/md_compare.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/md_glossary.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/md_upsert.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/pg_compare.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/pg_glossary.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/pg_upsert.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/script_template.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/ss_compare.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/ss_glossary.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/templates/ss_upsert.sql +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/__init__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/db/__init__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/db/test_duckdb.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/db/test_factory.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/exporters/__init__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/gui/__init__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/importers/__init__.py +0 -0
- {execsql2-2.0.1/tests/utils → execsql2-2.1.2/tests/metacommands}/__init__.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/tests/test_state.py +0 -0
- {execsql2-2.0.1 → execsql2-2.1.2}/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
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
|
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
|
|
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 📦
|
|
@@ -18,7 +18,7 @@ repos:
|
|
|
18
18
|
- id: gitleaks
|
|
19
19
|
# uv lockfile management
|
|
20
20
|
- repo: https://github.com/astral-sh/uv-pre-commit
|
|
21
|
-
rev: 0.
|
|
21
|
+
rev: 0.11.1
|
|
22
22
|
hooks:
|
|
23
23
|
- id: uv-lock
|
|
24
24
|
# Base hooks
|
|
@@ -47,6 +47,7 @@ repos:
|
|
|
47
47
|
- mdformat-mkdocs==5.1.1
|
|
48
48
|
exclude: |
|
|
49
49
|
(?x)^(
|
|
50
|
+
docs/api/.*|
|
|
50
51
|
docs/metacommands\.md|
|
|
51
52
|
docs/documentation\.md|
|
|
52
53
|
docs/examples\.md
|