Skip to content

Commit

Permalink
Add option to force Unix EOL on YAML export via the CLI (#316)
Browse files Browse the repository at this point in the history
* Initial stab at unix eol option to export functions
* Added test and linted
* Update pre-commit config
* Added more testing for coverage
* Lint fixes
* PR comments
* Fixed pre 3.10 type union
* export_test updates per PR
  • Loading branch information
kevmk04 authored Sep 26, 2024
1 parent a62d13d commit 4deefb7
Show file tree
Hide file tree
Showing 3 changed files with 372 additions and 11 deletions.
79 changes: 69 additions & 10 deletions src/preset_cli/cli/superset/export.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import re
from collections import defaultdict
from pathlib import Path
from typing import Any, Callable, List, Set, Tuple
from typing import Any, Callable, List, Set, Tuple, Union
from zipfile import ZipFile

import click
Expand All @@ -21,6 +21,11 @@
assert JINJA2_OPEN_MARKER != JINJA2_CLOSE_MARKER


def get_newline_char(force_unix_eol: bool = False) -> Union[str, None]:
"""Returns the newline character used by the open function"""
return "\n" if force_unix_eol else None


@click.command()
@click.argument("directory", type=click.Path(exists=True, resolve_path=True))
@click.option(
Expand All @@ -35,6 +40,12 @@
default=False,
help="Disable Jinja template escaping",
)
@click.option(
"--force-unix-eol",
is_flag=True,
default=False,
help="Force Unix end-of-line characters, otherwise use system default",
)
@click.option(
"--asset-type",
help="Asset type",
Expand Down Expand Up @@ -71,6 +82,7 @@ def export_assets( # pylint: disable=too-many-locals, too-many-arguments
dashboard_ids: List[str],
overwrite: bool = False,
disable_jinja_escaping: bool = False,
force_unix_eol: bool = False,
) -> None:
"""
Export DBs/datasets/charts/dashboards to a directory.
Expand Down Expand Up @@ -100,6 +112,7 @@ def export_assets( # pylint: disable=too-many-locals, too-many-arguments
overwrite,
disable_jinja_escaping,
skip_related=not ids_requested,
force_unix_eol=force_unix_eol,
)


Expand All @@ -111,6 +124,7 @@ def export_resource( # pylint: disable=too-many-arguments, too-many-locals
overwrite: bool,
disable_jinja_escaping: bool,
skip_related: bool = True,
force_unix_eol: bool = False,
) -> None:
"""
Export a given resource and unzip it in a directory.
Expand Down Expand Up @@ -149,7 +163,8 @@ def export_resource( # pylint: disable=too-many-arguments, too-many-locals

file_contents = yaml.dump(asset_content, sort_keys=False)

with open(target, "w", encoding="utf-8") as output:
newline = get_newline_char(force_unix_eol)
with open(target, "w", encoding="utf-8", newline=newline) as output:
output.write(file_contents)


Expand Down Expand Up @@ -221,8 +236,18 @@ def jinja_escaper(value: str) -> str:
type=click.Path(resolve_path=True),
default="users.yaml",
)
@click.option(
"--force-unix-eol",
is_flag=True,
default=False,
help="Force Unix end-of-line characters, otherwise use system default",
)
@click.pass_context
def export_users(ctx: click.core.Context, path: str) -> None:
def export_users(
ctx: click.core.Context,
path: str,
force_unix_eol: bool = False,
) -> None:
"""
Export users and their roles to a YAML file.
"""
Expand All @@ -234,7 +259,8 @@ def export_users(ctx: click.core.Context, path: str) -> None:
{k: v for k, v in user.items() if k != "id"} for user in client.export_users()
]

with open(path, "w", encoding="utf-8") as output:
newline = get_newline_char(force_unix_eol)
with open(path, "w", encoding="utf-8", newline=newline) as output:
yaml.dump(users, output)


Expand All @@ -244,16 +270,27 @@ def export_users(ctx: click.core.Context, path: str) -> None:
type=click.Path(resolve_path=True),
default="roles.yaml",
)
@click.option(
"--force-unix-eol",
is_flag=True,
default=False,
help="Force Unix end-of-line characters, otherwise use system default",
)
@click.pass_context
def export_roles(ctx: click.core.Context, path: str) -> None:
def export_roles(
ctx: click.core.Context,
path: str,
force_unix_eol: bool = False,
) -> None:
"""
Export roles to a YAML file.
"""
auth = ctx.obj["AUTH"]
url = URL(ctx.obj["INSTANCE"])
client = SupersetClient(url, auth)

with open(path, "w", encoding="utf-8") as output:
newline = get_newline_char(force_unix_eol)
with open(path, "w", encoding="utf-8", newline=newline) as output:
yaml.dump(list(client.export_roles()), output)


Expand All @@ -263,16 +300,27 @@ def export_roles(ctx: click.core.Context, path: str) -> None:
type=click.Path(resolve_path=True),
default="rls.yaml",
)
@click.option(
"--force-unix-eol",
is_flag=True,
default=False,
help="Force Unix end-of-line characters, otherwise use system default",
)
@click.pass_context
def export_rls(ctx: click.core.Context, path: str) -> None:
def export_rls(
ctx: click.core.Context,
path: str,
force_unix_eol: bool = False,
) -> None:
"""
Export RLS rules to a YAML file.
"""
auth = ctx.obj["AUTH"]
url = URL(ctx.obj["INSTANCE"])
client = SupersetClient(url, auth)

with open(path, "w", encoding="utf-8") as output:
newline = get_newline_char(force_unix_eol)
with open(path, "w", encoding="utf-8", newline=newline) as output:
yaml.dump(list(client.export_rls()), output, sort_keys=False)


Expand All @@ -282,8 +330,18 @@ def export_rls(ctx: click.core.Context, path: str) -> None:
type=click.Path(resolve_path=True),
default="ownership.yaml",
)
@click.option(
"--force-unix-eol",
is_flag=True,
default=False,
help="Force Unix end-of-line characters, otherwise use system default",
)
@click.pass_context
def export_ownership(ctx: click.core.Context, path: str) -> None:
def export_ownership(
ctx: click.core.Context,
path: str,
force_unix_eol: bool = False,
) -> None:
"""
Export DBs/datasets/charts/dashboards ownership to a YAML file.
"""
Expand All @@ -302,5 +360,6 @@ def export_ownership(ctx: click.core.Context, path: str) -> None:
},
)

with open(path, "w", encoding="utf-8") as output:
newline = get_newline_char(force_unix_eol)
with open(path, "w", encoding="utf-8", newline=newline) as output:
yaml.dump(dict(ownership), output)
Loading

0 comments on commit 4deefb7

Please sign in to comment.