From 411e47351c996aa1d1f19dc10366ee824d091b40 Mon Sep 17 00:00:00 2001 From: zlg Date: Wed, 10 Oct 2018 20:49:02 -0700 Subject: cli: Add "export" command The export command is like the import command; currently supporting YAML output, but ready to be expanded as needed. --- src/vgstash/test_vgstash_cli.py | 21 +++++++++++++++++---- src/vgstash_cli.py | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/vgstash/test_vgstash_cli.py b/src/vgstash/test_vgstash_cli.py index 941179a..098c39e 100644 --- a/src/vgstash/test_vgstash_cli.py +++ b/src/vgstash/test_vgstash_cli.py @@ -6,6 +6,8 @@ import vgstash_cli from click.testing import CliRunner +# TODO: Setup a testing directory for test data and integrate with pytest + verbose = True interactive = False @@ -182,6 +184,7 @@ def test_update(): 'The Legend | NES | D | P\n' )) + def test_notes(): runner = CliRunner() result = runner.invoke(vgstash_cli.cli, ['notes', 'Vectorman 2', 'Genesis']) @@ -195,6 +198,7 @@ def test_notes(): 'boop\n' )) + def test_notes_edit(): if not interactive: return @@ -215,11 +219,11 @@ def test_notes_edit(): def test_import_file_yaml(): runner = CliRunner() - result = runner.invoke(vgstash_cli.cli, ["import", "test.yml"]) + result = runner.invoke(vgstash_cli.cli, ["import", "test_import.yml"]) if verbose: print(result.output) assert result.exit_code == 0 - assert result.output == "Successfully imported 2 games from {}.\n".format(os.path.join(os.getcwd(), "test.yml")) + assert result.output == "Successfully imported 2 games from {}.\n".format(os.path.join(os.getcwd(), "test_import.yml")) # List the results to make sure they match what the editor has. list_runner = CliRunner() @@ -231,11 +235,11 @@ def test_import_file_yaml(): def test_import_file_yaml_update(): runner = CliRunner() - result = runner.invoke(vgstash_cli.cli, ["import", "test.yml", "-u"]) + result = runner.invoke(vgstash_cli.cli, ["import", "test_import.yml", "-u"]) if verbose: print(result.output) assert result.exit_code == 0 - assert result.output == "Successfully imported 3 games from {}.\n".format(os.path.join(os.getcwd(), "test.yml")) + assert result.output == "Successfully imported 3 games from {}.\n".format(os.path.join(os.getcwd(), "test_import.yml")) # List the results to make sure they match what the editor has. list_runner = CliRunner() @@ -243,3 +247,12 @@ def test_import_file_yaml_update(): if verbose: print(list_result.output) assert list_result.exit_code == 0 + + +def test_export_file_yaml(): + runner = CliRunner() + result = runner.invoke(vgstash_cli.cli, ["export", "-f", "yaml", "test_export.yml"]) + if verbose: + print(result.output) + assert result.exit_code == 0 + assert result.output == "Successfully exported 6 games to {}.\n".format(os.path.join(os.getcwd(), "test_export.yml")) diff --git a/src/vgstash_cli.py b/src/vgstash_cli.py index 5f69c47..72a751a 100644 --- a/src/vgstash_cli.py +++ b/src/vgstash_cli.py @@ -120,7 +120,6 @@ def list_games(filter, raw, width): notes = notes.replace('\r', '\\r') else: notes = '' - if raw: click.echo("|".join(( r['title'], @@ -209,6 +208,7 @@ def notes(title, system, edit): dir_okay=False, file_okay=True), default=sys.stdin, + required=False, ) def import_file(format, filepath, update): """ @@ -236,3 +236,39 @@ def import_file(format, filepath, update): except sqlite3.IntegrityError as e: count -= 1 click.echo("Successfully imported {} games from {}.".format(count, filepath)) + + +@cli.command("export") +@click.option("--format", "-f", type=click.Choice(["yaml"]), required=False, default="yaml") +@click.argument("filepath", + type=click.Path( + exists=False, + readable=True, + writable=True, + resolve_path=True, + dir_okay=False, + file_okay=True), + default=sys.stdout, + required=False, + ) +def export_file(format, filepath): + """ + Export the game database to a file written in the chosen format. + + The default format is YAML. + """ + db = get_db() + data = db.list_games() + game_set = [] + # Time to re-read master's code + if format == "yaml": + for game in data: + g = {} + for field in game.keys(): + g.update({field: game[field]}) + game_set.append(g) + with open(filepath, "w") as fp: + yaml.dump(game_set, fp, default_flow_style=False, + indent=4, allow_unicode=True) + click.echo("Successfully exported 6 games to {}.".format(os.path.join(os.getcwd(), "test_export.yml"))) + -- cgit v1.2.3-54-g00ecf