quickdbd-cli 0.3.1__tar.gz → 0.3.3__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.1 → quickdbd_cli-0.3.3}/.gitignore +1 -0
- quickdbd_cli-0.3.1/README.md → quickdbd_cli-0.3.3/PKG-INFO +58 -5
- quickdbd_cli-0.3.1/PKG-INFO → quickdbd_cli-0.3.3/README.md +20 -34
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/pyproject.toml +11 -2
- quickdbd_cli-0.3.3/src/quickdbd_cli/__init__.py +1 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/agent.py +1 -7
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/style.css +1 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/viewer.js +5 -1
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/cli.py +6 -2
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/export.py +15 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/layout.py +20 -1
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_pipeline.py +20 -0
- quickdbd_cli-0.3.1/src/quickdbd_cli/__init__.py +0 -1
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/LICENSE +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/NOTICE +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/examples/quickdbd-sample.txt +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/examples/synthetic/finance.txt +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/examples/synthetic/hr.txt +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/examples/synthetic/inventory.txt +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/examples/synthetic/marketing.txt +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/examples/synthetic/qdbd.layout.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/examples/synthetic/sales.txt +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/scripts/build_gallery.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/scripts/gen_font_metrics.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/scripts/gen_schema.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/scripts/gen_thumbnails.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/scripts/import_dbml_corpus.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/scripts/release.sh +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/__main__.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-Bold.ttf +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-Bold.woff2 +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-LICENSE.txt +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-Regular.ttf +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-Regular.woff2 +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/editor.js +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/elk-LICENSE.md +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/elk.bundled.js +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/font-metrics.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/render.js +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/syntax-reference.md +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/convert.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/dbml.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/dbt.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/diff.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/html.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/jsrt.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/mcp.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/measure.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/model.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/parser.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/project.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/serve.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/share.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/tags.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/src/quickdbd_cli/targets.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml/team.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/LICENSE +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/README.md +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/alias_of_duplicated_names.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/alias_of_duplicated_names.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/dep.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/dep.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_columns.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_columns.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_enum_field.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_enum_field.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_name.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_name.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_names.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_names.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_table_partial_injections.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_table_partial_injections.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/enum_as_default_column_value.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/enum_as_default_column_value.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/enum_name.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/enum_name.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/erroneous.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/erroneous.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/multiple_notes_in_table_group.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/multiple_notes_in_table_group.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index_table_partial.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index_table_partial.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table_partial.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table_partial.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/ref_validator.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/ref_validator.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/sticky_notes_validator.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/sticky_notes_validator.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/table_partial.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/table_partial.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/unknown_table_group_field.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/unknown_table_group_field.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/array_type.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/array_type.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/checks.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/checks.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_1_inline_1_element.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_1_inline_1_element.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_elements.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_elements.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_inlines.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_inlines.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/column_caller_type.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/column_caller_type.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/comment.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/comment.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/composite_pk.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/composite_pk.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/default_tables.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/default_tables.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_color.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_color.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_duplicate.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_duplicate.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_pipeline.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_pipeline.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/enum_as_default_column_value.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/enum_as_default_column_value.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/enum_tables.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/enum_tables.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/erroneous.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/erroneous.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/general_schema.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/general_schema.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/header_color_tables.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/header_color_tables.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/index_table_partial.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/index_table_partial.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/index_tables.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/index_tables.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/metadata.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/metadata.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/metadata_errors.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/metadata_errors.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/multi_notes.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/multi_notes.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/multiline_string.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/multiline_string.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/negative_number.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/negative_number.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/note_normalize.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/note_normalize.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/note_normalize_with_top_empty_lines.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/note_normalize_with_top_empty_lines.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/old_undocumented_syntax.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/old_undocumented_syntax.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/primary_key.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/primary_key.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/project.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/project.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/ref_name_and_color_setting.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/ref_name_and_color_setting.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/ref_settings.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/ref_settings.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/referential_actions.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/referential_actions.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/self_referential_ref_in_tablepartial.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/self_referential_ref_in_tablepartial.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/sticky_notes.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/sticky_notes.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_element.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_element.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group_element.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group_element.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group_settings.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group_settings.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_partial.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_partial.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_reappear_tablegroup.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_reappear_tablegroup.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_settings.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_settings.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/tablepartial_causing_circular_ref.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/tablepartial_causing_circular_ref.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/two_inline_refs.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/two_inline_refs.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/call_expression.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/call_expression.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/element_in_simple_body.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/element_in_simple_body.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/erroneous_setting.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/erroneous_setting.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/expression.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/expression.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/last_invalid_number.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/last_invalid_number.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/list_expression.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/list_expression.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/trailing_comments.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/trailing_comments.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/tuple_expression.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/tuple_expression.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/checks.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/checks.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/complex_names.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/complex_names.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/dep.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/dep.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/enum.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/enum.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/invalid_args.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/invalid_args.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/public_schema.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/public_schema.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/redefined_note.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/redefined_note.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/ref_error_setting.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/ref_error_setting.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/ref_in_table.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/ref_in_table.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/schema_nested_tablegroup.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/schema_nested_tablegroup.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_group_settings.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_group_settings.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_partial_check.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_partial_check.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_partial_settings_general.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_partial_settings_general.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_settings_check.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_settings_check.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_settings_general.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_settings_general.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/wrong_sub_element_declarations.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/wrong_sub_element_declarations.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/wrong_table_partial_injection_syntax.dbml +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/wrong_table_partial_injection_syntax.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/jaffle/LICENSE +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/jaffle/README.md +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/jaffle/catalog.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/jaffle/manifest.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/targets/cases.json +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_agent.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_convert.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_dbml.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_dbml_pipeline.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_dbt.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_diff.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_gallery.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_mcp.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_packaging.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_parser.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_path.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_render.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_select.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_serve.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_share.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_tags.py +0 -0
- {quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/test_targets.py +0 -0
|
@@ -1,3 +1,41 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: quickdbd-cli
|
|
3
|
+
Version: 0.3.3
|
|
4
|
+
Summary: Compile QuickDBD-syntax schema files into interactive HTML ER diagrams, with no table limit.
|
|
5
|
+
Project-URL: Homepage, https://qdbd.dev/
|
|
6
|
+
Project-URL: Documentation, https://qdbd.dev/guide/
|
|
7
|
+
Project-URL: Source, https://github.com/MarkPhamm/quickdbd-cli
|
|
8
|
+
Project-URL: Changelog, https://github.com/MarkPhamm/quickdbd-cli/releases
|
|
9
|
+
Project-URL: Issues, https://github.com/MarkPhamm/quickdbd-cli/issues
|
|
10
|
+
Author: Minh (Mark) Pham
|
|
11
|
+
License-Expression: Apache-2.0
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
License-File: NOTICE
|
|
14
|
+
License-File: src/quickdbd_cli/assets/Inter-LICENSE.txt
|
|
15
|
+
License-File: src/quickdbd_cli/assets/elk-LICENSE.md
|
|
16
|
+
Keywords: database,dbml,diagram,erd,mcp,quickdbd,schema
|
|
17
|
+
Classifier: Development Status :: 4 - Beta
|
|
18
|
+
Classifier: Environment :: Console
|
|
19
|
+
Classifier: Operating System :: OS Independent
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
24
|
+
Classifier: Topic :: Database
|
|
25
|
+
Classifier: Topic :: Software Development :: Documentation
|
|
26
|
+
Requires-Python: >=3.11
|
|
27
|
+
Requires-Dist: mini-racer>=0.14
|
|
28
|
+
Requires-Dist: resvg-py>=0.5
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: fonttools>=4.50; extra == 'dev'
|
|
31
|
+
Requires-Dist: mcp<3,>=2.3; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
33
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
34
|
+
Provides-Extra: docs
|
|
35
|
+
Requires-Dist: mkdocs-material<10,>=9.5; extra == 'docs'
|
|
36
|
+
Requires-Dist: mkdocs<2,>=1.6; extra == 'docs'
|
|
37
|
+
Description-Content-Type: text/markdown
|
|
38
|
+
|
|
1
39
|
<p align="center">
|
|
2
40
|
<picture>
|
|
3
41
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/MarkPhamm/quickdbd-cli/main/docs/assets/img/logo-wordmark-dark.svg">
|
|
@@ -5,7 +43,22 @@
|
|
|
5
43
|
</picture>
|
|
6
44
|
</p>
|
|
7
45
|
|
|
8
|
-
<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
|
+
|
|
48
|
+
<p align="center">
|
|
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>
|
|
50
|
+
<a href="https://pypi.org/project/quickdbd-cli/"><img src="https://img.shields.io/pypi/pyversions/quickdbd-cli" alt="Python versions"></a>
|
|
51
|
+
<a href="https://github.com/MarkPhamm/quickdbd-cli/actions/workflows/ci.yml?query=branch%3Amain"><img src="https://img.shields.io/github/actions/workflow/status/MarkPhamm/quickdbd-cli/ci.yml?branch=main&label=CI" alt="CI status"></a>
|
|
52
|
+
<a href="https://qdbd.dev/"><img src="https://img.shields.io/github/actions/workflow/status/MarkPhamm/quickdbd-cli/erd.yml?branch=main&label=docs" alt="Docs status"></a>
|
|
53
|
+
<a href="https://pepy.tech/projects/quickdbd-cli"><img src="https://img.shields.io/pepy/dt/quickdbd-cli?label=downloads" alt="Total downloads"></a>
|
|
54
|
+
<br>
|
|
55
|
+
<a href="https://marketplace.visualstudio.com/items?itemName=MarkPhamm.quickdbd"><img src="https://vsmarketplacebadges.dev/version-short/MarkPhamm.quickdbd.svg?label=VS%20Code" alt="VS Code Marketplace version"></a>
|
|
56
|
+
<a href="https://open-vsx.org/extension/MarkPhamm/quickdbd"><img src="https://img.shields.io/open-vsx/v/MarkPhamm/quickdbd?label=Open%20VSX" alt="Open VSX version"></a>
|
|
57
|
+
<a href="https://open-vsx.org/extension/MarkPhamm/quickdbd"><img src="https://img.shields.io/open-vsx/dt/MarkPhamm/quickdbd?label=Open%20VSX%20downloads" alt="Open VSX downloads"></a>
|
|
58
|
+
<a href="https://github.com/MarkPhamm/quickdbd-cli/releases"><img src="https://img.shields.io/github/v/release/MarkPhamm/quickdbd-cli?label=release" alt="Latest release"></a>
|
|
59
|
+
<a href="https://github.com/MarkPhamm/quickdbd-cli/blob/main/LICENSE"><img src="https://img.shields.io/github/license/MarkPhamm/quickdbd-cli" alt="License"></a>
|
|
60
|
+
<a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
|
|
61
|
+
</p>
|
|
9
62
|
|
|
10
63
|
<p align="center">
|
|
11
64
|
<a href="https://qdbd.dev/">Docs</a> · <a href="https://qdbd.dev/demo/">Live demos</a> · <a href="#quickstart">Quickstart</a> · <a href="https://pypi.org/project/quickdbd-cli/">PyPI</a> · <a href="https://marketplace.visualstudio.com/items?itemName=MarkPhamm.quickdbd">VS Code Marketplace</a> · <a href="https://open-vsx.org/extension/MarkPhamm/quickdbd">Open VSX</a>
|
|
@@ -36,7 +89,7 @@ qdbd is not affiliated with QuickDBD or dbdiagram.io. It reads the same text syn
|
|
|
36
89
|
- **QuickDBD-compatible**: the parser mirrors QuickDBD's own, error messages included. A file that passes `qdbd check --strict` pastes into QuickDBD unchanged.
|
|
37
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.
|
|
38
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.
|
|
39
|
-
- **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)).
|
|
40
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/)).
|
|
41
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/)).
|
|
42
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.
|
|
@@ -133,7 +186,7 @@ jobs:
|
|
|
133
186
|
permissions: { contents: read, pull-requests: write }
|
|
134
187
|
steps:
|
|
135
188
|
- uses: actions/checkout@v4
|
|
136
|
-
- uses: MarkPhamm/quickdbd-cli@v0.
|
|
189
|
+
- uses: MarkPhamm/quickdbd-cli@v0.3.3
|
|
137
190
|
with:
|
|
138
191
|
path: erd/ # schema file(s) or folder(s)
|
|
139
192
|
output: site/index.html
|
|
@@ -145,7 +198,7 @@ dbt projects, GitHub Pages, pre-commit and GitLab CI are covered in [CI and Auto
|
|
|
145
198
|
|
|
146
199
|
```text
|
|
147
200
|
dbt project ──qdbd import dbt──┐
|
|
148
|
-
├──▶ schema/*.txt (QuickDBD syntax, in git)
|
|
201
|
+
├──▶ schema/*.txt, *.dbml (QuickDBD syntax or DBML, in git)
|
|
149
202
|
hand-written / pasted ─────────┘ │
|
|
150
203
|
├──▶ qdbd check validation, QuickDBD's error messages ──▶ CI gate
|
|
151
204
|
├──▶ qdbd serve live editor, drag to arrange ──▶ schema.layout.json
|
|
@@ -187,7 +240,7 @@ qdbd build schema/ -o erd.html
|
|
|
187
240
|
|
|
188
241
|
| | qdbd | QuickDBD |
|
|
189
242
|
|---|---|---|
|
|
190
|
-
| Text syntax | QuickDBD's | QuickDBD's |
|
|
243
|
+
| Text syntax | QuickDBD's or DBML | QuickDBD's |
|
|
191
244
|
| Tables per diagram | no limit | 10 on the free plan |
|
|
192
245
|
| Where it runs | your terminal and CI; the result is a static HTML file | the QuickDBD web app |
|
|
193
246
|
| Where the schema lives | `.txt` / `.dbml` files in your git repo | the web app |
|
|
@@ -1,32 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.5
|
|
2
|
-
Name: quickdbd-cli
|
|
3
|
-
Version: 0.3.1
|
|
4
|
-
Summary: Compile QuickDBD-syntax schema files into interactive HTML ER diagrams, with no table limit.
|
|
5
|
-
Project-URL: Homepage, https://github.com/MarkPhamm/quickdbd-cli
|
|
6
|
-
Author: Minh (Mark) Pham
|
|
7
|
-
License-Expression: Apache-2.0
|
|
8
|
-
License-File: LICENSE
|
|
9
|
-
License-File: NOTICE
|
|
10
|
-
License-File: src/quickdbd_cli/assets/Inter-LICENSE.txt
|
|
11
|
-
License-File: src/quickdbd_cli/assets/elk-LICENSE.md
|
|
12
|
-
Keywords: database,dbml,diagram,erd,mcp,quickdbd,schema
|
|
13
|
-
Classifier: Environment :: Console
|
|
14
|
-
Classifier: Programming Language :: Python :: 3
|
|
15
|
-
Classifier: Topic :: Database
|
|
16
|
-
Classifier: Topic :: Software Development :: Documentation
|
|
17
|
-
Requires-Python: >=3.11
|
|
18
|
-
Requires-Dist: mini-racer>=0.14
|
|
19
|
-
Requires-Dist: resvg-py>=0.5
|
|
20
|
-
Provides-Extra: dev
|
|
21
|
-
Requires-Dist: fonttools>=4.50; extra == 'dev'
|
|
22
|
-
Requires-Dist: mcp<3,>=2.3; extra == 'dev'
|
|
23
|
-
Requires-Dist: pytest>=8; extra == 'dev'
|
|
24
|
-
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
25
|
-
Provides-Extra: docs
|
|
26
|
-
Requires-Dist: mkdocs-material<10,>=9.5; extra == 'docs'
|
|
27
|
-
Requires-Dist: mkdocs<2,>=1.6; extra == 'docs'
|
|
28
|
-
Description-Content-Type: text/markdown
|
|
29
|
-
|
|
30
1
|
<p align="center">
|
|
31
2
|
<picture>
|
|
32
3
|
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/MarkPhamm/quickdbd-cli/main/docs/assets/img/logo-wordmark-dark.svg">
|
|
@@ -34,7 +5,22 @@ Description-Content-Type: text/markdown
|
|
|
34
5
|
</picture>
|
|
35
6
|
</p>
|
|
36
7
|
|
|
37
|
-
<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
|
+
|
|
10
|
+
<p align="center">
|
|
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>
|
|
12
|
+
<a href="https://pypi.org/project/quickdbd-cli/"><img src="https://img.shields.io/pypi/pyversions/quickdbd-cli" alt="Python versions"></a>
|
|
13
|
+
<a href="https://github.com/MarkPhamm/quickdbd-cli/actions/workflows/ci.yml?query=branch%3Amain"><img src="https://img.shields.io/github/actions/workflow/status/MarkPhamm/quickdbd-cli/ci.yml?branch=main&label=CI" alt="CI status"></a>
|
|
14
|
+
<a href="https://qdbd.dev/"><img src="https://img.shields.io/github/actions/workflow/status/MarkPhamm/quickdbd-cli/erd.yml?branch=main&label=docs" alt="Docs status"></a>
|
|
15
|
+
<a href="https://pepy.tech/projects/quickdbd-cli"><img src="https://img.shields.io/pepy/dt/quickdbd-cli?label=downloads" alt="Total downloads"></a>
|
|
16
|
+
<br>
|
|
17
|
+
<a href="https://marketplace.visualstudio.com/items?itemName=MarkPhamm.quickdbd"><img src="https://vsmarketplacebadges.dev/version-short/MarkPhamm.quickdbd.svg?label=VS%20Code" alt="VS Code Marketplace version"></a>
|
|
18
|
+
<a href="https://open-vsx.org/extension/MarkPhamm/quickdbd"><img src="https://img.shields.io/open-vsx/v/MarkPhamm/quickdbd?label=Open%20VSX" alt="Open VSX version"></a>
|
|
19
|
+
<a href="https://open-vsx.org/extension/MarkPhamm/quickdbd"><img src="https://img.shields.io/open-vsx/dt/MarkPhamm/quickdbd?label=Open%20VSX%20downloads" alt="Open VSX downloads"></a>
|
|
20
|
+
<a href="https://github.com/MarkPhamm/quickdbd-cli/releases"><img src="https://img.shields.io/github/v/release/MarkPhamm/quickdbd-cli?label=release" alt="Latest release"></a>
|
|
21
|
+
<a href="https://github.com/MarkPhamm/quickdbd-cli/blob/main/LICENSE"><img src="https://img.shields.io/github/license/MarkPhamm/quickdbd-cli" alt="License"></a>
|
|
22
|
+
<a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Ruff"></a>
|
|
23
|
+
</p>
|
|
38
24
|
|
|
39
25
|
<p align="center">
|
|
40
26
|
<a href="https://qdbd.dev/">Docs</a> · <a href="https://qdbd.dev/demo/">Live demos</a> · <a href="#quickstart">Quickstart</a> · <a href="https://pypi.org/project/quickdbd-cli/">PyPI</a> · <a href="https://marketplace.visualstudio.com/items?itemName=MarkPhamm.quickdbd">VS Code Marketplace</a> · <a href="https://open-vsx.org/extension/MarkPhamm/quickdbd">Open VSX</a>
|
|
@@ -65,7 +51,7 @@ qdbd is not affiliated with QuickDBD or dbdiagram.io. It reads the same text syn
|
|
|
65
51
|
- **QuickDBD-compatible**: the parser mirrors QuickDBD's own, error messages included. A file that passes `qdbd check --strict` pastes into QuickDBD unchanged.
|
|
66
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.
|
|
67
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.
|
|
68
|
-
- **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)).
|
|
69
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/)).
|
|
70
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/)).
|
|
71
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.
|
|
@@ -162,7 +148,7 @@ jobs:
|
|
|
162
148
|
permissions: { contents: read, pull-requests: write }
|
|
163
149
|
steps:
|
|
164
150
|
- uses: actions/checkout@v4
|
|
165
|
-
- uses: MarkPhamm/quickdbd-cli@v0.
|
|
151
|
+
- uses: MarkPhamm/quickdbd-cli@v0.3.3
|
|
166
152
|
with:
|
|
167
153
|
path: erd/ # schema file(s) or folder(s)
|
|
168
154
|
output: site/index.html
|
|
@@ -174,7 +160,7 @@ dbt projects, GitHub Pages, pre-commit and GitLab CI are covered in [CI and Auto
|
|
|
174
160
|
|
|
175
161
|
```text
|
|
176
162
|
dbt project ──qdbd import dbt──┐
|
|
177
|
-
├──▶ schema/*.txt (QuickDBD syntax, in git)
|
|
163
|
+
├──▶ schema/*.txt, *.dbml (QuickDBD syntax or DBML, in git)
|
|
178
164
|
hand-written / pasted ─────────┘ │
|
|
179
165
|
├──▶ qdbd check validation, QuickDBD's error messages ──▶ CI gate
|
|
180
166
|
├──▶ qdbd serve live editor, drag to arrange ──▶ schema.layout.json
|
|
@@ -216,7 +202,7 @@ qdbd build schema/ -o erd.html
|
|
|
216
202
|
|
|
217
203
|
| | qdbd | QuickDBD |
|
|
218
204
|
|---|---|---|
|
|
219
|
-
| Text syntax | QuickDBD's | QuickDBD's |
|
|
205
|
+
| Text syntax | QuickDBD's or DBML | QuickDBD's |
|
|
220
206
|
| Tables per diagram | no limit | 10 on the free plan |
|
|
221
207
|
| Where it runs | your terminal and CI; the result is a static HTML file | the QuickDBD web app |
|
|
222
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.3"
|
|
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"
|
|
@@ -13,7 +13,12 @@ requires-python = ">=3.11"
|
|
|
13
13
|
authors = [{ name = "Minh (Mark) Pham" }]
|
|
14
14
|
keywords = ["erd", "database", "diagram", "quickdbd", "schema", "dbml", "mcp"]
|
|
15
15
|
classifiers = [
|
|
16
|
+
"Development Status :: 4 - Beta",
|
|
16
17
|
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.11",
|
|
19
|
+
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Programming Language :: Python :: 3.13",
|
|
21
|
+
"Operating System :: OS Independent",
|
|
17
22
|
"Environment :: Console",
|
|
18
23
|
"Topic :: Database",
|
|
19
24
|
"Topic :: Software Development :: Documentation",
|
|
@@ -31,7 +36,11 @@ docs = ["mkdocs>=1.6,<2", "mkdocs-material>=9.5,<10"]
|
|
|
31
36
|
qdbd = "quickdbd_cli.cli:main"
|
|
32
37
|
|
|
33
38
|
[project.urls]
|
|
34
|
-
Homepage = "https://
|
|
39
|
+
Homepage = "https://qdbd.dev/"
|
|
40
|
+
Documentation = "https://qdbd.dev/guide/"
|
|
41
|
+
Source = "https://github.com/MarkPhamm/quickdbd-cli"
|
|
42
|
+
Changelog = "https://github.com/MarkPhamm/quickdbd-cli/releases"
|
|
43
|
+
Issues = "https://github.com/MarkPhamm/quickdbd-cli/issues"
|
|
35
44
|
|
|
36
45
|
[tool.hatch.build.targets.wheel]
|
|
37
46
|
packages = ["src/quickdbd_cli"]
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.3.3"
|
|
@@ -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 "")
|
|
@@ -82,6 +82,7 @@ html, body { margin: 0; height: 100%; background: var(--bg); color: var(--ink);
|
|
|
82
82
|
#stage { position: relative; flex: 1; overflow: hidden; }
|
|
83
83
|
#canvas { width: 100%; height: 100%; display: block; cursor: grab; touch-action: none; user-select: none; }
|
|
84
84
|
#canvas.panning { cursor: grabbing; }
|
|
85
|
+
#canvas.lod .t text { display: none; } /* big diagram, zoomed out: see LOD_TABLES in viewer.js */
|
|
85
86
|
|
|
86
87
|
/* diagram colours: CSS beats the SVG presentation attributes, so the page can theme them */
|
|
87
88
|
.tb { fill: var(--t-body); stroke: var(--t-border); }
|
|
@@ -40,9 +40,13 @@
|
|
|
40
40
|
applyFocus();
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
// Zoomed out on a big diagram, table text is unreadable but repainting it made every zoom step take ~150 ms
|
|
44
|
+
// at 1000 tables, so it is hidden there. Smaller diagrams always show it.
|
|
45
|
+
var LOD_TABLES = 300, LOD_ZOOM = 0.3;
|
|
43
46
|
function applyView() {
|
|
44
47
|
var v = S.view;
|
|
45
48
|
vp.setAttribute("transform", "translate(" + v.x + "," + v.y + ") scale(" + v.k + ")");
|
|
49
|
+
svg.classList.toggle("lod", v.k < LOD_ZOOM && S.vm.tables.length > LOD_TABLES);
|
|
46
50
|
zoomval.textContent = Math.round(v.k * 100) + "%";
|
|
47
51
|
drawViewportRect();
|
|
48
52
|
scheduleHash();
|
|
@@ -806,7 +810,7 @@
|
|
|
806
810
|
try {
|
|
807
811
|
if (p.has("m")) setMode(p.get("m"));
|
|
808
812
|
if (p.has("r")) setRegions(p.get("r") === "1");
|
|
809
|
-
applyFilter(p.get("f") || "", true);
|
|
813
|
+
if ((p.get("f") || "") !== S.filter) applyFilter(p.get("f") || "", true); // else already rendered
|
|
810
814
|
var name = p.get("t"), id = null;
|
|
811
815
|
if (name) S.model.tables.forEach(function (t) { if (t.name === name) id = t.id; });
|
|
812
816
|
select(id && S.shown[id] ? id : null);
|
|
@@ -216,7 +216,11 @@ def cmd_export(args) -> int:
|
|
|
216
216
|
if fmt == "svg":
|
|
217
217
|
out.write_text(svg, encoding="utf-8")
|
|
218
218
|
else:
|
|
219
|
-
|
|
219
|
+
scale = export.png_scale(svg, args.scale)
|
|
220
|
+
if scale < args.scale:
|
|
221
|
+
note = f"--scale lowered to {scale:.2f} to keep the PNG within {export.MAX_PNG_SIDE} px"
|
|
222
|
+
print(f"note: {note}", file=sys.stderr)
|
|
223
|
+
out.write_bytes(export.svg_to_png(svg, scale))
|
|
220
224
|
print(f"Wrote {out} ({len(only) if only else len(model['tables'])} tables)")
|
|
221
225
|
return 0
|
|
222
226
|
|
|
@@ -532,7 +536,7 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
532
536
|
action="append",
|
|
533
537
|
metavar="SELECTOR",
|
|
534
538
|
help="dbt-style: name glob, +name (and what it references), name+ (and what references it), "
|
|
535
|
-
"N+name+N (hops), group:/file:/col: methods, a,b intersects (repeatable)",
|
|
539
|
+
"N+name+N (hops), group:/file:/col:/tag: methods, a,b intersects (repeatable)",
|
|
536
540
|
)
|
|
537
541
|
sp.add_argument("--exclude", action="append", metavar="SELECTOR", help="drop tables matching (repeatable)")
|
|
538
542
|
|
|
@@ -3,12 +3,16 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import base64
|
|
6
|
+
import re
|
|
6
7
|
from functools import cache
|
|
7
8
|
from importlib import resources
|
|
8
9
|
|
|
9
10
|
from . import layout
|
|
10
11
|
from .jsrt import runtime
|
|
11
12
|
|
|
13
|
+
# A 200-table diagram at scale 2 is 17506x15274 px: 15 s to encode, and too big for many image viewers.
|
|
14
|
+
MAX_PNG_SIDE = 16384
|
|
15
|
+
|
|
12
16
|
|
|
13
17
|
def _asset_bytes(name: str) -> bytes:
|
|
14
18
|
return resources.files("quickdbd_cli").joinpath(f"assets/{name}").read_bytes()
|
|
@@ -85,6 +89,17 @@ def focus_positions(model: dict, positions: dict, ids: list[str]) -> dict:
|
|
|
85
89
|
return {k: [v[0], v[1]] for k, v in pos.items()}
|
|
86
90
|
|
|
87
91
|
|
|
92
|
+
def svg_size(svg: str) -> tuple[float, float]:
|
|
93
|
+
w = re.search(r'\bwidth="([\d.]+)', svg)
|
|
94
|
+
h = re.search(r'\bheight="([\d.]+)', svg)
|
|
95
|
+
return (float(w.group(1)) if w else 1000.0, float(h.group(1)) if h else 1000.0)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def png_scale(svg: str, scale: float) -> float:
|
|
99
|
+
"""``scale``, lowered so the PNG's longest side stays within MAX_PNG_SIDE pixels."""
|
|
100
|
+
return min(scale, MAX_PNG_SIDE / max(svg_size(svg)))
|
|
101
|
+
|
|
102
|
+
|
|
88
103
|
def svg_to_png(svg: str, scale: float = 2.0) -> bytes:
|
|
89
104
|
import resvg_py
|
|
90
105
|
|
|
@@ -32,6 +32,10 @@ OVERLAP_OPTIONS = {
|
|
|
32
32
|
"elk.spacing.nodeNode": "40",
|
|
33
33
|
"elk.randomSeed": "1",
|
|
34
34
|
}
|
|
35
|
+
# Overlap removal takes most of a big layout (25 of 37 s at 1000 tables). Above BIG_LAYOUT tables its
|
|
36
|
+
# iterations are capped, and the few tables it leaves overlapping are moved by `_separate`.
|
|
37
|
+
BIG_LAYOUT = 300
|
|
38
|
+
BIG_OVERLAP_OPTIONS = {**OVERLAP_OPTIONS, "org.eclipse.elk.overlapRemoval.maxIterations": "8"}
|
|
35
39
|
|
|
36
40
|
MARGIN = 30
|
|
37
41
|
Positions = dict[str, tuple[int, int]]
|
|
@@ -64,9 +68,10 @@ def elk_layout(tables: list[dict], rels: list[dict], timeout_sec: float | None =
|
|
|
64
68
|
}
|
|
65
69
|
first = rt.call_async("qdbdElkLayout", graph, timeout_sec=timeout_sec)
|
|
66
70
|
first = _landscape(tables, {k: (v[0], v[1]) for k, v in first.items()})
|
|
71
|
+
big = len(tables) > BIG_LAYOUT
|
|
67
72
|
graph = {
|
|
68
73
|
"id": "root",
|
|
69
|
-
"layoutOptions": OVERLAP_OPTIONS,
|
|
74
|
+
"layoutOptions": BIG_OVERLAP_OPTIONS if big else OVERLAP_OPTIONS,
|
|
70
75
|
"children": [
|
|
71
76
|
{"id": t["id"], "width": t["w"], "height": t["h"], "x": first[t["id"]][0], "y": first[t["id"]][1]}
|
|
72
77
|
for t in tables
|
|
@@ -74,6 +79,8 @@ def elk_layout(tables: list[dict], rels: list[dict], timeout_sec: float | None =
|
|
|
74
79
|
"edges": [],
|
|
75
80
|
}
|
|
76
81
|
raw = rt.call_async("qdbdElkLayout", graph, timeout_sec=timeout_sec)
|
|
82
|
+
if big:
|
|
83
|
+
raw = _separate(tables, raw)
|
|
77
84
|
min_x = min(v[0] for v in raw.values())
|
|
78
85
|
min_y = min(v[1] for v in raw.values())
|
|
79
86
|
return {k: (int(v[0] - min_x), int(v[1] - min_y)) for k, v in raw.items()}
|
|
@@ -155,6 +162,18 @@ def _free_spot(cx: float, cy: float, w: float, h: float, rects, step: int = 30)
|
|
|
155
162
|
return int(round(x0)), int(round(y0))
|
|
156
163
|
|
|
157
164
|
|
|
165
|
+
def _separate(tables: list[dict], pos: dict) -> dict:
|
|
166
|
+
"""Move each table that overlaps an earlier one to the nearest free spot."""
|
|
167
|
+
out, rects = {}, []
|
|
168
|
+
for t in tables:
|
|
169
|
+
x, y = pos[t["id"]]
|
|
170
|
+
if _overlaps(x, y, t["w"], t["h"], rects):
|
|
171
|
+
x, y = _free_spot(x + t["w"] / 2, y + t["h"] / 2, t["w"], t["h"], rects)
|
|
172
|
+
out[t["id"]] = (x, y)
|
|
173
|
+
rects.append((x, y, t["w"], t["h"]))
|
|
174
|
+
return out
|
|
175
|
+
|
|
176
|
+
|
|
158
177
|
def place_missing(tables: list[dict], rels: list[dict], positions: Positions) -> Positions:
|
|
159
178
|
"""Positions for every table. Existing positions never move.
|
|
160
179
|
|
|
@@ -57,6 +57,16 @@ def test_elk_layout_deterministic_and_non_overlapping():
|
|
|
57
57
|
assert not any(_overlap(r1, r2) for i, r1 in enumerate(rects) for r2 in rects[i + 1 :])
|
|
58
58
|
|
|
59
59
|
|
|
60
|
+
def test_big_layout_caps_overlap_removal_and_still_separates(monkeypatch):
|
|
61
|
+
monkeypatch.setattr(layout, "BIG_LAYOUT", 100) # take the >BIG_LAYOUT path on the 200-table schema
|
|
62
|
+
m = model_json(Project.open([SYNTH]).compile())
|
|
63
|
+
a = layout.elk_layout(m["tables"], m["rels"])
|
|
64
|
+
assert a == layout.elk_layout(m["tables"], m["rels"]) and len(a) == 200
|
|
65
|
+
by = {t["id"]: t for t in m["tables"]}
|
|
66
|
+
rects = [(x, y, by[k]["w"], by[k]["h"]) for k, (x, y) in a.items()]
|
|
67
|
+
assert not any(_overlap(r1, r2) for i, r1 in enumerate(rects) for r2 in rects[i + 1 :])
|
|
68
|
+
|
|
69
|
+
|
|
60
70
|
def test_place_missing_keeps_existing_and_avoids_overlap():
|
|
61
71
|
m = model_json(compile_text(SMALL + "\nLine\n-\nId PK int\nOrderId int FK >- Order.OrderId\n"))
|
|
62
72
|
fixed = {"Customer": (0, 0), "Order": (400, 0)}
|
|
@@ -114,6 +124,16 @@ def test_png_export(tmp_path):
|
|
|
114
124
|
assert out.read_bytes()[:8] == b"\x89PNG\r\n\x1a\n"
|
|
115
125
|
|
|
116
126
|
|
|
127
|
+
def test_png_export_caps_size(tmp_path, monkeypatch, capsys):
|
|
128
|
+
monkeypatch.setattr(export, "MAX_PNG_SIDE", 300)
|
|
129
|
+
out = tmp_path / "c.png"
|
|
130
|
+
assert main(["export", str(SAMPLE), "-o", str(out)]) == 0
|
|
131
|
+
head = out.read_bytes()
|
|
132
|
+
w, h = int.from_bytes(head[16:20], "big"), int.from_bytes(head[20:24], "big")
|
|
133
|
+
assert max(w, h) <= 300
|
|
134
|
+
assert "--scale lowered" in capsys.readouterr().err
|
|
135
|
+
|
|
136
|
+
|
|
117
137
|
# ------------------------------------------------------------------ CLI
|
|
118
138
|
|
|
119
139
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.3.1"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_columns.dbml
RENAMED
|
File without changes
|
{quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_columns.json
RENAMED
|
File without changes
|
{quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_enum_field.dbml
RENAMED
|
File without changes
|
{quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_enum_field.json
RENAMED
|
File without changes
|
{quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_name.dbml
RENAMED
|
File without changes
|
{quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_name.json
RENAMED
|
File without changes
|
{quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_names.dbml
RENAMED
|
File without changes
|
{quickdbd_cli-0.3.1 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_names.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|