Added audit_tableau_folder() for portfolio-scale
Tableau migration audits. It batch parses .twb /
.twbx files and returns workbook summaries, datasource
inventory, calculated-field complexity, field usage, lineage edges,
parse issues, optional CSV exports, and migration complexity
flags.
Added twb_lineage() for migration-oriented lineage
from datasources and tables through fields, calculated fields,
worksheets, and dashboards. Results can be returned as tidy node/edge
tables, an igraph object, or Mermaid text.
TwbParser now exposes this as get_lineage()
and parser$lineage.
Added migration-assistant helpers:
twb_migration_assessment(),
twb_compatibility(), translate_tableau_calc(),
export_migration_bundle(),
render_migration_brief(),
scaffold_shiny_dashboard(), and
scaffold_quarto_dashboard(). These add target-aware
readiness scoring, feature compatibility notes, deterministic formula
translation candidates, exportable migration bundles, Markdown briefs,
and starter rebuild scaffolds.
New twb_sheet_spec(): a full per-worksheet
visualization spec — mark type, rows/columns shelves in order,
dimensions vs. measures, every marks-card encoding (color, size, label,
detail, shape, tooltip, …), tooltip configuration, plus the sheet’s
filters, sorts, and axes. It reduces a worksheet to everything needed to
understand and rebuild its visualization in another tool (also available
as parser$sheet_spec /
parser$get_sheet_spec()).
New twb_dashboard_charts(): one row per worksheet
placed on each dashboard — mark type, fields, tooltip summary, and
layout position — so you can see at a glance what graphs a dashboard
page uses (also available as parser$dashboard_charts /
parser$get_dashboard_charts()).
New rebuild kit for the “what do I need to recreate?” questions:
twb_unused_fields() lists every raw field, calculated
field, and parameter that is defined but referenced nowhere (the
safe-to-drop list); twb_calc_build_order() returns
calculated fields topologically sorted so each formula is rebuilt after
the calculations it depends on, flagging dependency cycles instead of
silently emitting them in the wrong order; and
twb_parameter_usage() maps every parameter to its
consumption points — formulas, worksheet shelves/filters, and dashboard
filter zones. All three are also available as parser methods and
properties (parser$unused_fields,
parser$calc_build_order,
parser$parameter_usage), are exported as
unused_fields.csv, calc_build_order.csv, and
parameter_usage.csv by parse_twb(), and are
exercised by the new inst/extdata/rebuild_kit.twb
fixture.
New parse_twb() batch export: parse a
.twb/.twbx workbook and write a structured
report to disk — report.txt, one CSV per key table,
per-worksheet visualization specs (sheet_specs.txt), a
plain-text replication brief, and the field dependency graph as GraphML.
This delivers the parse_twb() entry point the README
previously documented but which did not exist.
tbs_publish_info() and
tbs_custom_sql_graphql() stubs. They were exported and
documented as querying Tableau Server/Cloud, but never made a network
request and always returned empty tibbles. Tableau Server/Cloud
integration is planned as a real feature; the premature stubs are gone
rather than silently returning no data.strict argument to
validate_relationships() is deprecated and ignored, while
remaining available for compatibility with 0.5.0 callers.?TwbParser rewritten from scratch: it now documents
every active-binding property (parser$summary,
parser$overview, parser$datasources, …) as the
primary API alongside every get_*() method.
summary is correctly described as a read-only property —
the previously documented parser$summary() call form never
worked at runtime.fs package
(uses base R), and the lifecycle badge is corrected to experimental
while the API is settling..twb_find_named() /
.twb_find_all_named() helpers).twb_install_active_properties() and the uncalled internal
print_datasource_summary().parse_twb(overwrite = TRUE) now removes the previous
outputs written by parse_twb before writing, so the export directory
reflects the current workbook instead of mixing stale and fresh files.
Unrelated files are left alone.twb_calc_build_order() crashing with “subscript
out of bounds” for calculated fields that reference no other calculated
field: a NULL dependency hit was deleting the list element
instead of recording an empty dependency set.<mark class="Bar"/>, not
<mark type="Bar"/>, so bar/line/etc. charts were
mislabeled as automatic unless a style rule happened to
name the mark.strict argument of
validate_relationships() (present in 0.5.0, dropped by
mistake): it is deprecated and ignored, warning only when explicitly
supplied.tbs_*()
server stubs or a strict argument that didn’t exist; footer
version corrected to 0.5.1.parse_twb() batch export and Shiny
app smoke tests (the bundled app file parses cleanly and the app object
builds headlessly).twb_dashboard_size() (page size and sizing mode),
twb_formatting() (fonts, colours, number formats, and other
style-rule formats), and twb_tooltips() (plain-text
worksheet tooltips). Each has a matching TwbParser getter
(get_dashboard_size(), get_formatting(),
get_tooltips()).run_twbparser_app() launches a bundled Shiny workbook
inspector with a to-scale dashboard layout view,
chart/ggplot2 hints, parameter and formatting tabs, a
replication brief, and CSV / R-scaffold exports.parser$get_parameters() (and
datasource_details$parameters) now return the actual
parameter fields via extract_parameters(). Previously it
returned a single row of datasource-level metadata, so most parameters
were dropped and the overview count was wrong.parser$summary now prints calculated fields as readable
formula blocks instead of escaped tibble cells.R/ before
release.run_twbparser_app() launches the bundled Shiny app for
inspecting .twb and .twbx workbooks.deploy/huggingface/ records the Docker Space deployment
files and notes: Dockerfile, Space README.md,
and DEPLOYING.md.parser$summary and parser$report now
expose a structured workbook report used by both console output and the
Shiny app.twb_sheet_shelves() — extract every field placed on
rows, cols, or an encoding shelf (color, size, label, detail, tooltip)
for one or all worksheets.twb_sheet_filters() — extract worksheet-level filters
including categorical member lists, range min/max, and include/exclude
mode.twb_sheet_axes() — extract per-axis configuration:
reversed, include-zero, and scale type (linear, log, …).twb_sheet_sorts() — extract sort directives with sort
direction and method (field aggregate, alphabetic, manual, data-source
order).TwbParser as
get_sheet_shelves(), get_sheet_filters(),
get_sheet_axes(), get_sheet_sorts() and as
no-parens active bindings (parser$sheet_shelves,
etc.).twb_dashboard_sheets() — list every worksheet placed on
a dashboard with zone id and pixel position (x, y, w, h).twb_dashboard_layout() — full zone tree including
parent zone id, component type (worksheet / filter / container / …),
layout type (tiled / floating), and pixel bounds.twb_dashboard_actions() — extract filter and URL
actions with source and target sheets, run-on trigger type, and URL
value.TwbParser as
get_dashboard_sheets(),
get_dashboard_layout(),
get_dashboard_actions() and as active bindings.plot_relationship_graph(): fixed edge direction — the
from vertex was incorrectly built from
right_field instead of left_field.plot_source_join_graph(): fixed reference to
non-existent columns left_source /
right_source; replaced with left_table /
right_table.infer_implicit_relationships(): added deduplication
before the field-name self-join to prevent Cartesian explosion when many
tables share a field name; added
relationship = "many-to-many" to suppress the dplyr 1.1+
warning.integer_ typo in insights.R that
caused errors when parsing dashboard zone dimensions..twb_clean_table() and
.twb_clean_field() helpers added to utils.R,
replacing four independent copies scattered across
fields.R, calculated_fields.R,
relationships.R, joins.R, and
dependency_graph.R..twb_clean_field() now correctly strips Tableau
column-instance prefixes (none:Category:nk →
Category) and returns unnamed vectors.unlockBinding() in internal TwbParser
active-binding helpers. This avoids CRAN’s “possibly unsafe call” NOTE
while keeping the same user-facing behaviour for no-parens properties
(overview, pages, datasources, etc.).NEWS.md file to track changes to the
package.