mirror of
https://github.com/jrnl-org/jrnl.git
synced 2025-05-10 08:38:32 +02:00
Fix -contains to allow multiple terms with "OR" logic unless -and is added (#1890)
* Store multiple -contains arguments (OR default). Allow multiple occurrences of the -contains argument to be stored in a list. Previously, only the last occurrence was considered. Additionally, the behavior has been modified to default to OR logic, meaning that if multiple -contains arguments are provided, entries matching any of them will be included in the results. * Solved issue #1877 "-and" flag with multiple instances of the -contains option. * Run poe format * Fix unit test for contains to allow list instead of single value * Add BDD tests for multiple contains with and without -and * Black version updated. * Revert pyproject.toml to appease poetry --------- Co-authored-by: Micah Jerome Ellison <micah.jerome.ellison@gmail.com>
This commit is contained in:
parent
0deadc03c8
commit
8957ceb74d
4 changed files with 48 additions and 5 deletions
|
@ -265,6 +265,7 @@ def parse_args(args: list[str] = []) -> argparse.Namespace:
|
|||
reading.add_argument(
|
||||
"-contains",
|
||||
dest="contains",
|
||||
action="append",
|
||||
metavar="TEXT",
|
||||
help="Show entries containing specific text (put quotes around text with "
|
||||
"spaces)",
|
||||
|
|
|
@ -246,7 +246,7 @@ class Journal:
|
|||
exclude_starred=False,
|
||||
exclude_tagged=False,
|
||||
strict=False,
|
||||
contains=None,
|
||||
contains=[],
|
||||
exclude=[],
|
||||
):
|
||||
"""Removes all entries from the journal that don't match the filter.
|
||||
|
@ -276,7 +276,7 @@ class Journal:
|
|||
return 0 < len([tag for tag in tags if tag in excluded_tags])
|
||||
|
||||
if contains:
|
||||
contains_lower = contains.casefold()
|
||||
contains_lower = [substring.casefold() for substring in contains]
|
||||
|
||||
# Create datetime object for comparison below
|
||||
# this approach allows various formats
|
||||
|
@ -298,8 +298,20 @@ class Journal:
|
|||
and (
|
||||
not contains
|
||||
or (
|
||||
contains_lower in entry.title.casefold()
|
||||
or contains_lower in entry.body.casefold()
|
||||
strict
|
||||
and all(
|
||||
substring in entry.title.casefold()
|
||||
or substring in entry.body.casefold()
|
||||
for substring in contains_lower
|
||||
)
|
||||
)
|
||||
or (
|
||||
not strict
|
||||
and any(
|
||||
substring in entry.title.casefold()
|
||||
or substring in entry.body.casefold()
|
||||
for substring in contains_lower
|
||||
)
|
||||
)
|
||||
)
|
||||
]
|
||||
|
|
|
@ -86,6 +86,36 @@ Feature: Searching in a journal
|
|||
| basic_folder.yaml |
|
||||
| basic_dayone.yaml |
|
||||
|
||||
Scenario Outline: Multiple -contains returns entries that match any
|
||||
Given we use the config "<config_file>"
|
||||
When we run "jrnl -contains emojis -contains lorem --short"
|
||||
Then we should get no error
|
||||
And the output should contain "3 entries found"
|
||||
And the output should be
|
||||
2020-08-29 11:11 Entry the first.
|
||||
2020-08-31 14:32 A second entry in what I hope to be a long series.
|
||||
2020-09-24 09:14 The third entry finally after weeks without writing.
|
||||
|
||||
Examples: configs
|
||||
| config_file |
|
||||
| basic_onefile.yaml |
|
||||
| basic_folder.yaml |
|
||||
| basic_dayone.yaml |
|
||||
|
||||
Scenario Outline: Multiple -contains with -and returns only entries that match all
|
||||
Given we use the config "<config_file>"
|
||||
When we run "jrnl -contains emojis -contains nulla -and --short"
|
||||
Then we should get no error
|
||||
And the output should contain "1 entry found"
|
||||
And the output should be
|
||||
2020-09-24 09:14 The third entry finally after weeks without writing.
|
||||
|
||||
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 "<config_file>"
|
||||
When we run "jrnl @tagone -contains maybe"
|
||||
|
|
|
@ -55,7 +55,7 @@ def test_empty():
|
|||
|
||||
|
||||
def test_contains_alone():
|
||||
assert cli_as_dict("-contains whatever") == expected_args(contains="whatever")
|
||||
assert cli_as_dict("-contains whatever") == expected_args(contains=["whatever"])
|
||||
|
||||
|
||||
def test_debug_alone():
|
||||
|
|
Loading…
Add table
Reference in a new issue