jqfpy 0.6.2

Creator: bradpython12

Last updated:

Add to Cart

Description:

jqfpy 0.6.2

jqfpy

jq is too difficult
jq is too difficult, at least for me.
For example, extracting key-name when use is true only, from below JSON data.
{
"apps": {
"foo": {
"use": true
},
"bar": {
"use": true
},
"boo": {
"use": true
},
"bee": {
"use": false
}
}
}

What is jq's answer? (taking over 30 minutes, my past challenges).
$ cat data.json | jq '.apps | . as $$o | keys | map(select($$o[.].use))'
[
"bar",
"boo",
"foo"
]

If you have python's knowledge, this is tiny oneliner, isn't it?
$ cat data.json | jqfpy '[k for k, opts in get("apps").items() if opts["use"]]'
[
"foo",
"bar",
"boo"
]

(get() is special function, like a json.load(sys.stdin).get.)
install
$ pip install jqfpy

how to use
describe syntax
todo.
tutorial
this is jqfpy version of jq's Tutorial
$ alias jsonDATA="curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5'"
# jq.
$ jsonDATA | jq '.'
# jqfpy.
$ jsonDATA | jqfpy 'get()'

# jq.
$ jsonDATA | jq '.[0]'
# jqfpy.
$ jsonDATA | jqfpy 'get()[0]'

# jq.
$ jsonDATA | jq '.[0] | {message: .commit.message, name: .commit.committer.name}'
# jqfpy.
$ jsonDATA | jqfpy 'd = get()[0]; {"message": get("commit/message", d), "name": get("commit/committer/name", d)}'
# or
$ jsonDATA | jqfpy '{"message": get("0/commit/message"), "name": get("0/commit/committer/name")}'

# jq.
$ jsonDATA | jq '.[] | {message: .commit.message, name: .commit.committer.name}'
# jqfpy.
$ jsonDATA | jqfpy --squash 'L = get(); [{"message": get("commit/message", d), "name": get("commit/committer/name", d)} for d in L]'

# jq.
$ jsonDATA | jq '[.[] | {message: .commit.message, name: .commit.committer.name, parents: [.parents[].html_url]}]'
# jqfpy.
$ jsonDATA | 'L = get(); [{"message": get("commit/message", d), "name": get("commit/committer/name", d), "parents": [p["html_url"] for p in d["parents"]]} for d in L]'
# or (using h.pick)
$ jsonDATA | 'L = get(); [h.pick("commit/message@message", "commit/committer/name@name", "parents[]/html_url@parents", d=d) for d in L]'

additionals
other formats support
jqfpy is supporting other formats(but this is experimental feature)

yaml
ltsv

if you want to use yaml supported version. install via below command.
$ pip install jqfpy[yaml]

and calling jqfpy with --input-format,-i option and --output-format,-o option.
02data.yaml
person:
name: foo
age: 20
nickname: fool

$ cat 02data.yaml | jqfpy -i yaml 'get("person")'
{
"name": "foo",
"age": 20,
"nickname": "fool"
}

$ cat 02data.yaml | jqfpy -i yaml -o ltsv 'get("person")'
name:foo age:20 nickname:fool

helper functions
helper functions are included.

pick()
omit()
flatten()
chunk()
loadfile()
dumpfile()

pick()
$ cat 02data.yaml | jqfpy -i yaml 'h.pick("person/name", "person/age")'
{
"person": {
"name": "foo",
"age": 20
}
}

$ cat 02data.yaml | jqfpy -i yaml 'h.pick("person/name@name", "person/age@age")'
{
"name": "foo",
"age": 20
}

omit()
$ cat 02data.yaml | jqfpy -i yaml 'h.omit("person/nickname")'
{
"person": {
"name": "foo",
"age": 20
}
}

flatten()
$ seq 1 5 | jqfpy --slurp -c 'L = get(); [L, L]'
[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
$ seq 1 5 | jqfpy --slurp -c 'L = get(); h.flatten([L, L], n=1)'
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]

chunk()
$ seq 1 10 | jqfpy --slurp -c 'h.chunk(get(), n=3)'
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

loadfile()
$ ls *.json
a.json b.json
$ echo '["a", "b"]' | jqfpy '{name: h.loadfile(f"{name}.json") for name in get()}'

--here and --relative-path options.
# see ./x.json
$ jqfpy 'h.loadfile("x.json")' a/b/main.json

# see ./a/b/x.json
$ jqfpy --here a/b/ 'h.loadfile("x.json")' a/b/main.json

# see ./a/b/x.json
$ jqfpy --relative-path 'h.loadfile("x.json")' a/b/main.json

dumpfile()
$ echo {"person0.json": {"name": "foo", "age": 20}, "person1.json": {"name": "bar}} | jqfpy '[h.dumpfile(v, fname) for fname, v in get().item()]' > /dev/null

individual helper module with --additionals
match.py
import re


def match(rx, text):
if text is None:
return False
return re.search(rx, text)

$ cat examples/additionals/00data.json | jqfpy --additionals=./match.py '[d for d in get("constraint") if h.match("^1\..+", d.get("version"))]'
[
{
"name": "github.com/Masterminds/vcs",
"version": "1.11.0"
},
{
"name": "github.com/boltdb/bolt",
"version": "1.0.0"
}
]

0.6.2

catch up magicalimport 0.8.1

0.6.1

fix --show-none option, always ignored, in 0.6.0

0.6.0

add --show-none (default, if return value is None, doesn't write to stdout)
add raw format
add short option -a and -u (drop --ascii-output asa -a)

0.5.4

change arguments order, h.dumpfile (#41)
fix bug for get() (#37)

0.5.3

fix bug for h.dumpfile()

0.5.2

add h.loadfile() function (#35)

0.5.1

h.dumpfile() with raw option

0.5.0

drop python 3.5
yaml output, oneline string including hash, always quoted (#28)
treat '/foo' as 'foo' (lstripped)
add h.dumpfile() function (#31)

0.4.2

support python 3.4
custom additionals (--additionals option)
new helpers -- h.flatten, h.flatten1 and h.chunk

0.4.1

ordered is default, when json loading

0.4.0

experimental ltsv support
adding helper functions (h.omit(), h.pick())
extend get() function's function
rename option(--show-code-only to --show-code)

0.3.2

the future is dropped that showing help when calling with no arguments

0.3.0

experimental yaml format support

0.2.0

correct behaviours of --slurp and --unbuffered
support accessing data by json pointer like format
compact output support
multiple files support
exec code only once

0.1.0

adding some options
nocode is same as jq . (js == jq .)
showing pycode when error is raised

0.0.1

first release

License

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Customer Reviews

There are no reviews.