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(
|
reading.add_argument(
|
||||||
"-contains",
|
"-contains",
|
||||||
dest="contains",
|
dest="contains",
|
||||||
|
action="append",
|
||||||
metavar="TEXT",
|
metavar="TEXT",
|
||||||
help="Show entries containing specific text (put quotes around text with "
|
help="Show entries containing specific text (put quotes around text with "
|
||||||
"spaces)",
|
"spaces)",
|
||||||
|
|
|
@ -246,7 +246,7 @@ class Journal:
|
||||||
exclude_starred=False,
|
exclude_starred=False,
|
||||||
exclude_tagged=False,
|
exclude_tagged=False,
|
||||||
strict=False,
|
strict=False,
|
||||||
contains=None,
|
contains=[],
|
||||||
exclude=[],
|
exclude=[],
|
||||||
):
|
):
|
||||||
"""Removes all entries from the journal that don't match the filter.
|
"""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])
|
return 0 < len([tag for tag in tags if tag in excluded_tags])
|
||||||
|
|
||||||
if contains:
|
if contains:
|
||||||
contains_lower = contains.casefold()
|
contains_lower = [substring.casefold() for substring in contains]
|
||||||
|
|
||||||
# Create datetime object for comparison below
|
# Create datetime object for comparison below
|
||||||
# this approach allows various formats
|
# this approach allows various formats
|
||||||
|
@ -298,8 +298,20 @@ class Journal:
|
||||||
and (
|
and (
|
||||||
not contains
|
not contains
|
||||||
or (
|
or (
|
||||||
contains_lower in entry.title.casefold()
|
strict
|
||||||
or contains_lower in entry.body.casefold()
|
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_folder.yaml |
|
||||||
| basic_dayone.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
|
Scenario Outline: Searching for a string within tag results
|
||||||
Given we use the config "<config_file>"
|
Given we use the config "<config_file>"
|
||||||
When we run "jrnl @tagone -contains maybe"
|
When we run "jrnl @tagone -contains maybe"
|
||||||
|
|
|
@ -55,7 +55,7 @@ def test_empty():
|
||||||
|
|
||||||
|
|
||||||
def test_contains_alone():
|
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():
|
def test_debug_alone():
|
||||||
|
|
Loading…
Add table
Reference in a new issue