diff --git a/.gitignore b/.gitignore index 0351cb6a..afb0d874 100644 --- a/.gitignore +++ b/.gitignore @@ -54,8 +54,3 @@ exp/ _extras/ *.sublime-* site/ - -.coverage -.vscode/settings.json -coverage.xml -.vscode/launch.json \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 07d99bc3..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "behave", - "type": "python", - "request": "launch", - "program": "behave", // adjust as needed for virtualenv - "args": [ - "features/upgrade.feature", - "--stop", - "-n", - "without colors to colors" - ], - "justMyCode": true, - "console": "integratedTerminal" - }, - { - "name": "Jrnl", - "type": "python", - "request": "launch", - "program": "jrnl", //adjust as needed for virtualenv - "args": [], - "justMyCode": false, - "console": "integratedTerminal" - } - ], -} diff --git a/features/data/configs/pretty.yaml b/features/data/configs/pretty.yaml deleted file mode 100644 index 931c6199..00000000 --- a/features/data/configs/pretty.yaml +++ /dev/null @@ -1,19 +0,0 @@ -default_hour: 9 -default_minute: 0 -editor: "vim" -encrypt: false -highlight: true -journals: - default: features/journals/simple.journal -linewrap: 80 -tagsymbols: "@" -template: false -timeformat: "%Y-%m-%d %H:%M" -indent_character: "|" -colors: - body: green - title: blue - date: red - tags: magenta - - \ No newline at end of file diff --git a/features/format.feature b/features/format.feature index 8d805184..7bdaac4d 100644 --- a/features/format.feature +++ b/features/format.feature @@ -1,16 +1,30 @@ Feature: Custom formats - Scenario: Short printing via --format flag - Given We use the config "pretty.yaml" + Scenario Outline: Short printing via --format flag + Given We use the config ".yaml" + And we use the password "test" if prompted When we run "jrnl --format short -3" Then we should get no error - And the output should be pretty printed - - Scenario: Pretty Printing aka the Default - Given We use the config "pretty.yaml" + + Examples: configs + | config | + | basic_onefile | + | basic_encrypted | + | basic_folder | + | basic_dayone | + + Scenario Outline: Pretty Printing aka the Default + Given We use the config ".yaml" + And we use the password "test" if prompted When we run "jrnl --format pretty -3" Then we should get no error - And the output should be pretty printed + + Examples: configs + | config | + | basic_onefile | + | basic_encrypted | + | basic_folder | + | basic_dayone | Scenario Outline: JSON format Given we use the config ".yaml" diff --git a/features/steps/core.py b/features/steps/core.py index 97128094..870e7feb 100644 --- a/features/steps/core.py +++ b/features/steps/core.py @@ -430,7 +430,6 @@ def run(context, command, text=""): patch("sys.stdin.read", side_effect=lambda: text), \ patch("jrnl.time.parse", side_effect=_mock_time_parse(context)), \ patch("jrnl.config.get_config_path", side_effect=lambda: context.config_path), \ - patch("jrnl.install.load_or_install_jrnl",wraps=jrnl.install.load_or_install_jrnl), \ patch("jrnl.install.get_config_path", side_effect=lambda: context.config_path) \ : context.editor = mock_editor diff --git a/features/steps/export_steps.py b/features/steps/export_steps.py index e2adba2b..3df86237 100644 --- a/features/steps/export_steps.py +++ b/features/steps/export_steps.py @@ -8,48 +8,8 @@ import shutil import random import string from xml.etree import ElementTree -from colorama import Fore, Style from behave import given from behave import then -import colorama - - -def style_text(to_bold: bool, text_color: Fore, text_to_print: str): - """Generate colorized and styled text for expected output. Its purpose is the same as Entry.colorize - - :param to_bold: Flag whether the text should be bolded - :type to_bold: bool - :param text_color: Valid colorama.Fore color for the text - :type text_color: colorama.Fore - :param text_to_print: Message contents - :type text_to_print: str - :return: Styled and colored output - :rtype: str - """ - if to_bold: - text_style = Style.BRIGHT - else: - text_style = Style.NORMAL - text_color = getattr(colorama.Fore, text_color.upper(), None) - return text_style + text_color + text_to_print + Style.RESET_ALL - - -@then("the output should be pretty printed") -def check_export_pretty(context): - out = context.stdout_capture.getvalue() - lines = out.splitlines() - - # As per the configuration, - expected_colorized_title = ( - style_text( - True, context.jrnl_config["colors"]["date"].upper(), "2013-06-09 15:39" - ) - + " " - + style_text( - True, context.jrnl_config["colors"]["title"].upper(), "My first entry." - ) - ) - assert lines[0] == expected_colorized_title @then("the output should be parsable as json") diff --git a/jrnl/jrnl.py b/jrnl/jrnl.py index 52a3a194..b9053d4f 100644 --- a/jrnl/jrnl.py +++ b/jrnl/jrnl.py @@ -1,6 +1,7 @@ # Copyright (C) 2012-2021 jrnl contributors # License: https://www.gnu.org/licenses/gpl-3.0.html +from argparse import Namespace import logging import sys @@ -316,14 +317,18 @@ def _delete_search_results(journal, old_entries, **kwargs): def _display_search_results(args, journal, **kwargs): - if args.short: + if args.short or args.export == "short": print(journal.pprint(short=True)) + elif args.export == "pretty": + print(journal.pprint()) + elif args.tags: print(plugins.get_exporter("tags").export(journal)) elif args.export: _export_journal(args, journal) + elif kwargs["config"].get("display_format"): exporter = plugins.get_exporter(kwargs["config"]["display_format"]) print(exporter.export(journal, args.filename)) @@ -331,9 +336,6 @@ def _display_search_results(args, journal, **kwargs): print(journal.pprint()) -from argparse import Namespace - - def _export_journal(args: Namespace, journal: Journal): """Export journal using supplied export format Export formats "short" and "pretty" are shorthands for pre-configured @@ -344,10 +346,7 @@ def _export_journal(args: Namespace, journal: Journal): :param journal: journal under use :type journal: Journal """ - if args.export == "pretty": - print(journal.pprint(short=False)) - elif args.export == "short": - print(journal.pprint(short=True)) - else: - exporter = plugins.get_exporter(args.export) - print(exporter.export(journal, args.filename)) + # There are no exporter 'plugins' for pretty and short. We shouldn't expect this to be called for those two export formats. + assert args.export and args.export not in ("pretty", "short") + exporter = plugins.get_exporter(args.export) + print(exporter.export(journal, args.filename)) diff --git a/tests/test_display.py b/tests/test_display.py index 67ec80f3..95d8606a 100644 --- a/tests/test_display.py +++ b/tests/test_display.py @@ -2,41 +2,41 @@ import argparse import jrnl import pytest from unittest import mock -from jrnl.jrnl import _export_journal +from jrnl.jrnl import _display_search_results, _export_journal # fmt: off # see: https://github.com/psf/black/issues/664 @pytest.mark.parametrize("export_format", [ "pretty", "short",]) #fmt: on -@mock.patch.object(argparse, "Namespace", return_value={"export": None, "filename": None}) +@mock.patch.object(argparse, "Namespace", return_value={"export": "markdown", "filename": "irrele.vant"}) def test_export_format(mock_args, export_format): test_journal = jrnl.Journal.Journal mock_args.export = export_format - # fmt: off + #fmt: off # see: https://github.com/psf/black/issues/664 - with mock.patch("builtins.print") as print_spy, mock.patch("jrnl.Journal.Journal.pprint") as mock_pprint: - _export_journal(mock_args, test_journal) - print_spy.call_args_list = mock_pprint - # fmt: on + with mock.patch("builtins.print") as mock_spy_print, \ + mock.patch('jrnl.Journal.Journal.pprint') as mock_pprint: + _display_search_results(mock_args, test_journal) + mock_spy_print.assert_called_once_with(mock_pprint()) + #fmt: on -@mock.patch.object(argparse, "Namespace", return_value={"export": None, "filename": None}) +@mock.patch.object(argparse, "Namespace", return_value={"export": "markdown", "filename": "foo.jrnl"}) def test_export_plugin(mock_args): - export_format = "markdown" + export_format = mock_args.return_value["export"] test_journal = jrnl.Journal.Journal mock_args.export = export_format - mock_args.filename = "foo.jrnl" + mock_args.filename = mock_args.return_value['filename'] # fmt: off # see: https://github.com/psf/black/issues/664 with mock.patch("builtins.print") as print_spy, \ mock.patch("jrnl.plugins.get_exporter") as mock_get_exporter, \ - mock.patch("jrnl.Journal.Journal.pprint") as mock_pprint: + mock.patch("jrnl.Journal.Journal.pprint") : _export_journal(mock_args, test_journal) # fmt: on - - print_spy.call_args_list = mock_pprint mock_get_exporter.assert_called_once_with(export_format) + print_spy.assert_called_once_with(mock_get_exporter().export(test_journal,mock_args.filename))