From 2c09a06b5ac7525b5130c607e46fd6d3e6324f02 Mon Sep 17 00:00:00 2001 From: Kelly Brazil Date: Fri, 22 Dec 2023 09:43:35 -0800 Subject: [PATCH] add kv_dup parser --- jc/lib.py | 1 + jc/parsers/kv_dup.py | 94 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 jc/parsers/kv_dup.py diff --git a/jc/lib.py b/jc/lib.py index 44f1aa17..31138212 100644 --- a/jc/lib.py +++ b/jc/lib.py @@ -76,6 +76,7 @@ parsers: List[str] = [ 'jobs', 'jwt', 'kv', + 'kv-dup', 'last', 'ls', 'ls-s', diff --git a/jc/parsers/kv_dup.py b/jc/parsers/kv_dup.py new file mode 100644 index 00000000..929fe981 --- /dev/null +++ b/jc/parsers/kv_dup.py @@ -0,0 +1,94 @@ +"""jc - JSON Convert `Key/Value` with duplicate key file and string parser + +Supports files containing simple key/value pairs and preserves duplicate +values. All values are contained in lists/arrays. + +- Delimiter can be `=` or `:`. Missing values are supported. +- Comment prefix can be `#` or `;`. Comments must be on their own line. +- If multi-line values are used, each line will be a separate item in the + value list. Blank lines in multi-line values are not supported. + +> Note: Values starting and ending with quotation marks will have the marks +> removed. If you would like to keep the quotation marks, use the `-r` +> command-line argument or the `raw=True` argument in `parse()`. + +Usage (cli): + + $ cat foo.txt | jc --kv + +Usage (module): + + import jc + result = jc.parse('kv', kv_file_output) + +Schema: + +Key/Value document converted to a dictionary - see the python configparser +standard library documentation for more details. + + { + "": [ + string + ], + "": [ + string + ] + } + +Examples: + + $ cat keyvalue.txt + # this file contains key/value pairs + name = John Doe + address=555 California Drive + age: 34 + + ; comments can include # or ; + # delimiter can be = or : + # quoted values have quotation marks stripped by default + # but can be preserved with the -r argument + occupation:"Engineer" + occupation = "Pilot" + + $ cat keyvalue.txt | jc --kv -p + { + "name": ["John Doe"], + "address": ["555 California Drive"], + "age": ["34"], + "occupation": ["Engineer", "Pilot"] + } +""" +import jc.parsers.ini_dup as ini_dup + + +class info(): + """Provides parser metadata (version, author, etc.)""" + version = '1.0' + description = 'Key/Value with duplicate key file and string parser' + author = 'Kelly Brazil' + author_email = 'kellyjonbrazil@gmail.com' + details = 'Using the ini-dup parser' + compatible = ['linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd'] + tags = ['generic', 'file', 'string'] + + +__version__ = info.version + + +def parse(data, raw=False, quiet=False): + """ + Main text parsing function + + Parameters: + + data: (string) text data to parse + raw: (boolean) unprocessed output if True + quiet: (boolean) suppress warning messages if True + + Returns: + + Dictionary representing a Key/Value pair document. + """ + # This parser is an alias of ini_dup.py + ini_dup.info = info # type: ignore + return ini_dup.parse(data, raw, quiet)