dataface 0.1.2__py3-none-any.whl

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 (455) hide show
  1. d3_format/__init__.py +14 -0
  2. d3_format/errors.py +19 -0
  3. d3_format/format.py +551 -0
  4. d3_format/spec.py +159 -0
  5. dataface/DATAFACE_SYNTAX.md +1135 -0
  6. dataface/__init__.py +93 -0
  7. dataface/_docs_site.py +20 -0
  8. dataface/_install_hint.py +26 -0
  9. dataface/agent_api/__init__.py +79 -0
  10. dataface/agent_api/_init_templates/__init__.py +0 -0
  11. dataface/agent_api/_init_templates/agents_dft_snippet.md +26 -0
  12. dataface/agent_api/_init_templates/dataface.yml +15 -0
  13. dataface/agent_api/_init_templates/faces-dataface.yml +144 -0
  14. dataface/agent_api/_init_templates/index.md +24 -0
  15. dataface/agent_api/_paths.py +118 -0
  16. dataface/agent_api/_project_agents_md.py +43 -0
  17. dataface/agent_api/_session_store.py +486 -0
  18. dataface/agent_api/_state.py +28 -0
  19. dataface/agent_api/chat.py +221 -0
  20. dataface/agent_api/dashboards.py +257 -0
  21. dataface/agent_api/describe.py +366 -0
  22. dataface/agent_api/describe_query.py +120 -0
  23. dataface/agent_api/docs/__init__.py +25 -0
  24. dataface/agent_api/docs/_loader.py +292 -0
  25. dataface/agent_api/docs/yaml-reference.md +2757 -0
  26. dataface/agent_api/file_refs.py +118 -0
  27. dataface/agent_api/init.py +126 -0
  28. dataface/agent_api/inspect.py +128 -0
  29. dataface/agent_api/mcp_install.py +170 -0
  30. dataface/agent_api/query.py +274 -0
  31. dataface/agent_api/schema.py +658 -0
  32. dataface/agent_api/schema_search.py +284 -0
  33. dataface/agent_api/search.py +270 -0
  34. dataface/agent_api/skill_install.py +141 -0
  35. dataface/agent_api/skill_render.py +90 -0
  36. dataface/agent_api/skills.py +293 -0
  37. dataface/agent_api/surface_aliases.yaml +128 -0
  38. dataface/agent_api/validate.py +175 -0
  39. dataface/agent_api/validate_query.py +84 -0
  40. dataface/ai/__init__.py +39 -0
  41. dataface/ai/agent.py +139 -0
  42. dataface/ai/context.py +45 -0
  43. dataface/ai/events.py +62 -0
  44. dataface/ai/external_mcp.py +610 -0
  45. dataface/ai/generate_sql.py +96 -0
  46. dataface/ai/llm.py +403 -0
  47. dataface/ai/mcp/__init__.py +51 -0
  48. dataface/ai/mcp/server.py +289 -0
  49. dataface/ai/memories.py +85 -0
  50. dataface/ai/prompts.py +177 -0
  51. dataface/ai/schema_context.py +138 -0
  52. dataface/ai/skills/before-after-comparison/SKILL.md +102 -0
  53. dataface/ai/skills/before-after-comparison/examples/before-after-comparison.yml +24 -0
  54. dataface/ai/skills/dashboard-build/SKILL.md +212 -0
  55. dataface/ai/skills/dashboard-build/examples/_smoke.yml +15 -0
  56. dataface/ai/skills/dashboard-design/SKILL.md +182 -0
  57. dataface/ai/skills/dashboard-review/SKILL.md +113 -0
  58. dataface/ai/skills/dashboard-structural-review/SKILL.md +173 -0
  59. dataface/ai/skills/dashboard-visual-review/SKILL.md +139 -0
  60. dataface/ai/skills/dataface-mcp-setup/SKILL.md +177 -0
  61. dataface/ai/skills/dataface-troubleshooting/SKILL.md +225 -0
  62. dataface/ai/skills/drill-down-link/SKILL.md +112 -0
  63. dataface/ai/skills/drill-down-link/examples/drill-down-link.yml +27 -0
  64. dataface/ai/skills/faceted-small-multiples/SKILL.md +116 -0
  65. dataface/ai/skills/faceted-small-multiples/examples/faceted-small-multiples.yml +33 -0
  66. dataface/ai/skills/filter-bar-with-variables/SKILL.md +105 -0
  67. dataface/ai/skills/filter-bar-with-variables/examples/filter-bar-with-variables.yml +49 -0
  68. dataface/ai/skills/kpi-row/SKILL.md +101 -0
  69. dataface/ai/skills/kpi-row/examples/kpi-row.yml +55 -0
  70. dataface/ai/skills/report-design/SKILL.md +184 -0
  71. dataface/ai/skills/single-metric-bignum/SKILL.md +90 -0
  72. dataface/ai/skills/single-metric-bignum/examples/single-metric-bignum.yml +27 -0
  73. dataface/ai/skills/table-heavy-ops-dashboard/SKILL.md +114 -0
  74. dataface/ai/skills/table-heavy-ops-dashboard/examples/table-heavy-ops-dashboard.yml +48 -0
  75. dataface/ai/skills/time-series-trend/SKILL.md +93 -0
  76. dataface/ai/skills/time-series-trend/examples/time-series-trend.yml +26 -0
  77. dataface/ai/skills/top-n-with-detail/SKILL.md +98 -0
  78. dataface/ai/skills/top-n-with-detail/examples/top-n-with-detail.yml +45 -0
  79. dataface/ai/skills/two-by-two-grid-overview/SKILL.md +78 -0
  80. dataface/ai/skills/two-by-two-grid-overview/examples/two-by-two-grid-overview.yml +64 -0
  81. dataface/ai/tool_schemas.py +132 -0
  82. dataface/ai/tools/__init__.py +312 -0
  83. dataface/ai/yaml_utils.py +57 -0
  84. dataface/cli/__init__.py +3 -0
  85. dataface/cli/_console.py +48 -0
  86. dataface/cli/_error_format.py +83 -0
  87. dataface/cli/_extras.py +190 -0
  88. dataface/cli/_json_output.py +8 -0
  89. dataface/cli/_parsing.py +17 -0
  90. dataface/cli/_version_info.py +56 -0
  91. dataface/cli/commands/__init__.py +3 -0
  92. dataface/cli/commands/_agent_input.py +205 -0
  93. dataface/cli/commands/_agent_server.py +115 -0
  94. dataface/cli/commands/chat.py +645 -0
  95. dataface/cli/commands/describe.py +107 -0
  96. dataface/cli/commands/docs.py +131 -0
  97. dataface/cli/commands/extension.py +179 -0
  98. dataface/cli/commands/init.py +240 -0
  99. dataface/cli/commands/inspect.py +94 -0
  100. dataface/cli/commands/mcp_init.py +167 -0
  101. dataface/cli/commands/query.py +386 -0
  102. dataface/cli/commands/render.py +291 -0
  103. dataface/cli/commands/schema.py +411 -0
  104. dataface/cli/commands/search.py +49 -0
  105. dataface/cli/commands/serve.py +114 -0
  106. dataface/cli/commands/skills.py +133 -0
  107. dataface/cli/commands/skills_init.py +161 -0
  108. dataface/cli/commands/validate.py +63 -0
  109. dataface/cli/main.py +1501 -0
  110. dataface/core/__init__.py +75 -0
  111. dataface/core/compile/__init__.py +244 -0
  112. dataface/core/compile/_jinja_helpers.py +78 -0
  113. dataface/core/compile/channel.py +222 -0
  114. dataface/core/compile/chart_focus.py +101 -0
  115. dataface/core/compile/chart_resolved.py +169 -0
  116. dataface/core/compile/chart_type_detection.py +489 -0
  117. dataface/core/compile/chart_update.py +261 -0
  118. dataface/core/compile/colors.py +64 -0
  119. dataface/core/compile/compiler.py +904 -0
  120. dataface/core/compile/config.py +823 -0
  121. dataface/core/compile/custom_chart_types.py +208 -0
  122. dataface/core/compile/data_table_attachment.py +1287 -0
  123. dataface/core/compile/detect.py +110 -0
  124. dataface/core/compile/errors.py +302 -0
  125. dataface/core/compile/filter_injection.py +319 -0
  126. dataface/core/compile/introspection.py +527 -0
  127. dataface/core/compile/jinja.py +511 -0
  128. dataface/core/compile/labels_env.py +52 -0
  129. dataface/core/compile/markdown.py +154 -0
  130. dataface/core/compile/meta.py +388 -0
  131. dataface/core/compile/models/__init__.py +0 -0
  132. dataface/core/compile/models/chart/__init__.py +0 -0
  133. dataface/core/compile/models/chart/authored.py +2137 -0
  134. dataface/core/compile/models/chart/compiled.py +398 -0
  135. dataface/core/compile/models/config.py +347 -0
  136. dataface/core/compile/models/face/__init__.py +0 -0
  137. dataface/core/compile/models/face/authored.py +659 -0
  138. dataface/core/compile/models/face/compiled.py +522 -0
  139. dataface/core/compile/models/factories.py +201 -0
  140. dataface/core/compile/models/markers.py +40 -0
  141. dataface/core/compile/models/palette.py +36 -0
  142. dataface/core/compile/models/primitives.py +415 -0
  143. dataface/core/compile/models/query/__init__.py +0 -0
  144. dataface/core/compile/models/query/authored.py +246 -0
  145. dataface/core/compile/models/query/compiled.py +710 -0
  146. dataface/core/compile/models/refs.py +137 -0
  147. dataface/core/compile/models/source.py +611 -0
  148. dataface/core/compile/models/style/__init__.py +0 -0
  149. dataface/core/compile/models/style/authored.py +481 -0
  150. dataface/core/compile/models/style/compiled.py +3399 -0
  151. dataface/core/compile/models/style/merged.py +1682 -0
  152. dataface/core/compile/models/theme.py +362 -0
  153. dataface/core/compile/models/variable/__init__.py +0 -0
  154. dataface/core/compile/models/variable/authored.py +254 -0
  155. dataface/core/compile/models/vega_lite/__init__.py +0 -0
  156. dataface/core/compile/models/vega_lite/config.py +510 -0
  157. dataface/core/compile/models/vega_lite/contracts.py +171 -0
  158. dataface/core/compile/normalize_charts.py +494 -0
  159. dataface/core/compile/normalize_layout.py +1000 -0
  160. dataface/core/compile/normalize_queries.py +297 -0
  161. dataface/core/compile/normalize_variables.py +489 -0
  162. dataface/core/compile/normalizer.py +543 -0
  163. dataface/core/compile/palette.py +1100 -0
  164. dataface/core/compile/parameterized.py +658 -0
  165. dataface/core/compile/parser.py +228 -0
  166. dataface/core/compile/schema.py +20 -0
  167. dataface/core/compile/schema_renderers/__init__.py +0 -0
  168. dataface/core/compile/schema_renderers/json_schema.py +163 -0
  169. dataface/core/compile/schema_renderers/prompt.py +152 -0
  170. dataface/core/compile/schema_renderers/vscode_schema.py +301 -0
  171. dataface/core/compile/sizing.py +2126 -0
  172. dataface/core/compile/sources.py +518 -0
  173. dataface/core/compile/sql_authoring_lint.py +56 -0
  174. dataface/core/compile/style_cascade.py +471 -0
  175. dataface/core/compile/typography.py +299 -0
  176. dataface/core/compile/validator.py +301 -0
  177. dataface/core/compile/variables.py +53 -0
  178. dataface/core/compile/vega_config.py +98 -0
  179. dataface/core/compile/vega_lite/__init__.py +6 -0
  180. dataface/core/compile/vega_lite/validation.py +95 -0
  181. dataface/core/compile/yaml_error_formatter.py +838 -0
  182. dataface/core/connections.py +38 -0
  183. dataface/core/dashboard.py +358 -0
  184. dataface/core/defaults/default_config.yml +101 -0
  185. dataface/core/defaults/palettes/categorical/category-10-dark.yml +32 -0
  186. dataface/core/defaults/palettes/categorical/category-10-light.yml +43 -0
  187. dataface/core/defaults/palettes/categorical/category-10.yml +31 -0
  188. dataface/core/defaults/palettes/categorical/category-6-tonal-blue.yml +22 -0
  189. dataface/core/defaults/palettes/categorical/category-6-tonal-brown.yml +29 -0
  190. dataface/core/defaults/palettes/categorical/category-6-tonal-green.yml +20 -0
  191. dataface/core/defaults/palettes/categorical/category-6-tonal-orange.yml +21 -0
  192. dataface/core/defaults/palettes/categorical/category-6-tonal-purple.yml +20 -0
  193. dataface/core/defaults/palettes/categorical/editorial-10-dark.yml +32 -0
  194. dataface/core/defaults/palettes/categorical/editorial-10.yml +40 -0
  195. dataface/core/defaults/palettes/categorical/hero-6.yml +17 -0
  196. dataface/core/defaults/palettes/categorical/single-blue.yml +11 -0
  197. dataface/core/defaults/palettes/categorical/tableau.yml +20 -0
  198. dataface/core/defaults/palettes/data/xkcd_colors.json +3803 -0
  199. dataface/core/defaults/palettes/diverging/blue-red.yml +25 -0
  200. dataface/core/defaults/palettes/diverging/coolwarm.yml +24 -0
  201. dataface/core/defaults/palettes/diverging/crimson-green.yml +23 -0
  202. dataface/core/defaults/palettes/diverging/orange-teal.yml +23 -0
  203. dataface/core/defaults/palettes/diverging/sunset.yml +24 -0
  204. dataface/core/defaults/palettes/scaffold/dft-creams.yml +38 -0
  205. dataface/core/defaults/palettes/scaffold/dft-grays.yml +53 -0
  206. dataface/core/defaults/palettes/sequential/amber.yml +22 -0
  207. dataface/core/defaults/palettes/sequential/blue.yml +22 -0
  208. dataface/core/defaults/palettes/sequential/brown.yml +22 -0
  209. dataface/core/defaults/palettes/sequential/gray.yml +22 -0
  210. dataface/core/defaults/palettes/sequential/green.yml +22 -0
  211. dataface/core/defaults/palettes/sequential/purple.yml +22 -0
  212. dataface/core/defaults/palettes/sequential/rust.yml +22 -0
  213. dataface/core/defaults/palettes/sequential/teal.yml +22 -0
  214. dataface/core/defaults/palettes/tone/negative.yml +32 -0
  215. dataface/core/defaults/palettes/tone/positive.yml +22 -0
  216. dataface/core/defaults/palettes/tone/warning.yml +22 -0
  217. dataface/core/defaults/themes/_base.yaml +786 -0
  218. dataface/core/defaults/themes/bi.yaml +16 -0
  219. dataface/core/defaults/themes/carbong100.yaml +41 -0
  220. dataface/core/defaults/themes/cream.yaml +122 -0
  221. dataface/core/defaults/themes/dark.yaml +40 -0
  222. dataface/core/defaults/themes/diagnostics-title-angle-extreme.yaml +9 -0
  223. dataface/core/defaults/themes/diagnostics-title-baseline-extreme.yaml +9 -0
  224. dataface/core/defaults/themes/diagnostics-title-baseline.yaml +24 -0
  225. dataface/core/defaults/themes/diagnostics-title-center.yaml +8 -0
  226. dataface/core/defaults/themes/diagnostics-title-color-extreme.yaml +24 -0
  227. dataface/core/defaults/themes/diagnostics-title-font-extreme.yaml +25 -0
  228. dataface/core/defaults/themes/diagnostics-title-left.yaml +8 -0
  229. dataface/core/defaults/themes/diagnostics-title-offset-extreme.yaml +9 -0
  230. dataface/core/defaults/themes/diagnostics-title-size-extreme.yaml +24 -0
  231. dataface/core/defaults/themes/diagnostics-title-weight-extreme.yaml +24 -0
  232. dataface/core/defaults/themes/editorial.yaml +147 -0
  233. dataface/core/defaults/themes/light.yaml +30 -0
  234. dataface/core/defaults/themes/looker.yaml +17 -0
  235. dataface/core/defaults/themes/stark.yaml +134 -0
  236. dataface/core/errors/__init__.py +67 -0
  237. dataface/core/errors/codes_compile.py +56 -0
  238. dataface/core/errors/codes_execute.py +177 -0
  239. dataface/core/errors/codes_render.py +106 -0
  240. dataface/core/errors/codes_unknown.py +15 -0
  241. dataface/core/errors/hints.py +74 -0
  242. dataface/core/errors/registry.py +42 -0
  243. dataface/core/errors/structured.py +92 -0
  244. dataface/core/execute/__init__.py +91 -0
  245. dataface/core/execute/adapters/__init__.py +49 -0
  246. dataface/core/execute/adapters/adapter_registry.py +400 -0
  247. dataface/core/execute/adapters/base.py +245 -0
  248. dataface/core/execute/adapters/csv_adapter.py +239 -0
  249. dataface/core/execute/adapters/dbt_adapter.py +283 -0
  250. dataface/core/execute/adapters/dbt_adapter_factory.py +212 -0
  251. dataface/core/execute/adapters/dbt_macro_loader.py +95 -0
  252. dataface/core/execute/adapters/dbt_utils.py +150 -0
  253. dataface/core/execute/adapters/http_adapter.py +224 -0
  254. dataface/core/execute/adapters/metricflow_adapter.py +94 -0
  255. dataface/core/execute/adapters/schema_resolver_adapter.py +144 -0
  256. dataface/core/execute/adapters/sql_adapter.py +710 -0
  257. dataface/core/execute/adapters/values_adapter.py +58 -0
  258. dataface/core/execute/batch.py +744 -0
  259. dataface/core/execute/cache_backend.py +135 -0
  260. dataface/core/execute/cache_keys.py +66 -0
  261. dataface/core/execute/dbt_jinja.py +21 -0
  262. dataface/core/execute/dialects/__init__.py +121 -0
  263. dataface/core/execute/dialects/athena.py +75 -0
  264. dataface/core/execute/dialects/base.py +302 -0
  265. dataface/core/execute/dialects/bigquery.py +38 -0
  266. dataface/core/execute/dialects/databricks.py +68 -0
  267. dataface/core/execute/dialects/duckdb.py +35 -0
  268. dataface/core/execute/dialects/mysql.py +68 -0
  269. dataface/core/execute/dialects/postgres.py +39 -0
  270. dataface/core/execute/dialects/redshift.py +12 -0
  271. dataface/core/execute/dialects/snowflake.py +51 -0
  272. dataface/core/execute/dialects/sqlserver.py +92 -0
  273. dataface/core/execute/duckdb_cache.py +712 -0
  274. dataface/core/execute/duckdb_config.py +26 -0
  275. dataface/core/execute/errors.py +213 -0
  276. dataface/core/execute/executor.py +1249 -0
  277. dataface/core/execute/parallel.py +162 -0
  278. dataface/core/execute/setup_sql.py +58 -0
  279. dataface/core/execute/source_registry.py +72 -0
  280. dataface/core/execute/source_resolver.py +255 -0
  281. dataface/core/execute/sql_guard.py +387 -0
  282. dataface/core/execute/sql_literals.py +199 -0
  283. dataface/core/fonts.py +52 -0
  284. dataface/core/inspect/__init__.py +32 -0
  285. dataface/core/inspect/cache_factory.py +98 -0
  286. dataface/core/inspect/db_types.py +162 -0
  287. dataface/core/inspect/dbt_schema.py +96 -0
  288. dataface/core/inspect/defaults.yml +37 -0
  289. dataface/core/inspect/fanout_risk.py +109 -0
  290. dataface/core/inspect/manifest_utils.py +77 -0
  291. dataface/core/inspect/partials/categorical.yml +40 -0
  292. dataface/core/inspect/partials/date.yml +40 -0
  293. dataface/core/inspect/partials/numeric.yml +55 -0
  294. dataface/core/inspect/partition_types.py +38 -0
  295. dataface/core/inspect/query_validator.py +975 -0
  296. dataface/core/inspect/renderer.py +354 -0
  297. dataface/core/inspect/resolver.py +808 -0
  298. dataface/core/inspect/search.py +461 -0
  299. dataface/core/inspect/sources/__init__.py +32 -0
  300. dataface/core/inspect/sources/dbt.py +738 -0
  301. dataface/core/inspect/sources/duckdb_utils.py +66 -0
  302. dataface/core/inspect/templates/__init__.py +1 -0
  303. dataface/core/inspect/templates/categorical_column.yml +196 -0
  304. dataface/core/inspect/templates/charts.yml +109 -0
  305. dataface/core/inspect/templates/date_column.yml +248 -0
  306. dataface/core/inspect/templates/model.yml +138 -0
  307. dataface/core/inspect/templates/numeric_column.yml +261 -0
  308. dataface/core/inspect/templates/quality.yml +80 -0
  309. dataface/core/inspect/templates/string_column.yml +263 -0
  310. dataface/core/project_roots.py +165 -0
  311. dataface/core/render/__init__.py +87 -0
  312. dataface/core/render/board_links.py +176 -0
  313. dataface/core/render/chart/__init__.py +27 -0
  314. dataface/core/render/chart/arc_attached_table.py +251 -0
  315. dataface/core/render/chart/artifacts.py +16 -0
  316. dataface/core/render/chart/callout.py +225 -0
  317. dataface/core/render/chart/decisions.py +358 -0
  318. dataface/core/render/chart/geo.py +700 -0
  319. dataface/core/render/chart/kpi.py +916 -0
  320. dataface/core/render/chart/labels.py +76 -0
  321. dataface/core/render/chart/pipeline.py +818 -0
  322. dataface/core/render/chart/presentation.py +36 -0
  323. dataface/core/render/chart/profile.py +3438 -0
  324. dataface/core/render/chart/render_single.py +347 -0
  325. dataface/core/render/chart/renderers.py +193 -0
  326. dataface/core/render/chart/rendering.py +565 -0
  327. dataface/core/render/chart/serialization.py +90 -0
  328. dataface/core/render/chart/spark.py +496 -0
  329. dataface/core/render/chart/spark_bar.py +370 -0
  330. dataface/core/render/chart/spec_builders.py +154 -0
  331. dataface/core/render/chart/standard_renderer.py +2645 -0
  332. dataface/core/render/chart/table.py +2957 -0
  333. dataface/core/render/chart/table_support.py +1452 -0
  334. dataface/core/render/chart/tick_values.py +66 -0
  335. dataface/core/render/chart/time_unit_detect.py +809 -0
  336. dataface/core/render/chart/title_overflow.py +157 -0
  337. dataface/core/render/chart/type_inference.py +122 -0
  338. dataface/core/render/chart/validation.py +99 -0
  339. dataface/core/render/chart/vega_lite.py +125 -0
  340. dataface/core/render/chart/vega_lite_types.py +268 -0
  341. dataface/core/render/chart/vl_field_maps.py +346 -0
  342. dataface/core/render/chart_interactivity.py +24 -0
  343. dataface/core/render/control_registry.py +287 -0
  344. dataface/core/render/converters/__init__.py +24 -0
  345. dataface/core/render/converters/chart.py +276 -0
  346. dataface/core/render/converters/html.py +98 -0
  347. dataface/core/render/converters/pdf.py +40 -0
  348. dataface/core/render/converters/png.py +41 -0
  349. dataface/core/render/errors.py +144 -0
  350. dataface/core/render/face_api.py +160 -0
  351. dataface/core/render/faces.py +1194 -0
  352. dataface/core/render/font_measurement.py +48 -0
  353. dataface/core/render/font_support.py +197 -0
  354. dataface/core/render/fonts/DFTSansTabular-Regular.ttf +0 -0
  355. dataface/core/render/fonts/DFTSansTabular-Regular.woff2 +0 -0
  356. dataface/core/render/fonts/DFTSerifOldstyleProportional-Regular.ttf +0 -0
  357. dataface/core/render/fonts/DFTSerifOldstyleTabular-Regular.ttf +0 -0
  358. dataface/core/render/fonts/InterVariable.ttf +0 -0
  359. dataface/core/render/fonts/InterVariable.woff2 +0 -0
  360. dataface/core/render/fonts/NOTO_COLOR_EMOJI_LICENSE.txt +93 -0
  361. dataface/core/render/fonts/NOTO_EMOJI_LICENSE.txt +93 -0
  362. dataface/core/render/fonts/NotoColorEmoji-Regular.ttf +0 -0
  363. dataface/core/render/fonts/NotoColorEmoji-Regular.woff2 +0 -0
  364. dataface/core/render/fonts/NotoEmoji-Regular.ttf +0 -0
  365. dataface/core/render/fonts/NotoEmoji-Regular.woff2 +0 -0
  366. dataface/core/render/fonts/SOURCE_CODE_PRO_LICENSE.txt +93 -0
  367. dataface/core/render/fonts/SOURCE_SERIF_4_LICENSE.txt +98 -0
  368. dataface/core/render/fonts/SourceCodePro-Regular.ttf +0 -0
  369. dataface/core/render/fonts/SourceSerif4-Regular.ttf +0 -0
  370. dataface/core/render/fonts/_emoji_font_face.css +43 -0
  371. dataface/core/render/fonts/source-serif-4-variable-latin.woff2 +0 -0
  372. dataface/core/render/format_utils.py +329 -0
  373. dataface/core/render/geo_defaults.yml +28 -0
  374. dataface/core/render/json_format.py +146 -0
  375. dataface/core/render/layout_sizing.py +865 -0
  376. dataface/core/render/layouts.py +541 -0
  377. dataface/core/render/markdown_defaults.yml +16 -0
  378. dataface/core/render/missing_vars_prompt.py +79 -0
  379. dataface/core/render/placeholder.py +389 -0
  380. dataface/core/render/render_result.py +14 -0
  381. dataface/core/render/renderer.py +467 -0
  382. dataface/core/render/script_embedding.py +16 -0
  383. dataface/core/render/svg_utils.py +212 -0
  384. dataface/core/render/template_loader.py +69 -0
  385. dataface/core/render/templates/controls/_styles.css +606 -0
  386. dataface/core/render/templates/controls/checkbox.html +16 -0
  387. dataface/core/render/templates/controls/date.html +16 -0
  388. dataface/core/render/templates/controls/number.html +19 -0
  389. dataface/core/render/templates/controls/readonly.html +9 -0
  390. dataface/core/render/templates/controls/select.html +21 -0
  391. dataface/core/render/templates/controls/slider.html +22 -0
  392. dataface/core/render/templates/controls/text.html +16 -0
  393. dataface/core/render/templates/scripts/chart_interactivity.js +191 -0
  394. dataface/core/render/templates/scripts/variables.js +976 -0
  395. dataface/core/render/templates/svg/grid_pattern.svg +3 -0
  396. dataface/core/render/templates/svg/styles.css +51 -0
  397. dataface/core/render/terminal.py +311 -0
  398. dataface/core/render/terminal_charts.py +563 -0
  399. dataface/core/render/terminal_defaults.yml +2 -0
  400. dataface/core/render/terminal_layouts.py +299 -0
  401. dataface/core/render/terminal_text.py +31 -0
  402. dataface/core/render/text/__init__.py +1 -0
  403. dataface/core/render/text/case.py +113 -0
  404. dataface/core/render/text_format.py +129 -0
  405. dataface/core/render/utils.py +106 -0
  406. dataface/core/render/variable_controls.py +946 -0
  407. dataface/core/render/variable_input_refinement.py +140 -0
  408. dataface/core/render/warnings/__init__.py +15 -0
  409. dataface/core/render/warnings/bar_color_1_to_1_with_x.py +80 -0
  410. dataface/core/render/warnings/base.py +44 -0
  411. dataface/core/render/warnings/fanout_risk.py +15 -0
  412. dataface/core/render/warnings/from_query_diagnostic.py +56 -0
  413. dataface/core/render/warnings/missing_join_predicate.py +13 -0
  414. dataface/core/render/warnings/query_parse_error.py +14 -0
  415. dataface/core/render/warnings/query_returned_zero_rows.py +42 -0
  416. dataface/core/render/warnings/reaggregation.py +14 -0
  417. dataface/core/render/warnings/registry.py +45 -0
  418. dataface/core/render/warnings/suppression.py +46 -0
  419. dataface/core/render/warnings/temporal_single_point.py +63 -0
  420. dataface/core/render/warnings/unreferenced_chart.py +15 -0
  421. dataface/core/render/warnings/y_encoding_mostly_null.py +76 -0
  422. dataface/core/render/yaml_format.py +167 -0
  423. dataface/core/resolve_face.py +195 -0
  424. dataface/core/schema/__init__.py +0 -0
  425. dataface/core/schema/guidance.py +151 -0
  426. dataface/core/scoped_paths.py +59 -0
  427. dataface/core/serve/__init__.py +14 -0
  428. dataface/core/serve/bootstrap.py +39 -0
  429. dataface/core/serve/embedded.py +57 -0
  430. dataface/core/serve/port.py +129 -0
  431. dataface/core/serve/server.py +938 -0
  432. dataface/core/serve/templates/__init__.py +0 -0
  433. dataface/core/serve/templates/directory.yml +6 -0
  434. dataface/core/serve/templates/error.html.j2 +217 -0
  435. dataface/core/utils.py +121 -0
  436. dataface/core/validate.py +64 -0
  437. dataface/integrations/__init__.py +0 -0
  438. dataface/integrations/highlighting.py +351 -0
  439. dataface/integrations/markdown.py +537 -0
  440. dataface/py.typed +0 -0
  441. dataface-0.1.2.dist-info/METADATA +375 -0
  442. dataface-0.1.2.dist-info/RECORD +455 -0
  443. dataface-0.1.2.dist-info/WHEEL +4 -0
  444. dataface-0.1.2.dist-info/entry_points.txt +2 -0
  445. dataface-0.1.2.dist-info/licenses/LICENSE +202 -0
  446. mdsvg/__init__.py +168 -0
  447. mdsvg/fonts.py +656 -0
  448. mdsvg/images.py +299 -0
  449. mdsvg/parser.py +629 -0
  450. mdsvg/playground.py +284 -0
  451. mdsvg/py.typed +2 -0
  452. mdsvg/renderer.py +1623 -0
  453. mdsvg/style.py +355 -0
  454. mdsvg/types.py +200 -0
  455. mdsvg/utils.py +86 -0
@@ -0,0 +1,138 @@
1
+ # Model Profile Template
2
+ #
3
+ # Overview of a table/model with column inventory, classification,
4
+ # detailed stats, and sample data.
5
+ #
6
+ # URL: /inspect/model/?model=<table_name>
7
+ #
8
+ # Required variables:
9
+ # - model: Table/model name to profile
10
+ #
11
+ # Optional variables:
12
+ # - connection: DuckDB file path or :memory: (default: :memory:)
13
+ #
14
+ # Theme is set via DFT_DEFAULT_THEME env var at serve startup.
15
+
16
+ title: "{{ model }}"
17
+
18
+ text: |
19
+ **{{ model }}** | [Quality](/inspect/quality/?model={{ model }}&connection={{ connection }})
20
+
21
+ variables:
22
+ model:
23
+ input: text
24
+ visible: false
25
+ default: ""
26
+ connection:
27
+ input: text
28
+ visible: false
29
+ default: ":memory:"
30
+ source_name:
31
+ input: text
32
+ visible: false
33
+ default: ""
34
+ schema_name:
35
+ input: text
36
+ visible: false
37
+ default: ""
38
+
39
+ queries:
40
+ column_profile:
41
+ type: schema_resolver
42
+ source: "{{ source_name }}"
43
+ schema: "{{ schema_name }}"
44
+ table: "{{ model }}"
45
+
46
+ sample_data:
47
+ source:
48
+ type: duckdb
49
+ path: "{{ connection }}"
50
+ sql: |
51
+ SELECT * FROM {{ model }} LIMIT 100
52
+
53
+ charts:
54
+ column_inventory:
55
+ title: Inspector Overview
56
+ type: table
57
+ query: column_profile
58
+ style:
59
+ header_overflow: wrap-two
60
+ columns:
61
+ name:
62
+ label: Column
63
+ type:
64
+ label: Type
65
+ role:
66
+ label: Role
67
+ semantic_type:
68
+ label: Semantic
69
+ null_percentage:
70
+ label: "Null %"
71
+ format: ".1f"
72
+ uniqueness_ratio:
73
+ label: Distinct
74
+ format: ".0%"
75
+
76
+ column_classification:
77
+ title: Classification
78
+ type: table
79
+ query: column_profile
80
+ style:
81
+ header_overflow: wrap-two
82
+ columns:
83
+ name:
84
+ label: Column
85
+ role:
86
+ label: Role
87
+ distribution:
88
+ label: Distribution
89
+ completeness:
90
+ label: Completeness
91
+ key_role:
92
+ label: Key
93
+ semantic_type:
94
+ label: Semantic Type
95
+
96
+ column_stats:
97
+ title: Profile
98
+ type: table
99
+ query: column_profile
100
+ style:
101
+ header_overflow: wrap-two
102
+ columns:
103
+ name:
104
+ label: Column
105
+ type:
106
+ label: Type
107
+ distinct_count:
108
+ label: Distinct
109
+ format: ",.0f"
110
+ min_value:
111
+ label: Min
112
+ max_value:
113
+ label: Max
114
+ mean_value:
115
+ label: Mean
116
+ format: ",.4g"
117
+ median_value:
118
+ label: Median
119
+ format: ",.4g"
120
+ stddev_value:
121
+ label: Std Dev
122
+ format: ",.4g"
123
+
124
+ model_data:
125
+ title: "Sample Data"
126
+ type: table
127
+ query: sample_data
128
+
129
+ rows:
130
+ - column_inventory
131
+ - details:
132
+ summary: "Details"
133
+ expanded_title: "Details"
134
+ expanded: false
135
+ rows:
136
+ - column_classification
137
+ - column_stats
138
+ - model_data
@@ -0,0 +1,261 @@
1
+ # Numeric Column Profile Template
2
+ #
3
+ # Detailed analysis of a numeric column: declared schema, histogram,
4
+ # percentiles, outliers. Schema panel pulls from the LayeredSchemaResolver;
5
+ # the live histogram / percentile / outlier panels stay on warehouse SQL
6
+ # because they need the actual data to compute.
7
+ #
8
+ # URL: /inspect/numeric_column/?model=<table>&column=<col>
9
+ #
10
+ # Required variables:
11
+ # - model: Table/model name
12
+ # - column: Column name to analyze
13
+ #
14
+ # Optional variables:
15
+ # - connection: DuckDB file path or :memory: (default: :memory:)
16
+ #
17
+ # Theme is set via DFT_DEFAULT_THEME env var at serve startup.
18
+
19
+ title: "Numeric Column: {{ model }}.{{ column }}"
20
+
21
+ text: |
22
+ [Back to {{ model }}](/inspect/model/?model={{ model }}&connection={{ connection }})
23
+
24
+ variables:
25
+ model:
26
+ input: text
27
+ visible: false
28
+ default: ""
29
+ column:
30
+ input: text
31
+ visible: false
32
+ default: ""
33
+ connection:
34
+ input: text
35
+ visible: false
36
+ default: ":memory:"
37
+ source_name:
38
+ input: text
39
+ visible: false
40
+ default: ""
41
+ schema_name:
42
+ input: text
43
+ visible: false
44
+ default: ""
45
+
46
+ queries:
47
+ column_schema:
48
+ type: schema_resolver
49
+ source: "{{ source_name }}"
50
+ schema: "{{ schema_name }}"
51
+ table: "{{ model }}"
52
+ column: "{{ column }}"
53
+
54
+ # Basic stats
55
+ stats:
56
+ source:
57
+ type: duckdb
58
+ path: "{{ connection }}"
59
+ sql: |
60
+ SELECT
61
+ COUNT(*) as total_count,
62
+ COUNT({{ column }}) as non_null_count,
63
+ COUNT(*) - COUNT({{ column }}) as null_count,
64
+ ROUND(100.0 * (COUNT(*) - COUNT({{ column }})) / COUNT(*), 2) as null_pct,
65
+ MIN({{ column }}) as min_value,
66
+ MAX({{ column }}) as max_value,
67
+ ROUND(AVG({{ column }}), 4) as mean_value,
68
+ ROUND(STDDEV({{ column }}), 4) as std_dev,
69
+ COUNT(DISTINCT {{ column }}) as distinct_count
70
+ FROM {{ model }}
71
+
72
+ # Percentiles
73
+ percentiles:
74
+ source:
75
+ type: duckdb
76
+ path: "{{ connection }}"
77
+ sql: |
78
+ SELECT
79
+ 'P10' as percentile, PERCENTILE_CONT(0.10) WITHIN GROUP (ORDER BY {{ column }}) as value FROM {{ model }}
80
+ UNION ALL
81
+ SELECT
82
+ 'P25' as percentile, PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY {{ column }}) as value FROM {{ model }}
83
+ UNION ALL
84
+ SELECT
85
+ 'P50 (Median)' as percentile, PERCENTILE_CONT(0.50) WITHIN GROUP (ORDER BY {{ column }}) as value FROM {{ model }}
86
+ UNION ALL
87
+ SELECT
88
+ 'P75' as percentile, PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY {{ column }}) as value FROM {{ model }}
89
+ UNION ALL
90
+ SELECT
91
+ 'P90' as percentile, PERCENTILE_CONT(0.90) WITHIN GROUP (ORDER BY {{ column }}) as value FROM {{ model }}
92
+ UNION ALL
93
+ SELECT
94
+ 'P99' as percentile, PERCENTILE_CONT(0.99) WITHIN GROUP (ORDER BY {{ column }}) as value FROM {{ model }}
95
+
96
+ # Histogram data (10 bins)
97
+ histogram:
98
+ source:
99
+ type: duckdb
100
+ path: "{{ connection }}"
101
+ sql: |
102
+ WITH bounds AS (
103
+ SELECT
104
+ MIN({{ column }}) as min_val,
105
+ MAX({{ column }}) as max_val,
106
+ (MAX({{ column }}) - MIN({{ column }})) / 10.0 as bin_width
107
+ FROM {{ model }}
108
+ WHERE {{ column }} IS NOT NULL
109
+ ),
110
+ binned AS (
111
+ SELECT
112
+ FLOOR(({{ column }} - b.min_val) / NULLIF(b.bin_width, 0)) as bin_num,
113
+ b.min_val,
114
+ b.bin_width
115
+ FROM {{ model }}, bounds b
116
+ WHERE {{ column }} IS NOT NULL
117
+ )
118
+ SELECT
119
+ ROUND(min_val + (bin_num * bin_width), 2) as bin_start,
120
+ ROUND(min_val + ((bin_num + 1) * bin_width), 2) as bin_end,
121
+ COUNT(*) as count
122
+ FROM binned
123
+ GROUP BY bin_num, min_val, bin_width
124
+ ORDER BY bin_num
125
+
126
+ # Potential outliers (beyond 3 std devs)
127
+ outliers:
128
+ source:
129
+ type: duckdb
130
+ path: "{{ connection }}"
131
+ sql: |
132
+ WITH stats AS (
133
+ SELECT
134
+ AVG({{ column }}) as mean_val,
135
+ STDDEV({{ column }}) as std_val
136
+ FROM {{ model }}
137
+ WHERE {{ column }} IS NOT NULL
138
+ )
139
+ SELECT
140
+ {{ column }} as value,
141
+ ROUND(({{ column }} - s.mean_val) / NULLIF(s.std_val, 0), 2) as z_score
142
+ FROM {{ model }}, stats s
143
+ WHERE {{ column }} IS NOT NULL
144
+ AND ABS(({{ column }} - s.mean_val) / NULLIF(s.std_val, 0)) > 3
145
+ ORDER BY ABS(({{ column }} - s.mean_val) / NULLIF(s.std_val, 0)) DESC
146
+ LIMIT 20
147
+
148
+ charts:
149
+ schema_panel:
150
+ title: Schema
151
+ type: table
152
+ query: column_schema
153
+ style:
154
+ header_overflow: wrap-two
155
+ columns:
156
+ name:
157
+ label: Column
158
+ type:
159
+ label: Type
160
+ role:
161
+ label: Role
162
+ semantic_type:
163
+ label: Semantic
164
+ description:
165
+ label: Description
166
+
167
+ # Stats KPIs
168
+ min_val:
169
+ label: Min
170
+ type: kpi
171
+ query: stats
172
+ value: min_value
173
+ format: ",.4g"
174
+
175
+ max_val:
176
+ label: Max
177
+ type: kpi
178
+ query: stats
179
+ value: max_value
180
+ format: ",.4g"
181
+
182
+ mean_val:
183
+ label: Mean
184
+ type: kpi
185
+ query: stats
186
+ value: mean_value
187
+ format: ",.4g"
188
+
189
+ std_val:
190
+ label: Std Dev
191
+ type: kpi
192
+ query: stats
193
+ value: std_dev
194
+ format: ",.4g"
195
+
196
+ null_pct:
197
+ label: "Null %"
198
+ type: kpi
199
+ query: stats
200
+ value: null_pct
201
+ format: ".1f"
202
+
203
+ distinct:
204
+ label: Distinct
205
+ type: kpi
206
+ query: stats
207
+ value: distinct_count
208
+ format: ",.0f"
209
+
210
+ # Histogram
211
+ histogram_chart:
212
+ title: Distribution
213
+ type: bar
214
+ query: histogram
215
+ x: bin_start
216
+ y: count
217
+ x_label: Value
218
+ y_label: Count
219
+
220
+ # Percentiles table
221
+ percentiles_table:
222
+ title: Percentiles
223
+ type: table
224
+ query: percentiles
225
+ style:
226
+ header_overflow: wrap-two
227
+ columns:
228
+ percentile:
229
+ label: Percentile
230
+ value:
231
+ label: Value
232
+ format: ",.4g"
233
+
234
+ # Outliers table
235
+ outliers_table:
236
+ title: Potential Outliers (|z| > 3)
237
+ type: table
238
+ query: outliers
239
+ style:
240
+ header_overflow: wrap-two
241
+ columns:
242
+ value:
243
+ label: Value
244
+ format: ",.4g"
245
+ z_score:
246
+ label: Z-Score
247
+ format: ".2f"
248
+
249
+ rows:
250
+ - schema_panel
251
+ - cols:
252
+ - min_val
253
+ - max_val
254
+ - mean_val
255
+ - std_val
256
+ - null_pct
257
+ - distinct
258
+ - histogram_chart
259
+ - cols:
260
+ - percentiles_table
261
+ - outliers_table
@@ -0,0 +1,80 @@
1
+ # Data Quality Profile Template
2
+ #
3
+ # Focus on data quality metrics: null rates, distinct counts, schema-derived
4
+ # warnings. Pulls column rows from the LayeredSchemaResolver — no live
5
+ # warehouse SQL — so the page renders for every dialect the resolver
6
+ # supports as soon as the table has been profiled at least once.
7
+ #
8
+ # URL: /inspect/quality/?model=<table_name>
9
+ #
10
+ # Required variables:
11
+ # - model: Table/model name to profile
12
+ #
13
+ # Theme is set via DFT_DEFAULT_THEME env var at serve startup.
14
+
15
+ title: "Data Quality: {{ model }}"
16
+
17
+ text: |
18
+ [Back to {{ model }}](/inspect/model/?model={{ model }}&connection={{ connection }})
19
+
20
+ variables:
21
+ model:
22
+ input: text
23
+ visible: false
24
+ default: ""
25
+ connection:
26
+ input: text
27
+ visible: false
28
+ default: ":memory:"
29
+ source_name:
30
+ input: text
31
+ visible: false
32
+ default: ""
33
+ schema_name:
34
+ input: text
35
+ visible: false
36
+ default: ""
37
+
38
+ queries:
39
+ column_profile:
40
+ type: schema_resolver
41
+ source: "{{ source_name }}"
42
+ schema: "{{ schema_name }}"
43
+ table: "{{ model }}"
44
+
45
+ charts:
46
+ null_chart:
47
+ title: Null percentage by column
48
+ type: bar
49
+ query: column_profile
50
+ x: name
51
+ y: null_percentage
52
+ style:
53
+ orientation: horizontal
54
+
55
+ issues_table:
56
+ title: Column quality
57
+ type: table
58
+ query: column_profile
59
+ style:
60
+ header_overflow: wrap-two
61
+ columns:
62
+ name:
63
+ label: Column
64
+ type:
65
+ label: Type
66
+ null_percentage:
67
+ label: "Null %"
68
+ format: ".1f"
69
+ distinct_count:
70
+ label: Distinct
71
+ format: ",.0f"
72
+ completeness:
73
+ label: Completeness
74
+ distribution:
75
+ label: Distribution
76
+
77
+ rows:
78
+ - cols:
79
+ - null_chart
80
+ - issues_table