From 0cc771f6331b0df7ae12b66097075480bef07bd4 Mon Sep 17 00:00:00 2001 From: Kevin Date: Sat, 27 Aug 2022 12:13:57 -0700 Subject: [PATCH] Add message showing the number of search results (#1524) * Added message showing the number of search results Modified _search_journal() to return a bool based upon whether any filter args were passed to the program. Added _print_entries_found_count() which prints a message based upon the number of entries found and prints warnings if the user was trying to edit or delete. * Add tests for search results msgs --- jrnl/jrnl.py | 60 +++++++++++++++++++++++++------ jrnl/messages/MsgText.py | 4 +++ tests/bdd/features/search.feature | 26 ++++++++++++-- 3 files changed, 77 insertions(+), 13 deletions(-) diff --git a/jrnl/jrnl.py b/jrnl/jrnl.py index 2b4df757..971ffd2a 100644 --- a/jrnl/jrnl.py +++ b/jrnl/jrnl.py @@ -173,8 +173,9 @@ def search_mode(args, journal, **kwargs): "old_entries": journal.entries, } - # Filters the journal entries in place - _search_journal(**kwargs) + if _has_search_args(args): + _filter_journal_entries(**kwargs) + _print_entries_found_count(len(journal), args) # Where do the search results go? if args.edit: @@ -196,6 +197,10 @@ def search_mode(args, journal, **kwargs): _edit_search_results(**kwargs) + elif not journal: + # Bail out if there are no entries and we're not editing + return + elif args.change_time: _change_time_search_results(**kwargs) @@ -244,8 +249,28 @@ def _get_editor_template(config, **kwargs): return template -def _search_journal(args, journal, **kwargs): - """Search the journal with the given args""" +def _has_search_args(args): + return any( + ( + args.on_date, + args.today_in_history, + args.text, + args.month, + args.day, + args.year, + args.start_date, + args.end_date, + args.strict, + args.starred, + args.excluded, + args.contains, + args.limit, + ) + ) + + +def _filter_journal_entries(args, journal, **kwargs): + """Filter journal entries in-place based upon search args""" if args.on_date: args.start_date = args.end_date = args.on_date @@ -269,6 +294,27 @@ def _search_journal(args, journal, **kwargs): journal.limit(args.limit) +def _print_entries_found_count(count, args): + if count == 0: + if args.edit or args.change_time: + print_msg(Message(MsgText.NothingToModify, MsgStyle.WARNING)) + elif args.delete: + print_msg(Message(MsgText.NothingToDelete, MsgStyle.WARNING)) + else: + print_msg(Message(MsgText.NoEntriesFound, MsgStyle.NORMAL)) + elif args.limit: + # Don't show count if the user expects a limited number of results + return + elif args.edit or not (args.change_time or args.delete): + # Don't show count if we are ONLY changing the time or deleting entries + my_msg = ( + MsgText.EntryFoundCountSingular + if count == 1 + else MsgText.EntryFoundCountPlural + ) + print_msg(Message(my_msg, MsgStyle.NORMAL, {"num": count})) + + def _other_entries(journal, entries): """Find entries that are not in journal""" return [e for e in entries if e not in journal.entries] @@ -352,9 +398,6 @@ def _get_predit_stats(journal): def _delete_search_results(journal, old_entries, **kwargs): - if not journal.entries: - raise JrnlException(Message(MsgText.NothingToDelete, MsgStyle.ERROR)) - entries_to_delete = journal.prompt_action_entries(MsgText.DeleteEntryQuestion) if entries_to_delete: @@ -365,9 +408,6 @@ def _delete_search_results(journal, old_entries, **kwargs): def _change_time_search_results(args, journal, old_entries, no_prompt=False, **kwargs): - if not journal.entries: - raise JrnlException(Message(MsgText.NothingToModify, MsgStyle.WARNING)) - # separate entries we are not editing other_entries = _other_entries(journal, old_entries) diff --git a/jrnl/messages/MsgText.py b/jrnl/messages/MsgText.py index 4e7149b8..0f509645 100644 --- a/jrnl/messages/MsgText.py +++ b/jrnl/messages/MsgText.py @@ -224,6 +224,10 @@ class MsgText(Enum): No entries to modify, because the search returned no results """ + NoEntriesFound = "no entries found" + EntryFoundCountSingular = "{num} entry found" + EntryFoundCountPlural = "{num} entries found" + # --- Formats --- # HeadingsPastH6 = """ Headings increased past H6 on export - {date} {title} diff --git a/tests/bdd/features/search.feature b/tests/bdd/features/search.feature index 5a3ed594..78e9a480 100644 --- a/tests/bdd/features/search.feature +++ b/tests/bdd/features/search.feature @@ -27,7 +27,8 @@ Feature: Searching in a journal When we run "jrnl tomorrow: A future entry." Then the output should contain "Entry added" When we run "jrnl -from today" - Then the output should contain "Adding an entry right now." + Then the output should contain "2 entries found" + And the output should contain "Adding an entry right now." And the output should contain "A future entry." And the output should not contain "This thing happened yesterday" @@ -47,7 +48,8 @@ Feature: Searching in a journal When we run "jrnl tomorrow: A future entry." Then the output should contain "Entry added" When we run "jrnl -from yesterday -to today" - Then the output should contain "This thing happened yesterday" + Then the output should contain "2 entries found" + And the output should contain "This thing happened yesterday" And the output should contain "Adding an entry right now." And the output should not contain "A future entry." @@ -61,6 +63,7 @@ Feature: Searching in a journal Given we use the config "" When we run "jrnl -contains first --short" Then we should get no error + And the output should contain "1 entry found" And the output should be 2020-08-29 11:11 Entry the first. @@ -70,6 +73,19 @@ Feature: Searching in a journal | basic_folder.yaml | | basic_dayone.yaml | + Scenario Outline: Searching for an unknown string + Given we use the config "" + When we run "jrnl -contains slkdfsdkfjsd" + Then we should get no error + And the output should contain "no entries found" + And the output should not contain "slkdfsdkfjsd" + + Examples: configs + | config_file | + | basic_onefile.yaml | + | basic_folder.yaml | + | basic_dayone.yaml | + Scenario Outline: Searching for a string within tag results Given we use the config "" When we run "jrnl @tagone -contains maybe" @@ -86,6 +102,7 @@ Feature: Searching in a journal Given we use the config "" When we run "jrnl -and @tagone @tagtwo -contains maybe" Then we should get no error + And the output should contain "1 entry found" And the output should contain "maybe" Examples: configs @@ -98,6 +115,7 @@ Feature: Searching in a journal Given we use the config "" When we run "jrnl -not @tagone -contains lonesome" Then we should get no error + And the output should contain "1 entry found" And the output should contain "lonesome" Examples: configs @@ -287,7 +305,8 @@ Feature: Searching in a journal And now is "2020-08-31 02:32:00 PM" When we run "jrnl 2019-08-31 01:01: Hi, from last year." And we run "jrnl -today-in-history --short" - Then the output should be + Then the output should contain "2 entries found" + And the output should be 2019-08-31 01:01 Hi, from last year. 2020-08-31 14:32 A second entry in what I hope to be a long series. @@ -302,6 +321,7 @@ Feature: Searching in a journal Given we use the config "dayone.yaml" When we run "jrnl -from 'feb 2013'" Then we should get no error + And the output should contain "3 entries found" And the output should be 2013-05-17 11:39 This entry has tags!