summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2018-10-10 20:49:02 -0700
committerzlg <zlg@zlg.space>2018-10-10 20:49:02 -0700
commit411e47351c996aa1d1f19dc10366ee824d091b40 (patch)
tree03626608293d8382c1c1cb43ed229ac0cfe7638c
parentcli: Add "import" command (diff)
downloadvgstash-411e47351c996aa1d1f19dc10366ee824d091b40.tar.gz
vgstash-411e47351c996aa1d1f19dc10366ee824d091b40.tar.bz2
vgstash-411e47351c996aa1d1f19dc10366ee824d091b40.tar.xz
vgstash-411e47351c996aa1d1f19dc10366ee824d091b40.zip
cli: Add "export" command
The export command is like the import command; currently supporting YAML output, but ready to be expanded as needed.
-rw-r--r--src/vgstash/test_vgstash_cli.py21
-rw-r--r--src/vgstash_cli.py38
2 files changed, 54 insertions, 5 deletions
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")))
+