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.
- d3_format/__init__.py +14 -0
- d3_format/errors.py +19 -0
- d3_format/format.py +551 -0
- d3_format/spec.py +159 -0
- dataface/DATAFACE_SYNTAX.md +1135 -0
- dataface/__init__.py +93 -0
- dataface/_docs_site.py +20 -0
- dataface/_install_hint.py +26 -0
- dataface/agent_api/__init__.py +79 -0
- dataface/agent_api/_init_templates/__init__.py +0 -0
- dataface/agent_api/_init_templates/agents_dft_snippet.md +26 -0
- dataface/agent_api/_init_templates/dataface.yml +15 -0
- dataface/agent_api/_init_templates/faces-dataface.yml +144 -0
- dataface/agent_api/_init_templates/index.md +24 -0
- dataface/agent_api/_paths.py +118 -0
- dataface/agent_api/_project_agents_md.py +43 -0
- dataface/agent_api/_session_store.py +486 -0
- dataface/agent_api/_state.py +28 -0
- dataface/agent_api/chat.py +221 -0
- dataface/agent_api/dashboards.py +257 -0
- dataface/agent_api/describe.py +366 -0
- dataface/agent_api/describe_query.py +120 -0
- dataface/agent_api/docs/__init__.py +25 -0
- dataface/agent_api/docs/_loader.py +292 -0
- dataface/agent_api/docs/yaml-reference.md +2757 -0
- dataface/agent_api/file_refs.py +118 -0
- dataface/agent_api/init.py +126 -0
- dataface/agent_api/inspect.py +128 -0
- dataface/agent_api/mcp_install.py +170 -0
- dataface/agent_api/query.py +274 -0
- dataface/agent_api/schema.py +658 -0
- dataface/agent_api/schema_search.py +284 -0
- dataface/agent_api/search.py +270 -0
- dataface/agent_api/skill_install.py +141 -0
- dataface/agent_api/skill_render.py +90 -0
- dataface/agent_api/skills.py +293 -0
- dataface/agent_api/surface_aliases.yaml +128 -0
- dataface/agent_api/validate.py +175 -0
- dataface/agent_api/validate_query.py +84 -0
- dataface/ai/__init__.py +39 -0
- dataface/ai/agent.py +139 -0
- dataface/ai/context.py +45 -0
- dataface/ai/events.py +62 -0
- dataface/ai/external_mcp.py +610 -0
- dataface/ai/generate_sql.py +96 -0
- dataface/ai/llm.py +403 -0
- dataface/ai/mcp/__init__.py +51 -0
- dataface/ai/mcp/server.py +289 -0
- dataface/ai/memories.py +85 -0
- dataface/ai/prompts.py +177 -0
- dataface/ai/schema_context.py +138 -0
- dataface/ai/skills/before-after-comparison/SKILL.md +102 -0
- dataface/ai/skills/before-after-comparison/examples/before-after-comparison.yml +24 -0
- dataface/ai/skills/dashboard-build/SKILL.md +212 -0
- dataface/ai/skills/dashboard-build/examples/_smoke.yml +15 -0
- dataface/ai/skills/dashboard-design/SKILL.md +182 -0
- dataface/ai/skills/dashboard-review/SKILL.md +113 -0
- dataface/ai/skills/dashboard-structural-review/SKILL.md +173 -0
- dataface/ai/skills/dashboard-visual-review/SKILL.md +139 -0
- dataface/ai/skills/dataface-mcp-setup/SKILL.md +177 -0
- dataface/ai/skills/dataface-troubleshooting/SKILL.md +225 -0
- dataface/ai/skills/drill-down-link/SKILL.md +112 -0
- dataface/ai/skills/drill-down-link/examples/drill-down-link.yml +27 -0
- dataface/ai/skills/faceted-small-multiples/SKILL.md +116 -0
- dataface/ai/skills/faceted-small-multiples/examples/faceted-small-multiples.yml +33 -0
- dataface/ai/skills/filter-bar-with-variables/SKILL.md +105 -0
- dataface/ai/skills/filter-bar-with-variables/examples/filter-bar-with-variables.yml +49 -0
- dataface/ai/skills/kpi-row/SKILL.md +101 -0
- dataface/ai/skills/kpi-row/examples/kpi-row.yml +55 -0
- dataface/ai/skills/report-design/SKILL.md +184 -0
- dataface/ai/skills/single-metric-bignum/SKILL.md +90 -0
- dataface/ai/skills/single-metric-bignum/examples/single-metric-bignum.yml +27 -0
- dataface/ai/skills/table-heavy-ops-dashboard/SKILL.md +114 -0
- dataface/ai/skills/table-heavy-ops-dashboard/examples/table-heavy-ops-dashboard.yml +48 -0
- dataface/ai/skills/time-series-trend/SKILL.md +93 -0
- dataface/ai/skills/time-series-trend/examples/time-series-trend.yml +26 -0
- dataface/ai/skills/top-n-with-detail/SKILL.md +98 -0
- dataface/ai/skills/top-n-with-detail/examples/top-n-with-detail.yml +45 -0
- dataface/ai/skills/two-by-two-grid-overview/SKILL.md +78 -0
- dataface/ai/skills/two-by-two-grid-overview/examples/two-by-two-grid-overview.yml +64 -0
- dataface/ai/tool_schemas.py +132 -0
- dataface/ai/tools/__init__.py +312 -0
- dataface/ai/yaml_utils.py +57 -0
- dataface/cli/__init__.py +3 -0
- dataface/cli/_console.py +48 -0
- dataface/cli/_error_format.py +83 -0
- dataface/cli/_extras.py +190 -0
- dataface/cli/_json_output.py +8 -0
- dataface/cli/_parsing.py +17 -0
- dataface/cli/_version_info.py +56 -0
- dataface/cli/commands/__init__.py +3 -0
- dataface/cli/commands/_agent_input.py +205 -0
- dataface/cli/commands/_agent_server.py +115 -0
- dataface/cli/commands/chat.py +645 -0
- dataface/cli/commands/describe.py +107 -0
- dataface/cli/commands/docs.py +131 -0
- dataface/cli/commands/extension.py +179 -0
- dataface/cli/commands/init.py +240 -0
- dataface/cli/commands/inspect.py +94 -0
- dataface/cli/commands/mcp_init.py +167 -0
- dataface/cli/commands/query.py +386 -0
- dataface/cli/commands/render.py +291 -0
- dataface/cli/commands/schema.py +411 -0
- dataface/cli/commands/search.py +49 -0
- dataface/cli/commands/serve.py +114 -0
- dataface/cli/commands/skills.py +133 -0
- dataface/cli/commands/skills_init.py +161 -0
- dataface/cli/commands/validate.py +63 -0
- dataface/cli/main.py +1501 -0
- dataface/core/__init__.py +75 -0
- dataface/core/compile/__init__.py +244 -0
- dataface/core/compile/_jinja_helpers.py +78 -0
- dataface/core/compile/channel.py +222 -0
- dataface/core/compile/chart_focus.py +101 -0
- dataface/core/compile/chart_resolved.py +169 -0
- dataface/core/compile/chart_type_detection.py +489 -0
- dataface/core/compile/chart_update.py +261 -0
- dataface/core/compile/colors.py +64 -0
- dataface/core/compile/compiler.py +904 -0
- dataface/core/compile/config.py +823 -0
- dataface/core/compile/custom_chart_types.py +208 -0
- dataface/core/compile/data_table_attachment.py +1287 -0
- dataface/core/compile/detect.py +110 -0
- dataface/core/compile/errors.py +302 -0
- dataface/core/compile/filter_injection.py +319 -0
- dataface/core/compile/introspection.py +527 -0
- dataface/core/compile/jinja.py +511 -0
- dataface/core/compile/labels_env.py +52 -0
- dataface/core/compile/markdown.py +154 -0
- dataface/core/compile/meta.py +388 -0
- dataface/core/compile/models/__init__.py +0 -0
- dataface/core/compile/models/chart/__init__.py +0 -0
- dataface/core/compile/models/chart/authored.py +2137 -0
- dataface/core/compile/models/chart/compiled.py +398 -0
- dataface/core/compile/models/config.py +347 -0
- dataface/core/compile/models/face/__init__.py +0 -0
- dataface/core/compile/models/face/authored.py +659 -0
- dataface/core/compile/models/face/compiled.py +522 -0
- dataface/core/compile/models/factories.py +201 -0
- dataface/core/compile/models/markers.py +40 -0
- dataface/core/compile/models/palette.py +36 -0
- dataface/core/compile/models/primitives.py +415 -0
- dataface/core/compile/models/query/__init__.py +0 -0
- dataface/core/compile/models/query/authored.py +246 -0
- dataface/core/compile/models/query/compiled.py +710 -0
- dataface/core/compile/models/refs.py +137 -0
- dataface/core/compile/models/source.py +611 -0
- dataface/core/compile/models/style/__init__.py +0 -0
- dataface/core/compile/models/style/authored.py +481 -0
- dataface/core/compile/models/style/compiled.py +3399 -0
- dataface/core/compile/models/style/merged.py +1682 -0
- dataface/core/compile/models/theme.py +362 -0
- dataface/core/compile/models/variable/__init__.py +0 -0
- dataface/core/compile/models/variable/authored.py +254 -0
- dataface/core/compile/models/vega_lite/__init__.py +0 -0
- dataface/core/compile/models/vega_lite/config.py +510 -0
- dataface/core/compile/models/vega_lite/contracts.py +171 -0
- dataface/core/compile/normalize_charts.py +494 -0
- dataface/core/compile/normalize_layout.py +1000 -0
- dataface/core/compile/normalize_queries.py +297 -0
- dataface/core/compile/normalize_variables.py +489 -0
- dataface/core/compile/normalizer.py +543 -0
- dataface/core/compile/palette.py +1100 -0
- dataface/core/compile/parameterized.py +658 -0
- dataface/core/compile/parser.py +228 -0
- dataface/core/compile/schema.py +20 -0
- dataface/core/compile/schema_renderers/__init__.py +0 -0
- dataface/core/compile/schema_renderers/json_schema.py +163 -0
- dataface/core/compile/schema_renderers/prompt.py +152 -0
- dataface/core/compile/schema_renderers/vscode_schema.py +301 -0
- dataface/core/compile/sizing.py +2126 -0
- dataface/core/compile/sources.py +518 -0
- dataface/core/compile/sql_authoring_lint.py +56 -0
- dataface/core/compile/style_cascade.py +471 -0
- dataface/core/compile/typography.py +299 -0
- dataface/core/compile/validator.py +301 -0
- dataface/core/compile/variables.py +53 -0
- dataface/core/compile/vega_config.py +98 -0
- dataface/core/compile/vega_lite/__init__.py +6 -0
- dataface/core/compile/vega_lite/validation.py +95 -0
- dataface/core/compile/yaml_error_formatter.py +838 -0
- dataface/core/connections.py +38 -0
- dataface/core/dashboard.py +358 -0
- dataface/core/defaults/default_config.yml +101 -0
- dataface/core/defaults/palettes/categorical/category-10-dark.yml +32 -0
- dataface/core/defaults/palettes/categorical/category-10-light.yml +43 -0
- dataface/core/defaults/palettes/categorical/category-10.yml +31 -0
- dataface/core/defaults/palettes/categorical/category-6-tonal-blue.yml +22 -0
- dataface/core/defaults/palettes/categorical/category-6-tonal-brown.yml +29 -0
- dataface/core/defaults/palettes/categorical/category-6-tonal-green.yml +20 -0
- dataface/core/defaults/palettes/categorical/category-6-tonal-orange.yml +21 -0
- dataface/core/defaults/palettes/categorical/category-6-tonal-purple.yml +20 -0
- dataface/core/defaults/palettes/categorical/editorial-10-dark.yml +32 -0
- dataface/core/defaults/palettes/categorical/editorial-10.yml +40 -0
- dataface/core/defaults/palettes/categorical/hero-6.yml +17 -0
- dataface/core/defaults/palettes/categorical/single-blue.yml +11 -0
- dataface/core/defaults/palettes/categorical/tableau.yml +20 -0
- dataface/core/defaults/palettes/data/xkcd_colors.json +3803 -0
- dataface/core/defaults/palettes/diverging/blue-red.yml +25 -0
- dataface/core/defaults/palettes/diverging/coolwarm.yml +24 -0
- dataface/core/defaults/palettes/diverging/crimson-green.yml +23 -0
- dataface/core/defaults/palettes/diverging/orange-teal.yml +23 -0
- dataface/core/defaults/palettes/diverging/sunset.yml +24 -0
- dataface/core/defaults/palettes/scaffold/dft-creams.yml +38 -0
- dataface/core/defaults/palettes/scaffold/dft-grays.yml +53 -0
- dataface/core/defaults/palettes/sequential/amber.yml +22 -0
- dataface/core/defaults/palettes/sequential/blue.yml +22 -0
- dataface/core/defaults/palettes/sequential/brown.yml +22 -0
- dataface/core/defaults/palettes/sequential/gray.yml +22 -0
- dataface/core/defaults/palettes/sequential/green.yml +22 -0
- dataface/core/defaults/palettes/sequential/purple.yml +22 -0
- dataface/core/defaults/palettes/sequential/rust.yml +22 -0
- dataface/core/defaults/palettes/sequential/teal.yml +22 -0
- dataface/core/defaults/palettes/tone/negative.yml +32 -0
- dataface/core/defaults/palettes/tone/positive.yml +22 -0
- dataface/core/defaults/palettes/tone/warning.yml +22 -0
- dataface/core/defaults/themes/_base.yaml +786 -0
- dataface/core/defaults/themes/bi.yaml +16 -0
- dataface/core/defaults/themes/carbong100.yaml +41 -0
- dataface/core/defaults/themes/cream.yaml +122 -0
- dataface/core/defaults/themes/dark.yaml +40 -0
- dataface/core/defaults/themes/diagnostics-title-angle-extreme.yaml +9 -0
- dataface/core/defaults/themes/diagnostics-title-baseline-extreme.yaml +9 -0
- dataface/core/defaults/themes/diagnostics-title-baseline.yaml +24 -0
- dataface/core/defaults/themes/diagnostics-title-center.yaml +8 -0
- dataface/core/defaults/themes/diagnostics-title-color-extreme.yaml +24 -0
- dataface/core/defaults/themes/diagnostics-title-font-extreme.yaml +25 -0
- dataface/core/defaults/themes/diagnostics-title-left.yaml +8 -0
- dataface/core/defaults/themes/diagnostics-title-offset-extreme.yaml +9 -0
- dataface/core/defaults/themes/diagnostics-title-size-extreme.yaml +24 -0
- dataface/core/defaults/themes/diagnostics-title-weight-extreme.yaml +24 -0
- dataface/core/defaults/themes/editorial.yaml +147 -0
- dataface/core/defaults/themes/light.yaml +30 -0
- dataface/core/defaults/themes/looker.yaml +17 -0
- dataface/core/defaults/themes/stark.yaml +134 -0
- dataface/core/errors/__init__.py +67 -0
- dataface/core/errors/codes_compile.py +56 -0
- dataface/core/errors/codes_execute.py +177 -0
- dataface/core/errors/codes_render.py +106 -0
- dataface/core/errors/codes_unknown.py +15 -0
- dataface/core/errors/hints.py +74 -0
- dataface/core/errors/registry.py +42 -0
- dataface/core/errors/structured.py +92 -0
- dataface/core/execute/__init__.py +91 -0
- dataface/core/execute/adapters/__init__.py +49 -0
- dataface/core/execute/adapters/adapter_registry.py +400 -0
- dataface/core/execute/adapters/base.py +245 -0
- dataface/core/execute/adapters/csv_adapter.py +239 -0
- dataface/core/execute/adapters/dbt_adapter.py +283 -0
- dataface/core/execute/adapters/dbt_adapter_factory.py +212 -0
- dataface/core/execute/adapters/dbt_macro_loader.py +95 -0
- dataface/core/execute/adapters/dbt_utils.py +150 -0
- dataface/core/execute/adapters/http_adapter.py +224 -0
- dataface/core/execute/adapters/metricflow_adapter.py +94 -0
- dataface/core/execute/adapters/schema_resolver_adapter.py +144 -0
- dataface/core/execute/adapters/sql_adapter.py +710 -0
- dataface/core/execute/adapters/values_adapter.py +58 -0
- dataface/core/execute/batch.py +744 -0
- dataface/core/execute/cache_backend.py +135 -0
- dataface/core/execute/cache_keys.py +66 -0
- dataface/core/execute/dbt_jinja.py +21 -0
- dataface/core/execute/dialects/__init__.py +121 -0
- dataface/core/execute/dialects/athena.py +75 -0
- dataface/core/execute/dialects/base.py +302 -0
- dataface/core/execute/dialects/bigquery.py +38 -0
- dataface/core/execute/dialects/databricks.py +68 -0
- dataface/core/execute/dialects/duckdb.py +35 -0
- dataface/core/execute/dialects/mysql.py +68 -0
- dataface/core/execute/dialects/postgres.py +39 -0
- dataface/core/execute/dialects/redshift.py +12 -0
- dataface/core/execute/dialects/snowflake.py +51 -0
- dataface/core/execute/dialects/sqlserver.py +92 -0
- dataface/core/execute/duckdb_cache.py +712 -0
- dataface/core/execute/duckdb_config.py +26 -0
- dataface/core/execute/errors.py +213 -0
- dataface/core/execute/executor.py +1249 -0
- dataface/core/execute/parallel.py +162 -0
- dataface/core/execute/setup_sql.py +58 -0
- dataface/core/execute/source_registry.py +72 -0
- dataface/core/execute/source_resolver.py +255 -0
- dataface/core/execute/sql_guard.py +387 -0
- dataface/core/execute/sql_literals.py +199 -0
- dataface/core/fonts.py +52 -0
- dataface/core/inspect/__init__.py +32 -0
- dataface/core/inspect/cache_factory.py +98 -0
- dataface/core/inspect/db_types.py +162 -0
- dataface/core/inspect/dbt_schema.py +96 -0
- dataface/core/inspect/defaults.yml +37 -0
- dataface/core/inspect/fanout_risk.py +109 -0
- dataface/core/inspect/manifest_utils.py +77 -0
- dataface/core/inspect/partials/categorical.yml +40 -0
- dataface/core/inspect/partials/date.yml +40 -0
- dataface/core/inspect/partials/numeric.yml +55 -0
- dataface/core/inspect/partition_types.py +38 -0
- dataface/core/inspect/query_validator.py +975 -0
- dataface/core/inspect/renderer.py +354 -0
- dataface/core/inspect/resolver.py +808 -0
- dataface/core/inspect/search.py +461 -0
- dataface/core/inspect/sources/__init__.py +32 -0
- dataface/core/inspect/sources/dbt.py +738 -0
- dataface/core/inspect/sources/duckdb_utils.py +66 -0
- dataface/core/inspect/templates/__init__.py +1 -0
- dataface/core/inspect/templates/categorical_column.yml +196 -0
- dataface/core/inspect/templates/charts.yml +109 -0
- dataface/core/inspect/templates/date_column.yml +248 -0
- dataface/core/inspect/templates/model.yml +138 -0
- dataface/core/inspect/templates/numeric_column.yml +261 -0
- dataface/core/inspect/templates/quality.yml +80 -0
- dataface/core/inspect/templates/string_column.yml +263 -0
- dataface/core/project_roots.py +165 -0
- dataface/core/render/__init__.py +87 -0
- dataface/core/render/board_links.py +176 -0
- dataface/core/render/chart/__init__.py +27 -0
- dataface/core/render/chart/arc_attached_table.py +251 -0
- dataface/core/render/chart/artifacts.py +16 -0
- dataface/core/render/chart/callout.py +225 -0
- dataface/core/render/chart/decisions.py +358 -0
- dataface/core/render/chart/geo.py +700 -0
- dataface/core/render/chart/kpi.py +916 -0
- dataface/core/render/chart/labels.py +76 -0
- dataface/core/render/chart/pipeline.py +818 -0
- dataface/core/render/chart/presentation.py +36 -0
- dataface/core/render/chart/profile.py +3438 -0
- dataface/core/render/chart/render_single.py +347 -0
- dataface/core/render/chart/renderers.py +193 -0
- dataface/core/render/chart/rendering.py +565 -0
- dataface/core/render/chart/serialization.py +90 -0
- dataface/core/render/chart/spark.py +496 -0
- dataface/core/render/chart/spark_bar.py +370 -0
- dataface/core/render/chart/spec_builders.py +154 -0
- dataface/core/render/chart/standard_renderer.py +2645 -0
- dataface/core/render/chart/table.py +2957 -0
- dataface/core/render/chart/table_support.py +1452 -0
- dataface/core/render/chart/tick_values.py +66 -0
- dataface/core/render/chart/time_unit_detect.py +809 -0
- dataface/core/render/chart/title_overflow.py +157 -0
- dataface/core/render/chart/type_inference.py +122 -0
- dataface/core/render/chart/validation.py +99 -0
- dataface/core/render/chart/vega_lite.py +125 -0
- dataface/core/render/chart/vega_lite_types.py +268 -0
- dataface/core/render/chart/vl_field_maps.py +346 -0
- dataface/core/render/chart_interactivity.py +24 -0
- dataface/core/render/control_registry.py +287 -0
- dataface/core/render/converters/__init__.py +24 -0
- dataface/core/render/converters/chart.py +276 -0
- dataface/core/render/converters/html.py +98 -0
- dataface/core/render/converters/pdf.py +40 -0
- dataface/core/render/converters/png.py +41 -0
- dataface/core/render/errors.py +144 -0
- dataface/core/render/face_api.py +160 -0
- dataface/core/render/faces.py +1194 -0
- dataface/core/render/font_measurement.py +48 -0
- dataface/core/render/font_support.py +197 -0
- dataface/core/render/fonts/DFTSansTabular-Regular.ttf +0 -0
- dataface/core/render/fonts/DFTSansTabular-Regular.woff2 +0 -0
- dataface/core/render/fonts/DFTSerifOldstyleProportional-Regular.ttf +0 -0
- dataface/core/render/fonts/DFTSerifOldstyleTabular-Regular.ttf +0 -0
- dataface/core/render/fonts/InterVariable.ttf +0 -0
- dataface/core/render/fonts/InterVariable.woff2 +0 -0
- dataface/core/render/fonts/NOTO_COLOR_EMOJI_LICENSE.txt +93 -0
- dataface/core/render/fonts/NOTO_EMOJI_LICENSE.txt +93 -0
- dataface/core/render/fonts/NotoColorEmoji-Regular.ttf +0 -0
- dataface/core/render/fonts/NotoColorEmoji-Regular.woff2 +0 -0
- dataface/core/render/fonts/NotoEmoji-Regular.ttf +0 -0
- dataface/core/render/fonts/NotoEmoji-Regular.woff2 +0 -0
- dataface/core/render/fonts/SOURCE_CODE_PRO_LICENSE.txt +93 -0
- dataface/core/render/fonts/SOURCE_SERIF_4_LICENSE.txt +98 -0
- dataface/core/render/fonts/SourceCodePro-Regular.ttf +0 -0
- dataface/core/render/fonts/SourceSerif4-Regular.ttf +0 -0
- dataface/core/render/fonts/_emoji_font_face.css +43 -0
- dataface/core/render/fonts/source-serif-4-variable-latin.woff2 +0 -0
- dataface/core/render/format_utils.py +329 -0
- dataface/core/render/geo_defaults.yml +28 -0
- dataface/core/render/json_format.py +146 -0
- dataface/core/render/layout_sizing.py +865 -0
- dataface/core/render/layouts.py +541 -0
- dataface/core/render/markdown_defaults.yml +16 -0
- dataface/core/render/missing_vars_prompt.py +79 -0
- dataface/core/render/placeholder.py +389 -0
- dataface/core/render/render_result.py +14 -0
- dataface/core/render/renderer.py +467 -0
- dataface/core/render/script_embedding.py +16 -0
- dataface/core/render/svg_utils.py +212 -0
- dataface/core/render/template_loader.py +69 -0
- dataface/core/render/templates/controls/_styles.css +606 -0
- dataface/core/render/templates/controls/checkbox.html +16 -0
- dataface/core/render/templates/controls/date.html +16 -0
- dataface/core/render/templates/controls/number.html +19 -0
- dataface/core/render/templates/controls/readonly.html +9 -0
- dataface/core/render/templates/controls/select.html +21 -0
- dataface/core/render/templates/controls/slider.html +22 -0
- dataface/core/render/templates/controls/text.html +16 -0
- dataface/core/render/templates/scripts/chart_interactivity.js +191 -0
- dataface/core/render/templates/scripts/variables.js +976 -0
- dataface/core/render/templates/svg/grid_pattern.svg +3 -0
- dataface/core/render/templates/svg/styles.css +51 -0
- dataface/core/render/terminal.py +311 -0
- dataface/core/render/terminal_charts.py +563 -0
- dataface/core/render/terminal_defaults.yml +2 -0
- dataface/core/render/terminal_layouts.py +299 -0
- dataface/core/render/terminal_text.py +31 -0
- dataface/core/render/text/__init__.py +1 -0
- dataface/core/render/text/case.py +113 -0
- dataface/core/render/text_format.py +129 -0
- dataface/core/render/utils.py +106 -0
- dataface/core/render/variable_controls.py +946 -0
- dataface/core/render/variable_input_refinement.py +140 -0
- dataface/core/render/warnings/__init__.py +15 -0
- dataface/core/render/warnings/bar_color_1_to_1_with_x.py +80 -0
- dataface/core/render/warnings/base.py +44 -0
- dataface/core/render/warnings/fanout_risk.py +15 -0
- dataface/core/render/warnings/from_query_diagnostic.py +56 -0
- dataface/core/render/warnings/missing_join_predicate.py +13 -0
- dataface/core/render/warnings/query_parse_error.py +14 -0
- dataface/core/render/warnings/query_returned_zero_rows.py +42 -0
- dataface/core/render/warnings/reaggregation.py +14 -0
- dataface/core/render/warnings/registry.py +45 -0
- dataface/core/render/warnings/suppression.py +46 -0
- dataface/core/render/warnings/temporal_single_point.py +63 -0
- dataface/core/render/warnings/unreferenced_chart.py +15 -0
- dataface/core/render/warnings/y_encoding_mostly_null.py +76 -0
- dataface/core/render/yaml_format.py +167 -0
- dataface/core/resolve_face.py +195 -0
- dataface/core/schema/__init__.py +0 -0
- dataface/core/schema/guidance.py +151 -0
- dataface/core/scoped_paths.py +59 -0
- dataface/core/serve/__init__.py +14 -0
- dataface/core/serve/bootstrap.py +39 -0
- dataface/core/serve/embedded.py +57 -0
- dataface/core/serve/port.py +129 -0
- dataface/core/serve/server.py +938 -0
- dataface/core/serve/templates/__init__.py +0 -0
- dataface/core/serve/templates/directory.yml +6 -0
- dataface/core/serve/templates/error.html.j2 +217 -0
- dataface/core/utils.py +121 -0
- dataface/core/validate.py +64 -0
- dataface/integrations/__init__.py +0 -0
- dataface/integrations/highlighting.py +351 -0
- dataface/integrations/markdown.py +537 -0
- dataface/py.typed +0 -0
- dataface-0.1.2.dist-info/METADATA +375 -0
- dataface-0.1.2.dist-info/RECORD +455 -0
- dataface-0.1.2.dist-info/WHEEL +4 -0
- dataface-0.1.2.dist-info/entry_points.txt +2 -0
- dataface-0.1.2.dist-info/licenses/LICENSE +202 -0
- mdsvg/__init__.py +168 -0
- mdsvg/fonts.py +656 -0
- mdsvg/images.py +299 -0
- mdsvg/parser.py +629 -0
- mdsvg/playground.py +284 -0
- mdsvg/py.typed +2 -0
- mdsvg/renderer.py +1623 -0
- mdsvg/style.py +355 -0
- mdsvg/types.py +200 -0
- mdsvg/utils.py +86 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dataface
|
|
3
|
+
Version: 0.1.2
|
|
4
|
+
Summary: Dataface - dbt-native dashboard and visualization layer
|
|
5
|
+
Author: Fivetran, Inc.
|
|
6
|
+
License-Expression: Apache-2.0
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Requires-Python: <3.14,>=3.10
|
|
17
|
+
Requires-Dist: dbt-adapters>=1.20
|
|
18
|
+
Requires-Dist: dbt-common>=1.0
|
|
19
|
+
Requires-Dist: dbt-duckdb>=1.10
|
|
20
|
+
Requires-Dist: duckdb>=0.9.0
|
|
21
|
+
Requires-Dist: fastapi>=0.100.0
|
|
22
|
+
Requires-Dist: fonttools>=4.0
|
|
23
|
+
Requires-Dist: httpx>=0.24.0
|
|
24
|
+
Requires-Dist: jinja2>=3.0.0
|
|
25
|
+
Requires-Dist: msgpack>=1.0.0
|
|
26
|
+
Requires-Dist: pillow>=9.0.0
|
|
27
|
+
Requires-Dist: plotext>=5.0.0
|
|
28
|
+
Requires-Dist: pyarrow>=14.0.1
|
|
29
|
+
Requires-Dist: pydantic>=2.0.0
|
|
30
|
+
Requires-Dist: pygments>=2.0.0
|
|
31
|
+
Requires-Dist: pyyaml>=6.0
|
|
32
|
+
Requires-Dist: reportlab>=4.0.0
|
|
33
|
+
Requires-Dist: rich>=13.0.0
|
|
34
|
+
Requires-Dist: sqlglot>=28.0.0
|
|
35
|
+
Requires-Dist: titlecase>=2.4
|
|
36
|
+
Requires-Dist: tomli-w>=1.0.0
|
|
37
|
+
Requires-Dist: tomli>=2.0.0; python_version < '3.11'
|
|
38
|
+
Requires-Dist: typer>=0.12
|
|
39
|
+
Requires-Dist: typing-extensions>=4.5.0
|
|
40
|
+
Requires-Dist: uvicorn>=0.23.0
|
|
41
|
+
Requires-Dist: vl-convert-python>=1.0.0
|
|
42
|
+
Provides-Extra: bigquery
|
|
43
|
+
Requires-Dist: dbt-bigquery<2.0,>=1.10; extra == 'bigquery'
|
|
44
|
+
Requires-Dist: google-cloud-bigquery>=3.33.0; extra == 'bigquery'
|
|
45
|
+
Provides-Extra: chat
|
|
46
|
+
Requires-Dist: anthropic>=0.39.0; extra == 'chat'
|
|
47
|
+
Requires-Dist: mcp>=1.0.0; extra == 'chat'
|
|
48
|
+
Requires-Dist: openai>=2.7.2; extra == 'chat'
|
|
49
|
+
Requires-Dist: prompt-toolkit>=3.0.43; extra == 'chat'
|
|
50
|
+
Provides-Extra: databricks
|
|
51
|
+
Requires-Dist: dbt-databricks<2.0,>=1.10; extra == 'databricks'
|
|
52
|
+
Provides-Extra: mcp
|
|
53
|
+
Requires-Dist: mcp>=1.0.0; extra == 'mcp'
|
|
54
|
+
Provides-Extra: mkdocs-plugin
|
|
55
|
+
Requires-Dist: mkdocs>=1.4.0; extra == 'mkdocs-plugin'
|
|
56
|
+
Provides-Extra: playground
|
|
57
|
+
Requires-Dist: dataface-playground; extra == 'playground'
|
|
58
|
+
Provides-Extra: postgresql
|
|
59
|
+
Requires-Dist: dbt-postgres<2.0,>=1.10; extra == 'postgresql'
|
|
60
|
+
Provides-Extra: redshift
|
|
61
|
+
Requires-Dist: dbt-redshift<2.0,>=1.10; extra == 'redshift'
|
|
62
|
+
Provides-Extra: server
|
|
63
|
+
Requires-Dist: fastapi>=0.100.0; extra == 'server'
|
|
64
|
+
Requires-Dist: uvicorn>=0.23.0; extra == 'server'
|
|
65
|
+
Provides-Extra: snowflake
|
|
66
|
+
Requires-Dist: dbt-snowflake<2.0,>=1.10; extra == 'snowflake'
|
|
67
|
+
Provides-Extra: spark
|
|
68
|
+
Requires-Dist: dbt-spark<2.0,>=1.10; extra == 'spark'
|
|
69
|
+
Description-Content-Type: text/markdown
|
|
70
|
+
|
|
71
|
+
# Dataface
|
|
72
|
+
|
|
73
|
+
**Declarative, dbt-native dashboards in YAML**
|
|
74
|
+
|
|
75
|
+
Dataface is a Python-based dashboard framework that compiles YAML dashboard definitions into interactive visualizations. It integrates seamlessly with dbt's Semantic Layer (MetricFlow) to provide a simple, declarative way to create dashboards.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## Why Dataface?
|
|
80
|
+
|
|
81
|
+
**Database + Interface = Dataface.** Dataface is designed to be the universal language of data visualization—perfect for humans and AI alike.
|
|
82
|
+
|
|
83
|
+
### The Problem
|
|
84
|
+
|
|
85
|
+
If you're a data analyst working with dbt, you've probably experienced this:
|
|
86
|
+
- ✅ You have great metrics and dimensions defined in dbt's Semantic Layer
|
|
87
|
+
- ✅ You want to create dashboards to share insights with your team
|
|
88
|
+
- ❌ But building dashboards requires learning complex BI tools, writing SQL queries, or coding
|
|
89
|
+
|
|
90
|
+
### The Solution
|
|
91
|
+
|
|
92
|
+
Dataface lets you:
|
|
93
|
+
- **Write dashboards in YAML** — simple, human-readable format
|
|
94
|
+
- **Reference your existing dbt metrics** — no need to redefine them
|
|
95
|
+
- **Create interactive visualizations** — filters, drill-downs, and click actions
|
|
96
|
+
- **Share and collaborate** — dashboards are version-controlled YAML files
|
|
97
|
+
- **Stay in sync with dbt** — dashboards and models deploy together through Git branches, eliminating broken dashboards after data migrations
|
|
98
|
+
|
|
99
|
+
### How It Works
|
|
100
|
+
|
|
101
|
+
1. **You write a YAML file** describing what data to show and how to visualize it
|
|
102
|
+
2. **Dataface compiles it** into an interactive dashboard
|
|
103
|
+
3. **The dashboard queries your dbt Semantic Layer** (MetricFlow) to fetch data
|
|
104
|
+
4. **Users interact** with filters, click charts, and explore the data
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Getting Started
|
|
109
|
+
|
|
110
|
+
### Install
|
|
111
|
+
|
|
112
|
+
Install from PyPI:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
pip install "dataface"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
For the AI agent (`dft chat`), use the `[chat]` extras bracket:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
pip install "dataface[chat]"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Quick Start
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# Bootstrap a new project
|
|
128
|
+
dft init
|
|
129
|
+
|
|
130
|
+
# Validate a face for errors
|
|
131
|
+
dft validate faces/hello.yml
|
|
132
|
+
|
|
133
|
+
# Start a live preview server
|
|
134
|
+
dft serve
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Environment variables
|
|
138
|
+
|
|
139
|
+
`dft` reads `DFT_PROJECT_DIR` when no `--project-dir` is passed — handy in CI or when working in multiple project trees from one shell. The flag wins if both are set. See the [CLI environment variables reference](https://docs.dataface.com/cli/#environment-variables) for the full list (themes, ports, dbt overrides, etc.).
|
|
140
|
+
|
|
141
|
+
### Place faces in your dbt project
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
my-dbt-project/
|
|
145
|
+
├── dbt_project.yml
|
|
146
|
+
├── models/
|
|
147
|
+
├── faces/ # Your faces here
|
|
148
|
+
│ ├── sales_overview.yml
|
|
149
|
+
│ ├── marketing.yml
|
|
150
|
+
│ └── finance.yml
|
|
151
|
+
└── assets/ # Assets directory (optional)
|
|
152
|
+
├── images/ # Logos, icons, images
|
|
153
|
+
└── data/ # CSV files and other data
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## Key Features
|
|
159
|
+
|
|
160
|
+
### 🎯 **dbt-Native**
|
|
161
|
+
- Uses dbt Semantic Layer (MetricFlow) directly
|
|
162
|
+
- Reads your `profiles.yml` automatically
|
|
163
|
+
- Works with all dbt adapters (Snowflake, BigQuery, Postgres, etc.)
|
|
164
|
+
- No need to redefine metrics
|
|
165
|
+
- Dashboards sync with dbt models through Git branches — no broken dashboards after data migrations
|
|
166
|
+
|
|
167
|
+
### 📝 **Declarative YAML**
|
|
168
|
+
- Human-readable, version-control friendly
|
|
169
|
+
- No code required
|
|
170
|
+
- AI-friendly format (perfect for LLMs to generate)
|
|
171
|
+
|
|
172
|
+
### 🎨 **Interactive Visualizations**
|
|
173
|
+
- Variables/filters that update in real-time
|
|
174
|
+
- Click interactions (drill-down, set variables, filter)
|
|
175
|
+
- Built on Vega-Lite (declarative charting)
|
|
176
|
+
|
|
177
|
+
### 🚀 **Multiple Output Modes**
|
|
178
|
+
- **Live mode:** Interactive web dashboard (FastAPI server)
|
|
179
|
+
- **Static mode:** Shareable HTML snapshot (data baked in)
|
|
180
|
+
- **PDF mode:** Printable/shareable PDF reports
|
|
181
|
+
|
|
182
|
+
### 🤖 **AI-First**
|
|
183
|
+
- YAML is perfect for AI generation
|
|
184
|
+
- MCP (Model Context Protocol) integration
|
|
185
|
+
- AI can create, modify, and iterate on dashboards
|
|
186
|
+
- Configure your IDE: `dft init mcp` (auto-detects Cursor, VS Code, Claude Desktop, Codex)
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Interactive Playground
|
|
191
|
+
|
|
192
|
+
Try Dataface online without installing anything:
|
|
193
|
+
|
|
194
|
+
**[play.dataface.com](https://play.dataface.com)**
|
|
195
|
+
|
|
196
|
+
A split-pane YAML editor with live preview. No dbt project needed (uses sample data).
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## CLI Commands
|
|
201
|
+
|
|
202
|
+
The Dataface CLI is called `dft` (short for **D**ata**F**ace **T**ool), intentionally mirroring `dbt` (Data Build Tool). Just as dbt transforms your data, dft transforms your dashboards.
|
|
203
|
+
|
|
204
|
+
### Validate
|
|
205
|
+
|
|
206
|
+
Validate dashboards for errors:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
dft validate [PATH]
|
|
210
|
+
|
|
211
|
+
# Examples:
|
|
212
|
+
dft validate # Validate all in faces/
|
|
213
|
+
dft validate faces/ # Validate all in a directory
|
|
214
|
+
dft validate faces/hello.yml # Validate one file
|
|
215
|
+
dft validate --strict # Fail on warnings
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Serve
|
|
219
|
+
|
|
220
|
+
Start interactive preview server:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
dft serve [OPTIONS]
|
|
224
|
+
|
|
225
|
+
# Examples:
|
|
226
|
+
dft serve
|
|
227
|
+
dft serve --port 3000
|
|
228
|
+
dft serve --host 0.0.0.0 # bind on the LAN, not just localhost
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Render
|
|
232
|
+
|
|
233
|
+
Render a dashboard to a self-contained file:
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
dft render FACE [OPTIONS]
|
|
237
|
+
|
|
238
|
+
# Examples:
|
|
239
|
+
dft render faces/hello.yml --format html
|
|
240
|
+
dft render faces/hello.yml --format pdf
|
|
241
|
+
dft render faces/hello.yml --format png --output hello.png
|
|
242
|
+
dft render faces/hello.yml --format json # resolved layout + executed data
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## Example Dashboards
|
|
248
|
+
|
|
249
|
+
### Simple KPI Dashboard
|
|
250
|
+
|
|
251
|
+
```yaml
|
|
252
|
+
title: "Executive KPIs"
|
|
253
|
+
|
|
254
|
+
queries:
|
|
255
|
+
q_totals:
|
|
256
|
+
metrics: [total_revenue, order_count, customer_count]
|
|
257
|
+
|
|
258
|
+
charts:
|
|
259
|
+
revenue:
|
|
260
|
+
label: "Total Revenue"
|
|
261
|
+
query: q_totals
|
|
262
|
+
type: kpi
|
|
263
|
+
value: total_revenue
|
|
264
|
+
orders:
|
|
265
|
+
label: "Total Orders"
|
|
266
|
+
query: q_totals
|
|
267
|
+
type: kpi
|
|
268
|
+
value: order_count
|
|
269
|
+
customers:
|
|
270
|
+
label: "Total Customers"
|
|
271
|
+
query: q_totals
|
|
272
|
+
type: kpi
|
|
273
|
+
value: customer_count
|
|
274
|
+
|
|
275
|
+
rows:
|
|
276
|
+
- title: "Key Metrics"
|
|
277
|
+
cols:
|
|
278
|
+
- revenue
|
|
279
|
+
- orders
|
|
280
|
+
- customers
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Interactive Dashboard with Filters
|
|
284
|
+
|
|
285
|
+
```yaml
|
|
286
|
+
title: "Sales Dashboard"
|
|
287
|
+
|
|
288
|
+
variables:
|
|
289
|
+
date_range:
|
|
290
|
+
input: daterange
|
|
291
|
+
default: "2024-01-01"
|
|
292
|
+
|
|
293
|
+
region:
|
|
294
|
+
input: multiselect
|
|
295
|
+
options:
|
|
296
|
+
static: ["North", "South", "East", "West"]
|
|
297
|
+
default: ["North", "South"]
|
|
298
|
+
|
|
299
|
+
queries:
|
|
300
|
+
q_sales:
|
|
301
|
+
metrics: [total_revenue, order_count]
|
|
302
|
+
dimensions: [month, region]
|
|
303
|
+
filters:
|
|
304
|
+
order_date: "{{ date_range }}"
|
|
305
|
+
region: "{{ region }}"
|
|
306
|
+
|
|
307
|
+
charts:
|
|
308
|
+
revenue_trend:
|
|
309
|
+
title: "Revenue Over Time"
|
|
310
|
+
query: q_sales
|
|
311
|
+
type: line
|
|
312
|
+
x: month
|
|
313
|
+
y: total_revenue
|
|
314
|
+
color: region
|
|
315
|
+
|
|
316
|
+
rows:
|
|
317
|
+
- title: "Revenue Trends"
|
|
318
|
+
cols:
|
|
319
|
+
- revenue_trend
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Architecture
|
|
325
|
+
|
|
326
|
+
Dataface is built on:
|
|
327
|
+
|
|
328
|
+
- **Python 3.10+** - Core language
|
|
329
|
+
- **Pydantic** - Schema validation and data models
|
|
330
|
+
- **Jinja2** - Template engine (same as dbt!)
|
|
331
|
+
- **Vega-Lite** - Declarative charting via `vl-convert`
|
|
332
|
+
- **FastAPI** - Web server for live mode
|
|
333
|
+
- **dbt adapters** - Direct database access
|
|
334
|
+
|
|
335
|
+
### How It Works
|
|
336
|
+
|
|
337
|
+
```
|
|
338
|
+
YAML Dashboard → Python Compiler → Vega-Lite Specs → Renderer
|
|
339
|
+
↓
|
|
340
|
+
(Validation)
|
|
341
|
+
↓
|
|
342
|
+
dbt MetricFlow → Query Data → Charts
|
|
343
|
+
↓
|
|
344
|
+
Live HTML or Static PDF
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## Comparison to Other Tools
|
|
350
|
+
|
|
351
|
+
| Feature | Dataface | Lightdash | Looker | Superset |
|
|
352
|
+
|---------|----------|-----------|--------|----------|
|
|
353
|
+
| **Format** | YAML | UI + YAML | LookML | UI |
|
|
354
|
+
| **dbt Integration** | Native (MetricFlow) | dbt metrics | Separate | Limited |
|
|
355
|
+
| **Installation** | `pip install dataface` | Self-host + PostgreSQL | Enterprise license | Self-host + database |
|
|
356
|
+
| **Version Control** | Native (Git) | Export/Import | Native (Git) | Limited |
|
|
357
|
+
| **AI-Friendly** | ✅ YAML | ⚠️ UI-first | ⚠️ LookML | ❌ |
|
|
358
|
+
| **Static Export** | ✅ PDF, HTML | ❌ | ⚠️ Enterprise | ❌ |
|
|
359
|
+
|
|
360
|
+
---
|
|
361
|
+
|
|
362
|
+
## Documentation
|
|
363
|
+
|
|
364
|
+
- [Getting Started Guide](https://docs.dataface.com/guides/getting-started) — Step-by-step onboarding
|
|
365
|
+
- [YAML Style Guide](https://docs.dataface.com/guides/yaml-style-guide) — Dashboard YAML conventions
|
|
366
|
+
- [CLI Reference](https://docs.dataface.com/cli/) — All `dft` commands
|
|
367
|
+
- [Chart Types](https://docs.dataface.com/charts/types) — Available chart types and configuration
|
|
368
|
+
- [Variables & Filters](https://docs.dataface.com/variables/) — Interactive variables and UI elements
|
|
369
|
+
- [Architecture](https://docs.dataface.com/contributing/architecture) — How Dataface works (compile → execute → render)
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## Contributing
|
|
374
|
+
|
|
375
|
+
Contributions welcome! See the [GitHub repository](https://github.com/Fivetran/dataface) for contributor setup, architecture docs, and development workflows.
|