mirror of
https://github.com/kellyjonbrazil/jc.git
synced 2026-04-03 17:44:07 +02:00
Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b7756d9250 | ||
|
|
1cd2cd954c | ||
|
|
72020b8da9 | ||
|
|
cf9720b749 | ||
|
|
967b9db7f9 | ||
|
|
bb3acb1182 | ||
|
|
560c7f7e6d | ||
|
|
79b2841764 | ||
|
|
a06a89cbd1 | ||
|
|
431bd969eb | ||
|
|
c87b722aec | ||
|
|
3688b8b014 | ||
|
|
07b8d9e0c0 | ||
|
|
7454b53e39 | ||
|
|
3d6a76024d | ||
|
|
421b980957 | ||
|
|
4a22e27d6a | ||
|
|
99f7842dee |
22
README.md
22
README.md
@@ -69,10 +69,16 @@ Release notes can be found [here](https://blog.kellybrazil.com/category/jc-news/
|
||||
For more information on the motivations for this project, please see my [blog post](https://blog.kellybrazil.com/2019/11/26/bringing-the-unix-philosophy-to-the-21st-century/).
|
||||
|
||||
## Installation
|
||||
There are several ways to get `jc`. You can install via `pip`, `deb` or `rpm` packages, or by downloading the correct binary for your architecture and running it anywhere on your filesystem.
|
||||
|
||||
### Pip (macOS, linux, unix, Windows)
|
||||
```
|
||||
$ pip3 install --upgrade jc
|
||||
```
|
||||
|
||||
### Packages and Binaries
|
||||
Please see https://kellyjonbrazil.github.io/jc-packaging/ for details
|
||||
|
||||
## Usage
|
||||
`jc` accepts piped input from `STDIN` and outputs a JSON representation of the previous command's output to `STDOUT`.
|
||||
```
|
||||
@@ -144,6 +150,22 @@ The JSON output can be compact (default) or pretty formatted with the `-p` optio
|
||||
- `-q` quiet mode. Suppresses warning messages
|
||||
- `-r` raw output. Provides a more literal JSON output with all values as text and no additional sematic processing
|
||||
|
||||
### Setting Custom Colors via Environment Variable
|
||||
You can specify custom colors via the `JC_COLORS` environment variable. The `JC_COLORS` environment variable takes four comma separated string values in the following format:
|
||||
```
|
||||
JC_COLORS=<keyname_color>,<keyword_color>,<number_color>,<string_color>
|
||||
```
|
||||
Where colors are: `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `gray`, `brightblack`, `brightred`, `brightgreen`, `brightyellow`, `brightblue`, `brightmagenta`, `brightcyan`, `white`, or `default`
|
||||
|
||||
For example, to set to the default colors:
|
||||
```
|
||||
JC_COLORS=blue,brightblack,magenta,green
|
||||
```
|
||||
or
|
||||
```
|
||||
JC_COLORS=default,default,default,default
|
||||
```
|
||||
|
||||
## Contributions
|
||||
Feel free to add/improve code or parsers! You can use the [`jc/parsers/foo.py`](https://github.com/kellyjonbrazil/jc/blob/master/jc/parsers/foo.py) parser as a template and submit your parser with a pull request.
|
||||
|
||||
|
||||
@@ -1,5 +1,17 @@
|
||||
jc changelog
|
||||
|
||||
20200420 v1.10.6
|
||||
- Remove homebrew shim references from du osx tests
|
||||
|
||||
20200414 v1.10.5
|
||||
- Minor change of using sys.exit(0) instead of exit()
|
||||
|
||||
20200412 v1.10.4
|
||||
- Add color customization via JC_COLORS env variable
|
||||
|
||||
20200409 v1.10.3
|
||||
- Fix break on pipe error
|
||||
|
||||
20200409 v1.10.2
|
||||
- Change colors to ansi and match jello colors
|
||||
|
||||
|
||||
69
jc/cli.py
69
jc/cli.py
@@ -18,7 +18,7 @@ import jc.utils
|
||||
|
||||
|
||||
class info():
|
||||
version = '1.10.2'
|
||||
version = '1.10.6'
|
||||
description = 'jc cli output JSON conversion tool'
|
||||
author = 'Kelly Brazil'
|
||||
author_email = 'kellyjonbrazil@gmail.com'
|
||||
@@ -80,12 +80,52 @@ parsers = [
|
||||
]
|
||||
|
||||
|
||||
class JcStyle(Style):
|
||||
styles = {
|
||||
Name.Tag: 'bold ansiblue', # key names
|
||||
Keyword: 'ansibrightblack', # true, false, null
|
||||
Number: 'ansimagenta', # int, float
|
||||
String: 'ansigreen' # string
|
||||
def set_env_colors():
|
||||
"""
|
||||
Grab custom colors from JC_COLORS environment variable. JC_COLORS env variable takes 4 comma
|
||||
separated string values and should be in the format of:
|
||||
|
||||
JC_COLORS=<keyname_color>,<keyword_color>,<number_color>,<string_color>
|
||||
|
||||
Where colors are: black, red, green, yellow, blue, magenta, cyan, gray, brightblack, brightred,
|
||||
brightgreen, brightyellow, brightblue, brightmagenta, brightcyan, white, default
|
||||
|
||||
Default colors:
|
||||
|
||||
JC_COLORS=blue,brightblack,magenta,green
|
||||
or
|
||||
JC_COLORS=default,default,default,default
|
||||
|
||||
"""
|
||||
env_colors = os.getenv('JC_COLORS')
|
||||
input_error = False
|
||||
|
||||
if env_colors:
|
||||
color_list = env_colors.split(',')
|
||||
else:
|
||||
input_error = True
|
||||
|
||||
if env_colors and len(color_list) != 4:
|
||||
print('jc: Warning: could not parse JC_COLORS environment variable\n', file=sys.stderr)
|
||||
input_error = True
|
||||
|
||||
if env_colors:
|
||||
for color in color_list:
|
||||
if color not in ['black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'gray', 'brightblack', 'brightred',
|
||||
'brightgreen', 'brightyellow', 'brightblue', 'brightmagenta', 'brightcyan', 'white', 'default']:
|
||||
print('jc: Warning: could not parse JC_COLORS environment variable\n', file=sys.stderr)
|
||||
input_error = True
|
||||
|
||||
# if there is an issue with the env variable, just set all colors to default and move on
|
||||
if input_error:
|
||||
color_list = ['default', 'default', 'default', 'default']
|
||||
|
||||
# Try the color set in the JC_COLORS env variable first. If it is set to default, then fall back to default colors
|
||||
return {
|
||||
Name.Tag: f'bold ansi{color_list[0]}' if not color_list[0] == 'default' else f'bold ansiblue', # key names
|
||||
Keyword: f'ansi{color_list[1]}' if not color_list[1] == 'default' else f'ansibrightblack', # true, false, null
|
||||
Number: f'ansi{color_list[2]}' if not color_list[2] == 'default' else f'ansimagenta', # numbers
|
||||
String: f'ansi{color_list[3]}' if not color_list[3] == 'default' else f'ansigreen' # strings
|
||||
}
|
||||
|
||||
|
||||
@@ -205,6 +245,11 @@ def helptext(message):
|
||||
|
||||
|
||||
def json_out(data, pretty=False, mono=False, piped_out=False):
|
||||
# set colors
|
||||
class JcStyle(Style):
|
||||
styles = set_env_colors()
|
||||
|
||||
|
||||
if not mono and not piped_out:
|
||||
if pretty:
|
||||
print(highlight(json.dumps(data, indent=2), JsonLexer(), Terminal256Formatter(style=JcStyle))[0:-1])
|
||||
@@ -277,7 +322,7 @@ def magic():
|
||||
valid_command, run_command = generate_magic_command(sys.argv)
|
||||
if valid_command:
|
||||
os.system(run_command)
|
||||
exit()
|
||||
sys.exit(0)
|
||||
elif run_command is None:
|
||||
return
|
||||
else:
|
||||
@@ -289,6 +334,12 @@ def main():
|
||||
# break on ctrl-c keyboard interrupt
|
||||
signal.signal(signal.SIGINT, ctrlc)
|
||||
|
||||
# break on pipe error. need try/except for windows compatibility
|
||||
try:
|
||||
signal.signal(signal.SIGPIPE, signal.SIG_DFL)
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
# try magic syntax first: e.g. jc -p ls -al
|
||||
magic()
|
||||
|
||||
@@ -307,7 +358,7 @@ def main():
|
||||
|
||||
if 'a' in options:
|
||||
json_out(about_jc(), pretty=pretty, mono=mono, piped_out=piped_output())
|
||||
exit()
|
||||
sys.exit(0)
|
||||
|
||||
if sys.stdin.isatty():
|
||||
helptext('missing piped data')
|
||||
|
||||
2
setup.py
2
setup.py
@@ -5,7 +5,7 @@ with open('README.md', 'r') as f:
|
||||
|
||||
setuptools.setup(
|
||||
name='jc',
|
||||
version='1.10.2',
|
||||
version='1.10.6',
|
||||
author='Kelly Brazil',
|
||||
author_email='kellyjonbrazil@gmail.com',
|
||||
description='This tool serializes the output of popular command line tools and filetypes to structured JSON output.',
|
||||
|
||||
2
tests/fixtures/osx-10.11.6/du.json
vendored
2
tests/fixtures/osx-10.11.6/du.json
vendored
File diff suppressed because one or more lines are too long
7
tests/fixtures/osx-10.11.6/du.out
vendored
7
tests/fixtures/osx-10.11.6/du.out
vendored
@@ -911,13 +911,6 @@
|
||||
112 /usr/local/Homebrew/Library/Homebrew/rubocops/cask
|
||||
40 /usr/local/Homebrew/Library/Homebrew/rubocops/extend
|
||||
344 /usr/local/Homebrew/Library/Homebrew/rubocops
|
||||
288 /usr/local/Homebrew/Library/Homebrew/shims/linux/super
|
||||
288 /usr/local/Homebrew/Library/Homebrew/shims/linux
|
||||
344 /usr/local/Homebrew/Library/Homebrew/shims/mac/super
|
||||
344 /usr/local/Homebrew/Library/Homebrew/shims/mac
|
||||
16 /usr/local/Homebrew/Library/Homebrew/shims/scm
|
||||
280 /usr/local/Homebrew/Library/Homebrew/shims/super
|
||||
928 /usr/local/Homebrew/Library/Homebrew/shims
|
||||
24 /usr/local/Homebrew/Library/Homebrew/test/cask/artifact/shared_examples
|
||||
144 /usr/local/Homebrew/Library/Homebrew/test/cask/artifact
|
||||
24 /usr/local/Homebrew/Library/Homebrew/test/cask/cask_loader
|
||||
|
||||
2
tests/fixtures/osx-10.14.6/du.json
vendored
2
tests/fixtures/osx-10.14.6/du.json
vendored
File diff suppressed because one or more lines are too long
7
tests/fixtures/osx-10.14.6/du.out
vendored
7
tests/fixtures/osx-10.14.6/du.out
vendored
@@ -317,13 +317,6 @@
|
||||
32 /usr/local/Homebrew/Library/Homebrew/cli
|
||||
56 /usr/local/Homebrew/Library/Homebrew/manpages
|
||||
8 /usr/local/Homebrew/Library/Homebrew/version
|
||||
64 /usr/local/Homebrew/Library/Homebrew/shims/mac/super
|
||||
64 /usr/local/Homebrew/Library/Homebrew/shims/mac
|
||||
24 /usr/local/Homebrew/Library/Homebrew/shims/super
|
||||
8 /usr/local/Homebrew/Library/Homebrew/shims/linux/super
|
||||
8 /usr/local/Homebrew/Library/Homebrew/shims/linux
|
||||
8 /usr/local/Homebrew/Library/Homebrew/shims/scm
|
||||
104 /usr/local/Homebrew/Library/Homebrew/shims
|
||||
8 /usr/local/Homebrew/Library/Homebrew/debrew
|
||||
56 /usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig/10.8
|
||||
24 /usr/local/Homebrew/Library/Homebrew/os/mac/pkgconfig/10.6
|
||||
|
||||
Reference in New Issue
Block a user