I’m excited to announce the release of jc version 1.18.1 available on github and pypi. This release includes several enhancements when using jc as a Python library. Enhancements include some higher-level APIs and improved documentation to simplify the use of jc in Python programs and scripts. Error message improvements have been made on the CLI as well.
jc can be installed via pip or through several official OS package repositories, including Debian, Ubuntu, Fedora, openSUSE, Arch Linux, NixOS Linux, Guix System Linux, FreeBSD, and macOS. For more information on how to get jc, see the project README.
To upgrade with pip:
$ pip3 install --upgrade jc
New Features
- New high-level
parseAPI that works for both builtin and custom plugin parsers
>>> import jc
>>> jc.parse('date', 'Thu Jan 27 11:40:00 PST 2022')
{'year': 2022, 'month': 'Jan', 'month_num': 1, 'day': 27, 'weekday': 'Thu', 'weekday_num': 4, 'hour': 11, 'hour_24': 11, 'minute': 40, 'second': 0, 'period': 'AM', 'timezone': 'PST', 'utc_offset': None, 'day_of_year': 27, 'week_of_year': 4, 'iso': '2022-01-27T11:40:00', 'epoch': 1643312400, 'epoch_utc': None, 'timezone_aware': False}
- Several other high-level functions in
jc.libthat allow you to gather detailed parser information:parser_mod_list() -> listplugin_parser_mod_list() -> listget_help(parser_module_name: str) -> None
- Enhanced CLI error messages for certain OS errors that can happen when using the “magic syntax” (file permission errors, etc.)
v1.18.2 Updates
- Enhanced documentation for public functions, including type annotations
- Additional high-level convenience functions:
parser_info(parser_module_name: str) -> dictall_parser_info() -> list[dict]
- Enhanced CLI error message to suggest setting locale to C when parsing errors occur
- Bug fix for plugin parsers with underscore(s) in the name
v1.18.3 Updates
- Add
rsynccommand and log file parser tested on linux and macOS - Add
rsynccommand and log file streaming parser tested on linux and macOS - Add
xrandrcommand parser tested on linux - Enhance timestamp performance with caching and format hints
- Refactor ignore_exceptions functionality in streaming parsers
- Fix man page in packages
rsync command parser
Linux and macOS support for the rsync command. (Documentation):
$ rsync -i -a source/ dest | jc --rsync -p # or jc -p rsync -i -a source/ dest
[
{
"summary": {
"sent": 1708,
"received": 8209,
"bytes_sec": 19834.0,
"total_size": 235,
"speedup": 0.02
},
"files": [
{
"filename": "./",
"metadata": ".d..t......",
"update_type": "not updated",
"file_type": "directory",
"checksum_or_value_different": false,
"size_different": false,
"modification_time_different": true,
"permissions_different": false,
"owner_different": false,
"group_different": false,
"acl_different": false,
"extended_attribute_different": false
},
...
]
}
]
rsync command streaming parser
Linux support for the rsync command. This is a streaming parser and it outputs JSON Lines. (Documentation):
$ rsync -i -a source/ dest | jc --rsync-s
{"type":"file","filename":"./","metadata":".d..t......","update_...}
...
xrandr command parser
Linux support for the xrandr command. (Documentation):
$ xrandr | jc --xrandr -p # or jc -p xrandr
{
"screens": [
{
"screen_number": 0,
"minimum_width": 8,
"minimum_height": 8,
"current_width": 1920,
"current_height": 1080,
"maximum_width": 32767,
"maximum_height": 32767,
"associated_device": {
"associated_modes": [
{
"resolution_width": 1920,
"resolution_height": 1080,
"is_high_resolution": false,
"frequencies": [
{
"frequency": 60.03,
"is_current": true,
"is_preferred": true
},
{
"frequency": 59.93,
"is_current": false,
"is_preferred": false
}
]
},
{
"resolution_width": 1680,
"resolution_height": 1050,
"is_high_resolution": false,
"frequencies": [
{
"frequency": 59.88,
"is_current": false,
"is_preferred": false
}
]
}
],
"is_connected": true,
"is_primary": true,
"device_name": "eDP1",
"resolution_width": 1920,
"resolution_height": 1080,
"offset_width": 0,
"offset_height": 0,
"dimension_width": 310,
"dimension_height": 170
}
}
],
"unassociated_devices": []
}
v1.18.4 Updates
- Add
nmclicommand parser tested on linux - Enhance parse error messages at the cli
- Add standard and streaming parser list functions to the public API
- Enhance python developer documentation formatting
nmcli command parser
Linux support for the nmcli command. (Documentation):
$ nmcli connection show ens33 | jc --nmcli -p # or jc -p nmcli connection show ens33
[
{
"connection_id": "ens33",
"connection_uuid": "d92ece08-9e02-47d5-b2d2-92c80e155744",
"connection_stable_id": null,
"connection_type": "802-3-ethernet",
"connection_interface_name": "ens33",
"connection_autoconnect": "yes",
...
"ip4_address_1": "192.168.71.180/24",
"ip4_gateway": "192.168.71.2",
"ip4_route_1": {
"dst": "0.0.0.0/0",
"nh": "192.168.71.2",
"mt": 100
},
"ip4_route_2": {
"dst": "192.168.71.0/24",
"nh": "0.0.0.0",
"mt": 100
},
"ip4_dns_1": "192.168.71.2",
"ip4_domain_1": "localdomain",
"dhcp4_option_1": {
"name": "broadcast_address",
"value": "192.168.71.255"
},
...
"ip6_address_1": "fe80::c1cb:715d:bc3e:b8a0/64",
"ip6_gateway": null,
"ip6_route_1": {
"dst": "fe80::/64",
"nh": "::",
"mt": 100
}
}
]
v1.18.5 Updates
- Fix date parser to ensure AM/PM period string is always uppercase. Fixes broken tests in some locales
v1.18.6 Updates
- Add
pidstatcommand parser tested on linux - Add
pidstatcommand streaming parser tested on linux - Add
mpstatcommand parser tested on linux - Add
mpstatcommand streaming parser tested on linux - Add single-line ASCII and Unicode table parser
- Add multi-line ASCII and Unicode table parser
- Add a
documentationoption toparser_info()andall_parser_info()
pidstat command parser
Linux support for the pidstat command. (Documentation):
$ pidstat -hl | jc --pidstat -p # or jc -p pidstat -hl
[
{
"time": 1646859134,
"uid": 0,
"pid": 1,
"percent_usr": 0.0,
"percent_system": 0.03,
"percent_guest": 0.0,
"percent_cpu": 0.03,
"cpu": 0,
"command": "/usr/lib/systemd/systemd --switched-root --system..."
},
{
"time": 1646859134,
"uid": 0,
"pid": 6,
"percent_usr": 0.0,
"percent_system": 0.0,
"percent_guest": 0.0,
"percent_cpu": 0.0,
"cpu": 0,
"command": "ksoftirqd/0"
},
{
"time": 1646859134,
"uid": 0,
"pid": 2263,
"percent_usr": 0.0,
"percent_system": 0.0,
"percent_guest": 0.0,
"percent_cpu": 0.0,
"cpu": 0,
"command": "kworker/0:0"
}
]
pidstat command streaming parser
Linux support for the pidstat command. This is a streaming parser and it outputs JSON Lines. (Documentation):
$ pidstat -hl | jc --pidstat-s
{"time":1646859134,"uid":0,"pid":1,"percent_usr":0.0,"percent_syste...}
{"time":1646859134,"uid":0,"pid":6,"percent_usr":0.0,"percent_syste...}
{"time":1646859134,"uid":0,"pid":9,"percent_usr":0.0,"percent_syste...}
...
asciitable ASCII and Unicode table parser
Supports parsing various styles of plain text tables. (Documentation):
$ echo '
> ╒══════════╤═════════╤════════╕
> │ foo │ bar │ baz │
> ╞══════════╪═════════╪════════╡
> │ good day │ │ 12345 │
> ├──────────┼─────────┼────────┤
> │ hi there │ abc def │ 3.14 │
> ╘══════════╧═════════╧════════╛' | jc --asciitable -p
[
{
"foo": "good day",
"bar": null,
"baz": "12345"
},
{
"foo": "hi there",
"bar": "abc def",
"baz": "3.14"
}
]
asciitable-m multi-line ASCII and Unicode table parser
Supports parsing various styles of plain text tables with multi-line rows. (Documentation):
$ echo '
> +----------+---------+--------+
> | foo | bar | baz |
> | | | buz |
> +==========+=========+========+
> | good day | 12345 | |
> | mate | | |
> +----------+---------+--------+
> | hi there | abc def | 3.14 |
> | | | |
> +==========+=========+========+' | jc --asciitable-m -p
[
{
"foo": "good day\nmate",
"bar": "12345",
"baz_buz": null
},
{
"foo": "hi there",
"bar": "abc def",
"baz_buz": "3.14"
}
]
v1.18.7 Updates
- Add
git-logcommand parser tested on linux and macOS - Add
update-alternatives --querycommand parser tested on linux - Add
update-alternatives --get-selectionscommand parser tested on linux - Fix key/value and INI parsers to allow duplicate keys
- Fix YAML file parser for files including timestamp objects
- Update
xrandrparser: add arotationfield - Fix failing tests by moving template files
- Add python interpreter version and path to
-vand-aoutput
git-log command parser
Linux support for the git log command. (Documentation):
$ git log --stat | jc --git-log -p or: jc -p git log --stat
[
{
"commit": "728d882ed007b3c8b785018874a0eb06e1143b66",
"author": "Kelly Brazil",
"author_email": "kellyjonbrazil@gmail.com",
"date": "Wed Apr 20 09:50:19 2022 -0400",
"stats": {
"files_changed": 2,
"insertions": 90,
"deletions": 12,
"files": [
"docs/parsers/git_log.md",
"jc/parsers/git_log.py"
]
},
"message": "add timestamp docs and examples",
"epoch": 1650462619,
"epoch_utc": null
},
{
"commit": "b53e42aca623181aa9bc72194e6eeef1e9a3a237",
"author": "Kelly Brazil",
"author_email": "kellyjonbrazil@gmail.com",
"date": "Wed Apr 20 09:44:42 2022 -0400",
"stats": {
"files_changed": 5,
"insertions": 29,
"deletions": 6,
"files": [
"docs/parsers/git_log.md",
"docs/utils.md",
"jc/parsers/git_log.py",
"jc/utils.py",
"man/jc.1"
]
},
"message": "add calculated timestamp",
"epoch": 1650462282,
"epoch_utc": null
}
]
update-alternatives --query command parser
Linux support for the update-alternatives --query command. (Documentation):
$ update-alternatives --query editor | jc --update-alt-q -p # or: jc -p update-alternatives --query editor
{
"name": "editor",
"link": "/usr/bin/editor",
"slaves": [
{
"name": "editor.1.gz",
"path": "/usr/share/man/man1/editor.1.gz"
},
{
"name": "editor.da.1.gz",
"path": "/usr/share/man/da/man1/editor.1.gz"
}
],
"status": "auto",
"best": "/bin/nano",
"value": "/bin/nano",
"alternatives": [
{
"name": "/bin/ed",
"priority": -100,
"slaves": [
{
"name": "editor.1.gz",
"path": "/usr/share/man/man1/ed.1.gz"
}
]
},
{
"name": "/bin/nano",
"priority": 40,
"slaves": [
{
"name": "editor.1.gz",
"path": "/usr/share/man/man1/nano.1.gz"
}
]
}
]
}
update-alternatives --get-selections command parser
Linux support for the update-alternatives --get-selections command. (Documentation):
$ update-alternatives --get-selections | jc --update-alt-gs -p # or: jc -p update-alternatives --get-selections
[
{
"name": "arptables",
"status": "auto",
"current": "/usr/sbin/arptables-nft"
},
{
"name": "awk",
"status": "auto",
"current": "/usr/bin/gawk"
}
]
v1.18.8 Updates
- Fix
update-alternatives --queryparser for cases whereslavesare not present - Fix
UnicodeEncodeErroron some systems whereLANG=Cis set and Unicode characters are in the output - Update
historycommand parser: do not drop non-ASCII characters if the system is configured for UTF-8 encoding - Enhance “magic syntax” to always use UTF-8 encoding