quickdbd-cli 0.3.2__tar.gz → 0.3.4__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.
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/.gitignore +1 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/PKG-INFO +6 -6
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/README.md +5 -5
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/pyproject.toml +1 -1
- quickdbd_cli-0.3.4/src/quickdbd_cli/__init__.py +1 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/agent.py +1 -7
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/render.js +52 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/style.css +39 -2
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/viewer.js +205 -27
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/cli.py +6 -2
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/export.py +15 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/html.py +1 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/layout.py +20 -1
- quickdbd_cli-0.3.4/tests/test_home_hook.py +52 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_pipeline.py +20 -0
- quickdbd_cli-0.3.4/tests/test_render.py +109 -0
- quickdbd_cli-0.3.4/tests/test_viewer_contract.py +22 -0
- quickdbd_cli-0.3.2/src/quickdbd_cli/__init__.py +0 -1
- quickdbd_cli-0.3.2/tests/test_render.py +0 -20
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/LICENSE +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/NOTICE +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/examples/quickdbd-sample.txt +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/examples/synthetic/finance.txt +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/examples/synthetic/hr.txt +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/examples/synthetic/inventory.txt +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/examples/synthetic/marketing.txt +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/examples/synthetic/qdbd.layout.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/examples/synthetic/sales.txt +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/scripts/build_gallery.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/scripts/gen_font_metrics.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/scripts/gen_schema.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/scripts/gen_thumbnails.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/scripts/import_dbml_corpus.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/scripts/release.sh +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/__main__.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/Inter-Bold.ttf +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/Inter-Bold.woff2 +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/Inter-LICENSE.txt +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/Inter-Regular.ttf +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/Inter-Regular.woff2 +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/editor.js +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/elk-LICENSE.md +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/elk.bundled.js +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/font-metrics.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/assets/syntax-reference.md +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/convert.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/dbml.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/dbt.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/diff.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/jsrt.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/mcp.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/measure.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/model.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/parser.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/project.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/serve.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/share.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/tags.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/src/quickdbd_cli/targets.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml/team.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/LICENSE +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/README.md +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/alias_of_duplicated_names.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/alias_of_duplicated_names.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/dep.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/dep.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_columns.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_columns.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_enum_field.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_enum_field.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_name.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_name.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_names.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_names.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_table_partial_injections.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/duplicate_table_partial_injections.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/enum_as_default_column_value.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/enum_as_default_column_value.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/enum_name.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/enum_name.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/erroneous.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/erroneous.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/multiple_notes_in_table_group.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/multiple_notes_in_table_group.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index_table_partial.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index_table_partial.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table_partial.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table_partial.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/ref_validator.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/ref_validator.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/sticky_notes_validator.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/sticky_notes_validator.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/table_partial.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/table_partial.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/unknown_table_group_field.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/binder/unknown_table_group_field.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/array_type.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/array_type.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/checks.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/checks.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/circular_ref_1_inline_1_element.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/circular_ref_1_inline_1_element.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_elements.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_elements.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_inlines.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_inlines.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/column_caller_type.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/column_caller_type.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/comment.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/comment.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/composite_pk.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/composite_pk.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/default_tables.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/default_tables.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/dep.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/dep.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/dep_color.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/dep_color.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/dep_duplicate.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/dep_duplicate.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/dep_pipeline.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/dep_pipeline.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/enum_as_default_column_value.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/enum_as_default_column_value.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/enum_tables.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/enum_tables.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/erroneous.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/erroneous.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/general_schema.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/general_schema.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/header_color_tables.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/header_color_tables.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/index_table_partial.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/index_table_partial.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/index_tables.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/index_tables.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/metadata.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/metadata.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/metadata_errors.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/metadata_errors.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/multi_notes.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/multi_notes.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/multiline_string.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/multiline_string.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/negative_number.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/negative_number.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/note_normalize.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/note_normalize.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/note_normalize_with_top_empty_lines.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/note_normalize_with_top_empty_lines.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/old_undocumented_syntax.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/old_undocumented_syntax.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/primary_key.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/primary_key.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/project.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/project.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/ref_name_and_color_setting.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/ref_name_and_color_setting.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/ref_settings.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/ref_settings.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/referential_actions.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/referential_actions.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/self_referential_ref_in_tablepartial.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/self_referential_ref_in_tablepartial.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/sticky_notes.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/sticky_notes.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_element.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_element.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_group.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_group.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_group_element.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_group_element.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_group_settings.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_group_settings.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_partial.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_partial.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_reappear_tablegroup.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_reappear_tablegroup.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_settings.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/table_settings.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/tablepartial_causing_circular_ref.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/tablepartial_causing_circular_ref.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/two_inline_refs.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/interpreter/two_inline_refs.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/call_expression.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/call_expression.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/element_in_simple_body.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/element_in_simple_body.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/erroneous_setting.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/erroneous_setting.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/expression.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/expression.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/last_invalid_number.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/last_invalid_number.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/list_expression.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/list_expression.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/trailing_comments.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/trailing_comments.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/tuple_expression.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/parser/tuple_expression.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/checks.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/checks.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/complex_names.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/complex_names.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/dep.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/dep.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/enum.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/enum.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/invalid_args.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/invalid_args.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/public_schema.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/public_schema.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/redefined_note.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/redefined_note.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/ref_error_setting.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/ref_error_setting.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/ref_in_table.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/ref_in_table.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/schema_nested_tablegroup.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/schema_nested_tablegroup.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_group_settings.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_group_settings.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_partial_check.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_partial_check.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_partial_settings_general.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_partial_settings_general.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_settings_check.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_settings_check.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_settings_general.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/table_settings_general.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/wrong_sub_element_declarations.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/wrong_sub_element_declarations.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/wrong_table_partial_injection_syntax.dbml +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/dbml-ref/validator/wrong_table_partial_injection_syntax.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/jaffle/LICENSE +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/jaffle/README.md +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/jaffle/catalog.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/jaffle/manifest.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/fixtures/targets/cases.json +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_agent.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_convert.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_dbml.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_dbml_pipeline.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_dbt.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_diff.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_gallery.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_mcp.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_packaging.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_parser.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_path.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_select.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_serve.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_share.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_tags.py +0 -0
- {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.4}/tests/test_targets.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: quickdbd-cli
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.4
|
|
4
4
|
Summary: Compile QuickDBD-syntax schema files into interactive HTML ER diagrams, with no table limit.
|
|
5
5
|
Project-URL: Homepage, https://qdbd.dev/
|
|
6
6
|
Project-URL: Documentation, https://qdbd.dev/guide/
|
|
@@ -43,7 +43,7 @@ Description-Content-Type: text/markdown
|
|
|
43
43
|
</picture>
|
|
44
44
|
</p>
|
|
45
45
|
|
|
46
|
-
<p align="center"><b>Interactive ER diagrams from QuickDBD text or a dbt project, readable at 200+ tables</b></p>
|
|
46
|
+
<p align="center"><b>Interactive ER diagrams from QuickDBD text, DBML or a dbt project, readable at 200+ tables</b></p>
|
|
47
47
|
|
|
48
48
|
<p align="center">
|
|
49
49
|
<a href="https://pypi.org/project/quickdbd-cli/"><img src="https://img.shields.io/pypi/v/quickdbd-cli?label=PyPI" alt="PyPI version"></a>
|
|
@@ -89,7 +89,7 @@ qdbd is not affiliated with QuickDBD or dbdiagram.io. It reads the same text syn
|
|
|
89
89
|
- **QuickDBD-compatible**: the parser mirrors QuickDBD's own, error messages included. A file that passes `qdbd check --strict` pastes into QuickDBD unchanged.
|
|
90
90
|
- **dbt import**: `qdbd import dbt` reads `manifest.json`. Primary keys come from `unique` + `not_null` tests or constraints, relationships from `relationships` tests, and `--infer-fks` fills the gaps from column names.
|
|
91
91
|
- **Readable at 200+ tables**: automatic layout, search, dbt-style selectors (`+orders+1`, `group:marts`, `tag:fact`), shaded regions per file, collapsed views and a minimap.
|
|
92
|
-
- **Review changes in pull requests**: `qdbd diff` reports what a branch changed, the GitHub Action posts it as a PR comment, and `--diff-base` colours the changes in the diagram.
|
|
92
|
+
- **Review changes in pull requests**: `qdbd diff` reports what a branch changed, the GitHub Action posts it as a PR comment, and `--diff-base` colours the changes in the diagram. To propose a column change, tag the column `# @tag: added` or `# @tag: removed` and it's drawn green or red ([column tags](https://qdbd.dev/tags/#columns)).
|
|
93
93
|
- **VS Code extension**: highlighting, errors as you type, outline, F12 across files, and the diagram beside the editor, following your cursor, or in your browser on localhost. Export, share, compare with git, convert to and from DBML, and dbt import from the sidebar or the Command Palette, with no terminal: it installs the CLI itself. Get it from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=MarkPhamm.quickdbd) or, for Cursor, Windsurf and VSCodium, [Open VSX](https://open-vsx.org/extension/MarkPhamm/quickdbd) ([docs](https://qdbd.dev/vscode/)).
|
|
94
94
|
- **AI agents**: `qdbd mcp` gives Claude, Copilot and Cursor your schema as tools: tables and columns, join paths as SQL (composite keys included), checks for their edits and diffs against `main` ([docs](https://qdbd.dev/mcp/)).
|
|
95
95
|
- **One schema, many outputs**: an HTML page, PNG, SVG, editable draw.io, or a shareable link. Installs with pip: no Node, Graphviz or browser needed.
|
|
@@ -186,7 +186,7 @@ jobs:
|
|
|
186
186
|
permissions: { contents: read, pull-requests: write }
|
|
187
187
|
steps:
|
|
188
188
|
- uses: actions/checkout@v4
|
|
189
|
-
- uses: MarkPhamm/quickdbd-cli@v0.
|
|
189
|
+
- uses: MarkPhamm/quickdbd-cli@v0.3.4
|
|
190
190
|
with:
|
|
191
191
|
path: erd/ # schema file(s) or folder(s)
|
|
192
192
|
output: site/index.html
|
|
@@ -198,7 +198,7 @@ dbt projects, GitHub Pages, pre-commit and GitLab CI are covered in [CI and Auto
|
|
|
198
198
|
|
|
199
199
|
```text
|
|
200
200
|
dbt project ──qdbd import dbt──┐
|
|
201
|
-
├──▶ schema/*.txt (QuickDBD syntax, in git)
|
|
201
|
+
├──▶ schema/*.txt, *.dbml (QuickDBD syntax or DBML, in git)
|
|
202
202
|
hand-written / pasted ─────────┘ │
|
|
203
203
|
├──▶ qdbd check validation, QuickDBD's error messages ──▶ CI gate
|
|
204
204
|
├──▶ qdbd serve live editor, drag to arrange ──▶ schema.layout.json
|
|
@@ -240,7 +240,7 @@ qdbd build schema/ -o erd.html
|
|
|
240
240
|
|
|
241
241
|
| | qdbd | QuickDBD |
|
|
242
242
|
|---|---|---|
|
|
243
|
-
| Text syntax | QuickDBD's | QuickDBD's |
|
|
243
|
+
| Text syntax | QuickDBD's or DBML | QuickDBD's |
|
|
244
244
|
| Tables per diagram | no limit | 10 on the free plan |
|
|
245
245
|
| Where it runs | your terminal and CI; the result is a static HTML file | the QuickDBD web app |
|
|
246
246
|
| Where the schema lives | `.txt` / `.dbml` files in your git repo | the web app |
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
</picture>
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
|
-
<p align="center"><b>Interactive ER diagrams from QuickDBD text or a dbt project, readable at 200+ tables</b></p>
|
|
8
|
+
<p align="center"><b>Interactive ER diagrams from QuickDBD text, DBML or a dbt project, readable at 200+ tables</b></p>
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
11
|
<a href="https://pypi.org/project/quickdbd-cli/"><img src="https://img.shields.io/pypi/v/quickdbd-cli?label=PyPI" alt="PyPI version"></a>
|
|
@@ -51,7 +51,7 @@ qdbd is not affiliated with QuickDBD or dbdiagram.io. It reads the same text syn
|
|
|
51
51
|
- **QuickDBD-compatible**: the parser mirrors QuickDBD's own, error messages included. A file that passes `qdbd check --strict` pastes into QuickDBD unchanged.
|
|
52
52
|
- **dbt import**: `qdbd import dbt` reads `manifest.json`. Primary keys come from `unique` + `not_null` tests or constraints, relationships from `relationships` tests, and `--infer-fks` fills the gaps from column names.
|
|
53
53
|
- **Readable at 200+ tables**: automatic layout, search, dbt-style selectors (`+orders+1`, `group:marts`, `tag:fact`), shaded regions per file, collapsed views and a minimap.
|
|
54
|
-
- **Review changes in pull requests**: `qdbd diff` reports what a branch changed, the GitHub Action posts it as a PR comment, and `--diff-base` colours the changes in the diagram.
|
|
54
|
+
- **Review changes in pull requests**: `qdbd diff` reports what a branch changed, the GitHub Action posts it as a PR comment, and `--diff-base` colours the changes in the diagram. To propose a column change, tag the column `# @tag: added` or `# @tag: removed` and it's drawn green or red ([column tags](https://qdbd.dev/tags/#columns)).
|
|
55
55
|
- **VS Code extension**: highlighting, errors as you type, outline, F12 across files, and the diagram beside the editor, following your cursor, or in your browser on localhost. Export, share, compare with git, convert to and from DBML, and dbt import from the sidebar or the Command Palette, with no terminal: it installs the CLI itself. Get it from the [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=MarkPhamm.quickdbd) or, for Cursor, Windsurf and VSCodium, [Open VSX](https://open-vsx.org/extension/MarkPhamm/quickdbd) ([docs](https://qdbd.dev/vscode/)).
|
|
56
56
|
- **AI agents**: `qdbd mcp` gives Claude, Copilot and Cursor your schema as tools: tables and columns, join paths as SQL (composite keys included), checks for their edits and diffs against `main` ([docs](https://qdbd.dev/mcp/)).
|
|
57
57
|
- **One schema, many outputs**: an HTML page, PNG, SVG, editable draw.io, or a shareable link. Installs with pip: no Node, Graphviz or browser needed.
|
|
@@ -148,7 +148,7 @@ jobs:
|
|
|
148
148
|
permissions: { contents: read, pull-requests: write }
|
|
149
149
|
steps:
|
|
150
150
|
- uses: actions/checkout@v4
|
|
151
|
-
- uses: MarkPhamm/quickdbd-cli@v0.
|
|
151
|
+
- uses: MarkPhamm/quickdbd-cli@v0.3.4
|
|
152
152
|
with:
|
|
153
153
|
path: erd/ # schema file(s) or folder(s)
|
|
154
154
|
output: site/index.html
|
|
@@ -160,7 +160,7 @@ dbt projects, GitHub Pages, pre-commit and GitLab CI are covered in [CI and Auto
|
|
|
160
160
|
|
|
161
161
|
```text
|
|
162
162
|
dbt project ──qdbd import dbt──┐
|
|
163
|
-
├──▶ schema/*.txt (QuickDBD syntax, in git)
|
|
163
|
+
├──▶ schema/*.txt, *.dbml (QuickDBD syntax or DBML, in git)
|
|
164
164
|
hand-written / pasted ─────────┘ │
|
|
165
165
|
├──▶ qdbd check validation, QuickDBD's error messages ──▶ CI gate
|
|
166
166
|
├──▶ qdbd serve live editor, drag to arrange ──▶ schema.layout.json
|
|
@@ -202,7 +202,7 @@ qdbd build schema/ -o erd.html
|
|
|
202
202
|
|
|
203
203
|
| | qdbd | QuickDBD |
|
|
204
204
|
|---|---|---|
|
|
205
|
-
| Text syntax | QuickDBD's | QuickDBD's |
|
|
205
|
+
| Text syntax | QuickDBD's or DBML | QuickDBD's |
|
|
206
206
|
| Tables per diagram | no limit | 10 on the free plan |
|
|
207
207
|
| Where it runs | your terminal and CI; the result is a static HTML file | the QuickDBD web app |
|
|
208
208
|
| Where the schema lives | `.txt` / `.dbml` files in your git repo | the web app |
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "quickdbd-cli"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.4"
|
|
8
8
|
description = "Compile QuickDBD-syntax schema files into interactive HTML ER diagrams, with no table limit."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.4"
|
|
@@ -638,12 +638,6 @@ def diff_schema(ws: Workspace, args: dict) -> Result:
|
|
|
638
638
|
return Result("\n".join(clip(_header(c) + text.splitlines(), "lines")))
|
|
639
639
|
|
|
640
640
|
|
|
641
|
-
def _svg_size(svg: str) -> tuple[float, float]:
|
|
642
|
-
w = re.search(r'\bwidth="([\d.]+)', svg)
|
|
643
|
-
h = re.search(r'\bheight="([\d.]+)', svg)
|
|
644
|
-
return (float(w.group(1)) if w else 1000.0, float(h.group(1)) if h else 1000.0)
|
|
645
|
-
|
|
646
|
-
|
|
647
641
|
def render_diagram(ws: Workspace, args: dict) -> Result:
|
|
648
642
|
c = ws.compile(ws.target(args.get("project")))
|
|
649
643
|
tables = selected(c, args.get("select"))
|
|
@@ -679,7 +673,7 @@ def render_diagram(ws: Workspace, args: dict) -> Result:
|
|
|
679
673
|
raise ToolError("the layout took too long; narrow with `select` or `focus`") from None
|
|
680
674
|
pos = {k: [v[0], v[1]] for k, v in laid.items()}
|
|
681
675
|
svg = export.render_svg(c.model, pos, only=ids, mode=mode, embed_font=False)
|
|
682
|
-
scale = min(2.0, IMAGE_SIDE / max(
|
|
676
|
+
scale = min(2.0, IMAGE_SIDE / max(export.svg_size(svg)))
|
|
683
677
|
if scale >= MIN_SCALE[mode]:
|
|
684
678
|
png = export.svg_to_png(svg, scale)
|
|
685
679
|
names = ", ".join(t["name"] for t in tables[:40]) + (", …" if n > 40 else "")
|
|
@@ -547,6 +547,54 @@
|
|
|
547
547
|
return lines.join("\n");
|
|
548
548
|
}
|
|
549
549
|
|
|
550
|
+
/* ------------------------------------------------------------------ lit relationships (viewer only, never exported) */
|
|
551
|
+
var CARD_LABEL = { one: "1", zeroOne: "0..1", many: "*", zeroMany: "0..*" };
|
|
552
|
+
var CARD_WORD = { one: "one", zeroOne: "zero or one", many: "many", zeroMany: "zero or many" };
|
|
553
|
+
|
|
554
|
+
/* Cardinality labels for a lit line: one just past each end, on the side the line leaves from. a end first. */
|
|
555
|
+
function edgeLabels(model, pos, mode, rel, geo) {
|
|
556
|
+
var e = edgeGeom(model, geo || geometry(model, mode), pos, rel);
|
|
557
|
+
if (!e) return null;
|
|
558
|
+
function spot(x, y, dir, card) {
|
|
559
|
+
return { x: n(x + dir * 8), y: n(y - 9), anchor: dir > 0 ? "start" : "end", text: CARD_LABEL[card] || "" };
|
|
560
|
+
}
|
|
561
|
+
return [spot(e.xa, e.ya, e.da, rel.a.card), spot(e.xb, e.yb, e.db, rel.b.card)];
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/* Text of the relationship card for model.rels[i]: the child (FK / many) side first, a plain-English sentence and
|
|
565
|
+
* the JOIN, built like `qdbd path` so quoting and composite keys match. */
|
|
566
|
+
function relCard(model, i) {
|
|
567
|
+
var r = model.rels[i], byId = {};
|
|
568
|
+
model.tables.forEach(function (t) { byId[t.id] = t; });
|
|
569
|
+
var aMany = r.a.card === "many" || r.a.card === "zeroMany", bMany = r.b.card === "many" || r.b.card === "zeroMany";
|
|
570
|
+
var aIsChild = aMany || !bMany, child = aIsChild ? r.a : r.b, parent = aIsChild ? r.b : r.a;
|
|
571
|
+
var pairs = stepPairs(model, i, child.t);
|
|
572
|
+
function side(end, k) {
|
|
573
|
+
var t = byId[end.t], cols = pairs.map(function (p) {
|
|
574
|
+
var c = t.cols.filter(function (x) { return x.id === p[k]; })[0];
|
|
575
|
+
return c ? c.name : p[k];
|
|
576
|
+
});
|
|
577
|
+
return t.name + (cols.length > 1 ? ".(" + cols.join(", ") + ")" : cols.length ? "." + cols[0] : "");
|
|
578
|
+
}
|
|
579
|
+
var plural = child.card === "many" || child.card === "zeroMany";
|
|
580
|
+
return {
|
|
581
|
+
from: side(child, 0),
|
|
582
|
+
to: side(parent, 1),
|
|
583
|
+
cardFrom: CARD_LABEL[child.card] || "",
|
|
584
|
+
cardTo: CARD_LABEL[parent.card] || "",
|
|
585
|
+
sentence: "Each " + byId[parent.t].name + " row has " + CARD_WORD[child.card] + " " + byId[child.t].name + (plural ? " rows" : " row"),
|
|
586
|
+
sql: child.t === parent.t ? selfJoin(byId[child.t], pairs) : pathSql(model, child.t, [{ from: child, to: parent, pairs: pairs }]),
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
/* A table joined to itself needs an alias, or every column is ambiguous. */
|
|
590
|
+
function selfJoin(t, pairs) {
|
|
591
|
+
var name = sqlIdent(t.name), alias = sqlPart(t.name.split(".").pop() + "_2");
|
|
592
|
+
function col(c) { var x = t.cols.filter(function (k) { return k.id === c; })[0]; return sqlPart(x ? x.name : c); }
|
|
593
|
+
var on = pairs.map(function (p) { return alias + "." + col(p[1]) + " = " + name + "." + col(p[0]); });
|
|
594
|
+
return "FROM " + name + "\nJOIN " + name + " AS " + alias + " ON " +
|
|
595
|
+
(on.length ? on.join(" AND ") : "... -- table-level relationship: join columns not specified");
|
|
596
|
+
}
|
|
597
|
+
|
|
550
598
|
root.qdbd = {
|
|
551
599
|
findPath: findPath,
|
|
552
600
|
stepPairs: stepPairs,
|
|
@@ -563,8 +611,12 @@
|
|
|
563
611
|
renderSvg: renderSvg,
|
|
564
612
|
bounds: bounds,
|
|
565
613
|
neighbourhood: neighbourhood,
|
|
614
|
+
edgeLabels: edgeLabels,
|
|
615
|
+
relCard: relCard,
|
|
566
616
|
esc: esc,
|
|
567
617
|
};
|
|
618
|
+
root.qdbdEdgeLabels = edgeLabels;
|
|
619
|
+
root.qdbdRelCard = relCard;
|
|
568
620
|
root.qdbdRenderSvg = renderSvg;
|
|
569
621
|
root.qdbdSelect = select;
|
|
570
622
|
root.qdbdRenderDrawio = renderDrawio;
|
|
@@ -34,6 +34,8 @@
|
|
|
34
34
|
--t-edge: #b8bcc2;
|
|
35
35
|
--row-hl: #dbe6f6;
|
|
36
36
|
--row-hover: #eef3fa;
|
|
37
|
+
--lit: #4361ee;
|
|
38
|
+
--lit-deep: #2a3fb8;
|
|
37
39
|
}
|
|
38
40
|
/* Dark theme. viewer.js sets data-theme from the toggle, or from prefers-color-scheme when it's on auto. */
|
|
39
41
|
:root[data-theme="dark"] {
|
|
@@ -71,6 +73,8 @@
|
|
|
71
73
|
--t-edge: #5b6472;
|
|
72
74
|
--row-hl: #24344d;
|
|
73
75
|
--row-hover: #23282f;
|
|
76
|
+
--lit: #8aa0ff;
|
|
77
|
+
--lit-deep: #c3ceff;
|
|
74
78
|
}
|
|
75
79
|
::selection { background: var(--pick); color: var(--ink); }
|
|
76
80
|
:focus-visible { outline: 2px solid var(--amber); outline-offset: 1px; }
|
|
@@ -82,6 +86,7 @@ html, body { margin: 0; height: 100%; background: var(--bg); color: var(--ink);
|
|
|
82
86
|
#stage { position: relative; flex: 1; overflow: hidden; }
|
|
83
87
|
#canvas { width: 100%; height: 100%; display: block; cursor: grab; touch-action: none; user-select: none; }
|
|
84
88
|
#canvas.panning { cursor: grabbing; }
|
|
89
|
+
#canvas.lod .t text { display: none; } /* big diagram, zoomed out: see LOD_TABLES in viewer.js */
|
|
85
90
|
|
|
86
91
|
/* diagram colours: CSS beats the SVG presentation attributes, so the page can theme them */
|
|
87
92
|
.tb { fill: var(--t-body); stroke: var(--t-border); }
|
|
@@ -104,6 +109,36 @@ html, body { margin: 0; height: 100%; background: var(--bg); color: var(--ink);
|
|
|
104
109
|
.r.hl .rb { fill: var(--row-hl); fill-opacity: 1; }
|
|
105
110
|
.r:hover .rb { fill: var(--row-hover); fill-opacity: 1; }
|
|
106
111
|
.t.flash .tb { stroke: #f0a020; stroke-width: 3; }
|
|
112
|
+
.t .tb { transition: filter .18s; }
|
|
113
|
+
.t:hover .tb { filter: drop-shadow(0 6px 14px rgba(16, 24, 40, .16)); }
|
|
114
|
+
|
|
115
|
+
/* lit relationships: hovered or selected table, hovered or clicked line (viewer.js light()) */
|
|
116
|
+
.e.lit .ep { stroke: var(--lit); stroke-width: 2.2; }
|
|
117
|
+
.e.lit path, .e.lit .mc { stroke: var(--lit); }
|
|
118
|
+
.r.lit .rb { fill: var(--row-hl); fill-opacity: 1; }
|
|
119
|
+
.efocus .t:not(.on) { opacity: .18; }
|
|
120
|
+
.efocus .e:not(.lit) { opacity: .07; }
|
|
121
|
+
.fx { pointer-events: none; }
|
|
122
|
+
.fx .flow { fill: none; stroke: var(--lit-deep); stroke-width: 4; stroke-dasharray: 4 18; animation: qdbd-flow 1.1s linear infinite; }
|
|
123
|
+
.fx .flow.amber { stroke: #b86e00; }
|
|
124
|
+
@keyframes qdbd-flow { to { stroke-dashoffset: -22; } }
|
|
125
|
+
.fx .lbl { font: 600 11px Inter, "Helvetica Neue", Helvetica, Arial, sans-serif; fill: var(--lit); paint-order: stroke;
|
|
126
|
+
stroke: var(--bg); stroke-width: 4px; stroke-linejoin: round; animation: qdbd-fade .2s ease-out; }
|
|
127
|
+
@keyframes qdbd-fade { from { opacity: 0; } }
|
|
128
|
+
.hit path { fill: none; stroke: transparent; stroke-width: 14; pointer-events: stroke; cursor: pointer; }
|
|
129
|
+
/* relationship card (a clicked line) */
|
|
130
|
+
.rcard { position: absolute; z-index: 6; display: none; min-width: 240px; max-width: min(460px, calc(100% - 16px)); padding: 10px 12px;
|
|
131
|
+
background: var(--panel); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); font-size: 12px;
|
|
132
|
+
color: var(--ink); transform-origin: top left; }
|
|
133
|
+
.rcard.open { display: block; animation: qdbd-cardin .16s ease-out; }
|
|
134
|
+
@keyframes qdbd-cardin { from { opacity: 0; transform: scale(.96) translateY(-4px); } }
|
|
135
|
+
.rcard .rt { font-weight: 600; margin-bottom: 2px; word-break: break-word; }
|
|
136
|
+
.rcard .rt b { color: var(--lit); font-weight: 600; padding: 0 6px; white-space: nowrap; }
|
|
137
|
+
.rcard .rk { color: var(--muted); margin-bottom: 8px; }
|
|
138
|
+
.rcard pre { margin: 0 0 8px; padding: 7px 8px; background: var(--bg); border: 1px solid var(--line); border-radius: 7px;
|
|
139
|
+
font: 11px ui-monospace, Menlo, Consolas, monospace; white-space: pre-wrap; user-select: text; }
|
|
140
|
+
.rcard .acts a { color: var(--blue); cursor: pointer; margin-right: 12px; }
|
|
141
|
+
@media (prefers-reduced-motion: reduce) { .fx .flow, .fx .lbl, .rcard.open { animation: none; } }
|
|
107
142
|
.t { cursor: grab; }
|
|
108
143
|
#canvas.panning .t { cursor: grabbing; }
|
|
109
144
|
|
|
@@ -176,8 +211,10 @@ html, body { margin: 0; height: 100%; background: var(--bg); color: var(--ink);
|
|
|
176
211
|
/* details drawer (right) */
|
|
177
212
|
.details { position: absolute; top: 64px; right: 16px; bottom: 16px; width: 380px; background: var(--panel);
|
|
178
213
|
border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); overflow: auto;
|
|
179
|
-
|
|
180
|
-
.
|
|
214
|
+
z-index: 3; padding: 16px 18px; visibility: hidden; opacity: 0; transform: translateX(16px); pointer-events: none;
|
|
215
|
+
transition: opacity .2s, transform .2s, visibility 0s .2s; }
|
|
216
|
+
.details.open { visibility: visible; opacity: 1; transform: none; pointer-events: auto; transition: opacity .2s, transform .2s; }
|
|
217
|
+
@media (prefers-reduced-motion: reduce) { .details, .details.open { transition: none; } }
|
|
181
218
|
.has-details .minimap { right: 412px; }
|
|
182
219
|
.details .close { position: absolute; top: 10px; right: 10px; width: 28px; height: 28px; border: 0; border-radius: 6px;
|
|
183
220
|
background: transparent; display: flex; align-items: center; justify-content: center; color: var(--muted); cursor: pointer; }
|