mirror of
https://github.com/MinaSaad1/pbi-cli
synced 2026-04-21 13:37:19 +00:00
Pure-Python TMDL folder diff for CI/CD model change reporting. No Power BI Desktop connection required. Handles direct and SemanticModel folder layouts, strips lineageTags to avoid false positives, and keys relationships by fromColumn->toColumn instead of GUIDs. 18 tests covering all diff scenarios.
77 lines
2.6 KiB
Python
77 lines
2.6 KiB
Python
"""Database-level operations: list, TMDL import/export, TMSL export."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import click
|
|
|
|
from pbi_cli.commands._helpers import run_command
|
|
from pbi_cli.main import PbiContext, pass_context
|
|
|
|
|
|
@click.group()
|
|
def database() -> None:
|
|
"""Manage semantic models (databases) at the top level."""
|
|
|
|
|
|
@database.command(name="list")
|
|
@pass_context
|
|
def database_list(ctx: PbiContext) -> None:
|
|
"""List all databases on the connected server."""
|
|
from pbi_cli.core.session import get_session_for_command
|
|
from pbi_cli.core.tom_backend import database_list as _database_list
|
|
|
|
session = get_session_for_command(ctx)
|
|
run_command(ctx, _database_list, server=session.server)
|
|
|
|
|
|
@database.command(name="import-tmdl")
|
|
@click.argument("folder_path", type=click.Path(exists=True))
|
|
@pass_context
|
|
def import_tmdl(ctx: PbiContext, folder_path: str) -> None:
|
|
"""Import a model from a TMDL folder."""
|
|
from pbi_cli.core.session import get_session_for_command
|
|
from pbi_cli.core.tom_backend import import_tmdl as _import_tmdl
|
|
|
|
session = get_session_for_command(ctx)
|
|
run_command(ctx, _import_tmdl, server=session.server, folder_path=folder_path)
|
|
|
|
|
|
@database.command(name="export-tmdl")
|
|
@click.argument("folder_path", type=click.Path())
|
|
@pass_context
|
|
def export_tmdl(ctx: PbiContext, folder_path: str) -> None:
|
|
"""Export the model to a TMDL folder."""
|
|
from pbi_cli.core.session import get_session_for_command
|
|
from pbi_cli.core.tom_backend import export_tmdl as _export_tmdl
|
|
|
|
session = get_session_for_command(ctx)
|
|
run_command(ctx, _export_tmdl, database=session.database, folder_path=folder_path)
|
|
|
|
|
|
@database.command(name="diff-tmdl")
|
|
@click.argument("base_folder", type=click.Path(exists=True, file_okay=False))
|
|
@click.argument("head_folder", type=click.Path(exists=True, file_okay=False))
|
|
@pass_context
|
|
def diff_tmdl_cmd(ctx: PbiContext, base_folder: str, head_folder: str) -> None:
|
|
"""Compare two TMDL export folders and show what changed.
|
|
|
|
Useful for CI/CD to summarise model changes between branches:
|
|
|
|
pbi database diff-tmdl ./base-export/ ./head-export/
|
|
|
|
No Power BI Desktop connection is required.
|
|
"""
|
|
from pbi_cli.core.tmdl_diff import diff_tmdl_folders
|
|
|
|
run_command(ctx, diff_tmdl_folders, base_folder=base_folder, head_folder=head_folder)
|
|
|
|
|
|
@database.command(name="export-tmsl")
|
|
@pass_context
|
|
def export_tmsl(ctx: PbiContext) -> None:
|
|
"""Export the model as TMSL."""
|
|
from pbi_cli.core.session import get_session_for_command
|
|
from pbi_cli.core.tom_backend import export_tmsl as _export_tmsl
|
|
|
|
session = get_session_for_command(ctx)
|
|
run_command(ctx, _export_tmsl, database=session.database)
|