databased.dbparsers

  1import argshell
  2
  3""" Parser building functions for DBShell """
  4
  5
  6def _get_base_parser(add_help: bool = False) -> argshell.ArgShellParser:
  7    """Returns base parser containing -t/--tables and -m/--match_pairs switches."""
  8    parser = argshell.ArgShellParser(add_help=add_help)
  9    parser.add_argument(
 10        "-t",
 11        "--tables",
 12        type=str,
 13        nargs="*",
 14        default=[],
 15        help="""Limits command to a specific list of tables""",
 16    )
 17    parser.add_argument(
 18        "-m",
 19        "--match_pairs",
 20        type=str,
 21        nargs="*",
 22        default=[],
 23        help=""" Pairs of columns and values to use for narrowing the scope of row operations.
 24        i.e. 'find -t users -m name Bob state Alaska last_login *' will print
 25        all rows from the users table that have the name Bob,
 26        are from the state Alaska, and last logged in at any date.""",
 27    )
 28    parser.add_argument(
 29        "-p",
 30        "--partial_matching",
 31        action="store_true",
 32        help=""" When selecting rows using a string, the string can be a substring instead of an exact match.
 33        i.e. "-t names -m first theo" only returns rows from names where the first name is exactly 'theo'.
 34        "-t names -m first theo -p" would return rows with first names of 'theo', but also rows with names like 'theodore'.  """,
 35    )
 36    return parser
 37
 38
 39def get_create_table_parser(add_help: bool = True) -> argshell.ArgShellParser:
 40    """Returns a parser for adding a table to the database."""
 41    parser = argshell.ArgShellParser(add_help=add_help)
 42    parser.add_argument(
 43        "table_name", type=str, help=""" The name of the table to add. """
 44    )
 45    parser.add_argument(
 46        "-c",
 47        "--columns",
 48        type=str,
 49        nargs="*",
 50        default=[],
 51        help=""" A list of column definitions for the table.
 52        i.e. 'mytable -c "username text unique" "date_registered timestamp" "email_verified int default 0"'""",
 53    )
 54    return parser
 55
 56
 57def get_add_row_parser() -> argshell.ArgShellParser:
 58    """Returns a parser for adding a row to a table."""
 59    parser = argshell.ArgShellParser(parents=[get_create_table_parser(False)])
 60    parser.add_argument(
 61        "-v",
 62        "--values",
 63        nargs="*",
 64        default=[],
 65        help=""" If -c/--columns is supplied, it and this flag must have the same number of elements.
 66        If -c/--columns is not supplied, an element must be supplied to this flag for every column in the table. """,
 67    )
 68    return parser
 69
 70
 71def get_search_parser() -> argshell.ArgShellParser:
 72    """Returns a search parser."""
 73    parser = argshell.ArgShellParser()
 74    parser.add_argument(
 75        "search_string", type=str, help=""" Search all columns for this substring. """
 76    )
 77    parser.add_argument(
 78        "-t",
 79        "--tables",
 80        type=str,
 81        nargs="*",
 82        default=None,
 83        help="""Limits search to a specific list of tables""",
 84    )
 85    parser.add_argument(
 86        "-c",
 87        "--columns",
 88        type=str,
 89        nargs="*",
 90        default=None,
 91        help=""" Limits search to these columns. """,
 92    )
 93    return parser
 94
 95
 96def get_lookup_parser() -> argshell.ArgShellParser:
 97    """Returns a parser for row lookup functions."""
 98    parser = argshell.ArgShellParser(parents=[_get_base_parser()])
 99    parser.add_argument(
100        "-c",
101        "--columns",
102        type=str,
103        nargs="*",
104        default=[],
105        help=""" Limits what columns are returned.""",
106    )
107    parser.add_argument(
108        "-o",
109        "--order_by",
110        type=str,
111        default=None,
112        help=""" The name of a column to sort results by.
113        Can include 'desc' as part of the argument.""",
114    )
115    parser.add_argument(
116        "-l",
117        "--limit",
118        type=int,
119        default=None,
120        help=""" Only return this many results. """,
121    )
122    return parser
123
124
125def get_update_parser() -> argshell.ArgShellParser:
126    """Returns a parser for update function."""
127    parser = argshell.ArgShellParser(parents=[_get_base_parser()])
128    parser.add_argument(
129        "-c", "--column", required=True, type=str, help=""" The column to update. """
130    )
131    parser.add_argument(
132        "-v",
133        "--new_value",
134        required=True,
135        help=""" The new value to update with. """,
136    )
137    return parser
138
139
140# ============================================================post parsers============================================================
141def convert_match_pairs(args: argshell.Namespace) -> argshell.Namespace:
142    """Create a list of tuples from match_pairs."""
143    if args.match_pairs:
144        args.match_pairs = [
145            (col, val)
146            for col, val in zip(args.match_pairs[::2], args.match_pairs[1::2])
147        ]
148    return args
149
150
151def verify_matching_length(args: argshell.Namespace) -> argshell.Namespace:
152    """Raise an error if -c/--columns is greater than zero and has
153    a different number of elements than -v/--values."""
154    if args.columns and len(args.columns) != len(args.values):
155        raise ValueError(
156            f"Column/Value length mismatch: {len(args.columns)} columns and {len(args.values)} values provided."
157        )
158    return args
def get_create_table_parser(add_help: bool = True) -> argshell.argshell.ArgShellParser:
40def get_create_table_parser(add_help: bool = True) -> argshell.ArgShellParser:
41    """Returns a parser for adding a table to the database."""
42    parser = argshell.ArgShellParser(add_help=add_help)
43    parser.add_argument(
44        "table_name", type=str, help=""" The name of the table to add. """
45    )
46    parser.add_argument(
47        "-c",
48        "--columns",
49        type=str,
50        nargs="*",
51        default=[],
52        help=""" A list of column definitions for the table.
53        i.e. 'mytable -c "username text unique" "date_registered timestamp" "email_verified int default 0"'""",
54    )
55    return parser

Returns a parser for adding a table to the database.

def get_add_row_parser() -> argshell.argshell.ArgShellParser:
58def get_add_row_parser() -> argshell.ArgShellParser:
59    """Returns a parser for adding a row to a table."""
60    parser = argshell.ArgShellParser(parents=[get_create_table_parser(False)])
61    parser.add_argument(
62        "-v",
63        "--values",
64        nargs="*",
65        default=[],
66        help=""" If -c/--columns is supplied, it and this flag must have the same number of elements.
67        If -c/--columns is not supplied, an element must be supplied to this flag for every column in the table. """,
68    )
69    return parser

Returns a parser for adding a row to a table.

def get_search_parser() -> argshell.argshell.ArgShellParser:
72def get_search_parser() -> argshell.ArgShellParser:
73    """Returns a search parser."""
74    parser = argshell.ArgShellParser()
75    parser.add_argument(
76        "search_string", type=str, help=""" Search all columns for this substring. """
77    )
78    parser.add_argument(
79        "-t",
80        "--tables",
81        type=str,
82        nargs="*",
83        default=None,
84        help="""Limits search to a specific list of tables""",
85    )
86    parser.add_argument(
87        "-c",
88        "--columns",
89        type=str,
90        nargs="*",
91        default=None,
92        help=""" Limits search to these columns. """,
93    )
94    return parser

Returns a search parser.

def get_lookup_parser() -> argshell.argshell.ArgShellParser:
 97def get_lookup_parser() -> argshell.ArgShellParser:
 98    """Returns a parser for row lookup functions."""
 99    parser = argshell.ArgShellParser(parents=[_get_base_parser()])
100    parser.add_argument(
101        "-c",
102        "--columns",
103        type=str,
104        nargs="*",
105        default=[],
106        help=""" Limits what columns are returned.""",
107    )
108    parser.add_argument(
109        "-o",
110        "--order_by",
111        type=str,
112        default=None,
113        help=""" The name of a column to sort results by.
114        Can include 'desc' as part of the argument.""",
115    )
116    parser.add_argument(
117        "-l",
118        "--limit",
119        type=int,
120        default=None,
121        help=""" Only return this many results. """,
122    )
123    return parser

Returns a parser for row lookup functions.

def get_update_parser() -> argshell.argshell.ArgShellParser:
126def get_update_parser() -> argshell.ArgShellParser:
127    """Returns a parser for update function."""
128    parser = argshell.ArgShellParser(parents=[_get_base_parser()])
129    parser.add_argument(
130        "-c", "--column", required=True, type=str, help=""" The column to update. """
131    )
132    parser.add_argument(
133        "-v",
134        "--new_value",
135        required=True,
136        help=""" The new value to update with. """,
137    )
138    return parser

Returns a parser for update function.

def convert_match_pairs(args: argshell.argshell.Namespace) -> argshell.argshell.Namespace:
142def convert_match_pairs(args: argshell.Namespace) -> argshell.Namespace:
143    """Create a list of tuples from match_pairs."""
144    if args.match_pairs:
145        args.match_pairs = [
146            (col, val)
147            for col, val in zip(args.match_pairs[::2], args.match_pairs[1::2])
148        ]
149    return args

Create a list of tuples from match_pairs.

def verify_matching_length(args: argshell.argshell.Namespace) -> argshell.argshell.Namespace:
152def verify_matching_length(args: argshell.Namespace) -> argshell.Namespace:
153    """Raise an error if -c/--columns is greater than zero and has
154    a different number of elements than -v/--values."""
155    if args.columns and len(args.columns) != len(args.values):
156        raise ValueError(
157            f"Column/Value length mismatch: {len(args.columns)} columns and {len(args.values)} values provided."
158        )
159    return args

Raise an error if -c/--columns is greater than zero and has a different number of elements than -v/--values.