diff --git a/jc/lib.py b/jc/lib.py index d67009d7..acccd384 100644 --- a/jc/lib.py +++ b/jc/lib.py @@ -80,6 +80,7 @@ parsers: List[str] = [ 'ls', 'ls-s', 'lsattr', + 'lsb-release', 'lsblk', 'lsmod', 'lsof', diff --git a/jc/parsers/lsb_release.py b/jc/parsers/lsb_release.py new file mode 100644 index 00000000..aa3c8dd1 --- /dev/null +++ b/jc/parsers/lsb_release.py @@ -0,0 +1,89 @@ +"""jc - JSON Convert `lsb_release` command parser + +This parser is an alias to the Key/Value parser (`--kv`). + +Usage (cli): + + $ lsb_release -a | jc --lsb-release + +or + $ jc lsb_release -a + +Usage (module): + + import jc + result = jc.parse('lsb_release', lsb_release_command_output) + +Schema: + + { + "": string + } + +Examples: + + $ lsb_release -a | jc --lsb-release -p + { + "Distributor ID": "Ubuntu", + "Description": "Ubuntu 16.04.6 LTS", + "Release": "16.04", + "Codename": "xenial" + } +""" +from jc.jc_types import JSONDictType +import jc.parsers.kv +import jc.utils + + +class info(): + """Provides parser metadata (version, author, etc.)""" + version = '1.0' + description = '`lsb_release` command parser' + author = 'Kelly Brazil' + author_email = 'kellyjonbrazil@gmail.com' + details = 'Using the Key/Value parser' + compatible = ['linux', 'darwin', 'cygwin', 'win32', 'aix', 'freebsd'] + magic_commands = ['lsb_release'] + tags = ['command'] + + +__version__ = info.version + + +def _process(proc_data: JSONDictType) -> JSONDictType: + """ + Final processing to conform to the schema. + + Parameters: + + proc_data: (Dictionary) raw structured data to process + + Returns: + + Dictionary. Structured to conform to the schema. + """ + return jc.parsers.kv._process(proc_data) + + +def parse( + data: str, + raw: bool = False, + quiet: bool = False +) -> JSONDictType: + """ + 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. Raw or processed structured data. + """ + jc.utils.compatibility(__name__, info.compatible, quiet) + raw_output = jc.parsers.kv.parse(data, raw, quiet) + + return raw_output if raw else _process(raw_output) diff --git a/jc/parsers/os_release.py b/jc/parsers/os_release.py index baf7cf68..be11de59 100644 --- a/jc/parsers/os_release.py +++ b/jc/parsers/os_release.py @@ -9,7 +9,7 @@ Usage (cli): Usage (module): import jc - result = jc.parse('os_release', os_release_command_output) + result = jc.parse('os_release', os_release_output) Schema: diff --git a/tests/fixtures/generic/lsb_release-a.json b/tests/fixtures/generic/lsb_release-a.json new file mode 100644 index 00000000..a6963a3f --- /dev/null +++ b/tests/fixtures/generic/lsb_release-a.json @@ -0,0 +1 @@ +{"Distributor ID":"Ubuntu","Description":"Ubuntu 16.04.6 LTS","Release":"16.04","Codename":"xenial"} diff --git a/tests/fixtures/generic/lsb_release-a.out b/tests/fixtures/generic/lsb_release-a.out new file mode 100644 index 00000000..78bc3113 --- /dev/null +++ b/tests/fixtures/generic/lsb_release-a.out @@ -0,0 +1,4 @@ +Distributor ID: Ubuntu +Description: Ubuntu 16.04.6 LTS +Release: 16.04 +Codename: xenial diff --git a/tests/test_lsb_release.py b/tests/test_lsb_release.py new file mode 100644 index 00000000..5e2695c1 --- /dev/null +++ b/tests/test_lsb_release.py @@ -0,0 +1,47 @@ +import os +import unittest +import json +from typing import Dict +from jc.parsers.lsb_release import parse + +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) + + +class MyTests(unittest.TestCase): + f_in: Dict = {} + f_json: Dict = {} + + @classmethod + def setUpClass(cls): + fixtures = { + 'lsb_release_a': ( + 'fixtures/generic/lsb_release-a.out', + 'fixtures/generic/lsb_release-a.json') + } + + for file, filepaths in fixtures.items(): + with open(os.path.join(THIS_DIR, filepaths[0]), 'r', encoding='utf-8') as a, \ + open(os.path.join(THIS_DIR, filepaths[1]), 'r', encoding='utf-8') as b: + cls.f_in[file] = a.read() + cls.f_json[file] = json.loads(b.read()) + + + def test_lsb_release_nodata(self): + """ + Test 'lsb_release' with no data + """ + self.assertEqual(parse('', quiet=True), {}) + + + def test_lsb_release_a(self): + """ + Test 'lsb_release -a' + """ + self.assertEqual( + parse(self.f_in['lsb_release_a'], quiet=True), + self.f_json['lsb_release_a'] + ) + + +if __name__ == '__main__': + unittest.main()