quickdbd-cli 0.3.2__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.
Files changed (256) hide show
  1. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/.gitignore +1 -0
  2. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/PKG-INFO +6 -6
  3. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/README.md +5 -5
  4. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/pyproject.toml +1 -1
  5. quickdbd_cli-0.3.3/src/quickdbd_cli/__init__.py +1 -0
  6. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/agent.py +1 -7
  7. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/style.css +1 -0
  8. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/viewer.js +5 -1
  9. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/cli.py +6 -2
  10. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/export.py +15 -0
  11. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/layout.py +20 -1
  12. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_pipeline.py +20 -0
  13. quickdbd_cli-0.3.2/src/quickdbd_cli/__init__.py +0 -1
  14. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/LICENSE +0 -0
  15. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/NOTICE +0 -0
  16. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/examples/quickdbd-sample.txt +0 -0
  17. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/examples/synthetic/finance.txt +0 -0
  18. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/examples/synthetic/hr.txt +0 -0
  19. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/examples/synthetic/inventory.txt +0 -0
  20. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/examples/synthetic/marketing.txt +0 -0
  21. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/examples/synthetic/qdbd.layout.json +0 -0
  22. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/examples/synthetic/sales.txt +0 -0
  23. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/scripts/build_gallery.py +0 -0
  24. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/scripts/gen_font_metrics.py +0 -0
  25. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/scripts/gen_schema.py +0 -0
  26. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/scripts/gen_thumbnails.py +0 -0
  27. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/scripts/import_dbml_corpus.py +0 -0
  28. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/scripts/release.sh +0 -0
  29. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/__main__.py +0 -0
  30. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-Bold.ttf +0 -0
  31. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-Bold.woff2 +0 -0
  32. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-LICENSE.txt +0 -0
  33. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-Regular.ttf +0 -0
  34. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/Inter-Regular.woff2 +0 -0
  35. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/editor.js +0 -0
  36. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/elk-LICENSE.md +0 -0
  37. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/elk.bundled.js +0 -0
  38. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/font-metrics.json +0 -0
  39. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/render.js +0 -0
  40. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/assets/syntax-reference.md +0 -0
  41. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/convert.py +0 -0
  42. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/dbml.py +0 -0
  43. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/dbt.py +0 -0
  44. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/diff.py +0 -0
  45. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/html.py +0 -0
  46. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/jsrt.py +0 -0
  47. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/mcp.py +0 -0
  48. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/measure.py +0 -0
  49. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/model.py +0 -0
  50. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/parser.py +0 -0
  51. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/project.py +0 -0
  52. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/serve.py +0 -0
  53. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/share.py +0 -0
  54. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/tags.py +0 -0
  55. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/src/quickdbd_cli/targets.py +0 -0
  56. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml/team.dbml +0 -0
  57. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/LICENSE +0 -0
  58. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/README.md +0 -0
  59. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/alias_of_duplicated_names.dbml +0 -0
  60. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/alias_of_duplicated_names.json +0 -0
  61. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/dep.dbml +0 -0
  62. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/dep.json +0 -0
  63. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_columns.dbml +0 -0
  64. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_columns.json +0 -0
  65. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_enum_field.dbml +0 -0
  66. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_enum_field.json +0 -0
  67. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_name.dbml +0 -0
  68. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_name.json +0 -0
  69. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_names.dbml +0 -0
  70. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_names.json +0 -0
  71. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_table_partial_injections.dbml +0 -0
  72. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/duplicate_table_partial_injections.json +0 -0
  73. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/enum_as_default_column_value.dbml +0 -0
  74. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/enum_as_default_column_value.json +0 -0
  75. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/enum_name.dbml +0 -0
  76. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/enum_name.json +0 -0
  77. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/erroneous.dbml +0 -0
  78. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/erroneous.json +0 -0
  79. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/multiple_notes_in_table_group.dbml +0 -0
  80. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/multiple_notes_in_table_group.json +0 -0
  81. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index.dbml +0 -0
  82. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index.json +0 -0
  83. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index_table_partial.dbml +0 -0
  84. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_column_in_index_table_partial.json +0 -0
  85. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table.dbml +0 -0
  86. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table.json +0 -0
  87. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table_partial.dbml +0 -0
  88. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/nonexisting_inline_ref_column_in_table_partial.json +0 -0
  89. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/ref_validator.dbml +0 -0
  90. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/ref_validator.json +0 -0
  91. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/sticky_notes_validator.dbml +0 -0
  92. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/sticky_notes_validator.json +0 -0
  93. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/table_partial.dbml +0 -0
  94. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/table_partial.json +0 -0
  95. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/unknown_table_group_field.dbml +0 -0
  96. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/binder/unknown_table_group_field.json +0 -0
  97. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/array_type.dbml +0 -0
  98. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/array_type.json +0 -0
  99. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/checks.dbml +0 -0
  100. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/checks.json +0 -0
  101. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_1_inline_1_element.dbml +0 -0
  102. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_1_inline_1_element.json +0 -0
  103. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_elements.dbml +0 -0
  104. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_elements.json +0 -0
  105. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_inlines.dbml +0 -0
  106. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/circular_ref_2_inlines.json +0 -0
  107. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/column_caller_type.dbml +0 -0
  108. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/column_caller_type.json +0 -0
  109. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/comment.dbml +0 -0
  110. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/comment.json +0 -0
  111. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/composite_pk.dbml +0 -0
  112. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/composite_pk.json +0 -0
  113. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/default_tables.dbml +0 -0
  114. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/default_tables.json +0 -0
  115. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep.dbml +0 -0
  116. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep.json +0 -0
  117. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_color.dbml +0 -0
  118. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_color.json +0 -0
  119. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_duplicate.dbml +0 -0
  120. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_duplicate.json +0 -0
  121. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_pipeline.dbml +0 -0
  122. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/dep_pipeline.json +0 -0
  123. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/enum_as_default_column_value.dbml +0 -0
  124. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/enum_as_default_column_value.json +0 -0
  125. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/enum_tables.dbml +0 -0
  126. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/enum_tables.json +0 -0
  127. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/erroneous.dbml +0 -0
  128. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/erroneous.json +0 -0
  129. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/general_schema.dbml +0 -0
  130. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/general_schema.json +0 -0
  131. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/header_color_tables.dbml +0 -0
  132. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/header_color_tables.json +0 -0
  133. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/index_table_partial.dbml +0 -0
  134. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/index_table_partial.json +0 -0
  135. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/index_tables.dbml +0 -0
  136. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/index_tables.json +0 -0
  137. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/metadata.dbml +0 -0
  138. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/metadata.json +0 -0
  139. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/metadata_errors.dbml +0 -0
  140. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/metadata_errors.json +0 -0
  141. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/multi_notes.dbml +0 -0
  142. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/multi_notes.json +0 -0
  143. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/multiline_string.dbml +0 -0
  144. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/multiline_string.json +0 -0
  145. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/negative_number.dbml +0 -0
  146. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/negative_number.json +0 -0
  147. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/note_normalize.dbml +0 -0
  148. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/note_normalize.json +0 -0
  149. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/note_normalize_with_top_empty_lines.dbml +0 -0
  150. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/note_normalize_with_top_empty_lines.json +0 -0
  151. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/old_undocumented_syntax.dbml +0 -0
  152. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/old_undocumented_syntax.json +0 -0
  153. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/primary_key.dbml +0 -0
  154. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/primary_key.json +0 -0
  155. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/project.dbml +0 -0
  156. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/project.json +0 -0
  157. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/ref_name_and_color_setting.dbml +0 -0
  158. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/ref_name_and_color_setting.json +0 -0
  159. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/ref_settings.dbml +0 -0
  160. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/ref_settings.json +0 -0
  161. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/referential_actions.dbml +0 -0
  162. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/referential_actions.json +0 -0
  163. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/self_referential_ref_in_tablepartial.dbml +0 -0
  164. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/self_referential_ref_in_tablepartial.json +0 -0
  165. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/sticky_notes.dbml +0 -0
  166. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/sticky_notes.json +0 -0
  167. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_element.dbml +0 -0
  168. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_element.json +0 -0
  169. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group.dbml +0 -0
  170. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group.json +0 -0
  171. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group_element.dbml +0 -0
  172. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group_element.json +0 -0
  173. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group_settings.dbml +0 -0
  174. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_group_settings.json +0 -0
  175. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_partial.dbml +0 -0
  176. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_partial.json +0 -0
  177. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_reappear_tablegroup.dbml +0 -0
  178. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_reappear_tablegroup.json +0 -0
  179. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_settings.dbml +0 -0
  180. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/table_settings.json +0 -0
  181. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/tablepartial_causing_circular_ref.dbml +0 -0
  182. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/tablepartial_causing_circular_ref.json +0 -0
  183. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/two_inline_refs.dbml +0 -0
  184. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/interpreter/two_inline_refs.json +0 -0
  185. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/call_expression.dbml +0 -0
  186. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/call_expression.json +0 -0
  187. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/element_in_simple_body.dbml +0 -0
  188. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/element_in_simple_body.json +0 -0
  189. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/erroneous_setting.dbml +0 -0
  190. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/erroneous_setting.json +0 -0
  191. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/expression.dbml +0 -0
  192. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/expression.json +0 -0
  193. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/last_invalid_number.dbml +0 -0
  194. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/last_invalid_number.json +0 -0
  195. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/list_expression.dbml +0 -0
  196. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/list_expression.json +0 -0
  197. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/trailing_comments.dbml +0 -0
  198. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/trailing_comments.json +0 -0
  199. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/tuple_expression.dbml +0 -0
  200. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/parser/tuple_expression.json +0 -0
  201. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/checks.dbml +0 -0
  202. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/checks.json +0 -0
  203. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/complex_names.dbml +0 -0
  204. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/complex_names.json +0 -0
  205. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/dep.dbml +0 -0
  206. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/dep.json +0 -0
  207. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/enum.dbml +0 -0
  208. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/enum.json +0 -0
  209. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/invalid_args.dbml +0 -0
  210. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/invalid_args.json +0 -0
  211. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/public_schema.dbml +0 -0
  212. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/public_schema.json +0 -0
  213. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/redefined_note.dbml +0 -0
  214. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/redefined_note.json +0 -0
  215. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/ref_error_setting.dbml +0 -0
  216. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/ref_error_setting.json +0 -0
  217. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/ref_in_table.dbml +0 -0
  218. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/ref_in_table.json +0 -0
  219. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/schema_nested_tablegroup.dbml +0 -0
  220. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/schema_nested_tablegroup.json +0 -0
  221. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_group_settings.dbml +0 -0
  222. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_group_settings.json +0 -0
  223. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_partial_check.dbml +0 -0
  224. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_partial_check.json +0 -0
  225. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_partial_settings_general.dbml +0 -0
  226. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_partial_settings_general.json +0 -0
  227. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_settings_check.dbml +0 -0
  228. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_settings_check.json +0 -0
  229. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_settings_general.dbml +0 -0
  230. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/table_settings_general.json +0 -0
  231. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/wrong_sub_element_declarations.dbml +0 -0
  232. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/wrong_sub_element_declarations.json +0 -0
  233. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/wrong_table_partial_injection_syntax.dbml +0 -0
  234. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/dbml-ref/validator/wrong_table_partial_injection_syntax.json +0 -0
  235. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/jaffle/LICENSE +0 -0
  236. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/jaffle/README.md +0 -0
  237. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/jaffle/catalog.json +0 -0
  238. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/jaffle/manifest.json +0 -0
  239. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/fixtures/targets/cases.json +0 -0
  240. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_agent.py +0 -0
  241. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_convert.py +0 -0
  242. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_dbml.py +0 -0
  243. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_dbml_pipeline.py +0 -0
  244. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_dbt.py +0 -0
  245. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_diff.py +0 -0
  246. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_gallery.py +0 -0
  247. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_mcp.py +0 -0
  248. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_packaging.py +0 -0
  249. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_parser.py +0 -0
  250. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_path.py +0 -0
  251. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_render.py +0 -0
  252. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_select.py +0 -0
  253. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_serve.py +0 -0
  254. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_share.py +0 -0
  255. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_tags.py +0 -0
  256. {quickdbd_cli-0.3.2 → quickdbd_cli-0.3.3}/tests/test_targets.py +0 -0
@@ -222,3 +222,4 @@ __marimo__/
222
222
  .superpowers/
223
223
  site/
224
224
  jaffle-erd/
225
+ graphify-out/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: quickdbd-cli
3
- Version: 0.3.2
3
+ Version: 0.3.3
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.1.11
189
+ - uses: MarkPhamm/quickdbd-cli@v0.3.3
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.1.11
151
+ - uses: MarkPhamm/quickdbd-cli@v0.3.3
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.2"
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"
@@ -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(_svg_size(svg)))
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
- out.write_bytes(export.svg_to_png(svg, args.scale))
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.2"
File without changes
File without changes