Browse Source

Add more filtering options

master
JustAnotherArchivist 4 years ago
parent
commit
e5e7bdf8af
1 changed files with 22 additions and 10 deletions
  1. +22
    -10
      archivebot-jobs

+ 22
- 10
archivebot-jobs View File

@@ -24,7 +24,9 @@ do
echo "Options:" >&2
echo " --help, -h Show this message and exit." >&2
echo " --sort COLUMN, -s Sort the table by a column. This can be used multiple times to refine the sorting." >&2
echo " --filter COLUMN=VALUE, -f Filter the table for rows where a COLUMN has a certain VALUE. If specified multiple times, only the last value is used." >&2
echo " --filter FILTER, -f Filter the table for rows where a COLUMN has a certain VALUE. If specified multiple times, only the last value is used." >&2
echo " The FILTER has this format: COLUMN{=|<|>|^|$}VALUE" >&2
echo " = means the value must be exactly as specified; < and > mean it must be less/greater than the specified; ^ and $ mean it must start/end with the specified." >&2
echo " --no-colours, --no-colors Don't colourise the last activity column if it's been a while." >&2
echo " --no-table Raw output without feeding through column(1); columns are separated by tabs." >&2
echo "The COLUMNs are the names of each column, printed in capital letters in the first line of the output." >&2
@@ -53,17 +55,17 @@ done
# Validate sortcolumns and filter
if [[ "${filter}" ]]
then
if [[ ! "${filter}" == *=* ]]
if [[ "${filter}" == *$'\n'* ]]
then
echo "Invalid filter: ${filter}" >&2
echo "Invalid filter: newlines not allowed" >&2
exit 1
fi
if [[ "${filter}" == *$'\n'* ]]
if [[ ! ( "${filter}" == *'='* || "${filter}" == *'<'* || "${filter}" == *'>'* || "${filter}" == *'^'* || "${filter}" == *'$'* ) ]]
then
echo "Invalid filter: newlines not allowed" >&2
echo "Invalid filter: ${filter}" >&2
exit 1
fi
column="${filter%%=*}"
column="${filter%%[=<>^$]*}"
if ! valid_column "${column}"
then
echo "Invalid filter column: ${column}" >&2
@@ -146,10 +148,20 @@ if True: # For sensible indentation

# Filter
if filter:
column, value = filter.split("=", 1)
assert column in columns
columnIdx = columns.index(column)
jobs = [job for job in jobs if job[columnIdx] == value]
import re
match = re.match(r"^(?P<column>[A-Za-z ]+)(?P<op>[=<>^$])(?P<value>.*)$", filter)
filterDict = match.groupdict()
filterDict["column"] = filterDict["column"]
assert filterDict["column"] in columns
columnIdx = columns.index(filterDict["column"])
compFunc = {
"=": lambda a, b: a == b,
"<": lambda a, b: a < b,
">": lambda a, b: a > b,
"^": lambda a, b: a.startswith(b),
"$": lambda a, b: a.endswith(b),
}[filterDict["op"]]
jobs = [job for job in jobs if compFunc(job[columnIdx], filterDict["value"])]

# Sort
sortColumns = ('"$(printf "'%s', " "${sortcolumns[@]}")"')


Loading…
Cancel
Save