jq for pythonista
Project description
jqfpy
========================================
.. image:: https://travis-ci.org/podhmo/jqfpy.svg?branch=master
:target: https://travis-ci.org/podhmo/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.
.. code-block:: json
{
"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).
.. code-block:: console
$ 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?
.. code-block:: console
$ 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
----------------------------------------
.. code-block:: console
$ pip install jqfpy
how to use
----------------------------------------
describe syntax
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
todo.
tutorial
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
this is jqfpy version of `jq's Tutorial <https://stedolan.github.io/jq/tutorial/>`_.
.. code-block:: console
$ alias jsonDATA="curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5'"
# jq.
$ jsonDATA | jq '.'
# jqfpy.
$ jsonDATA | jqfpy 'get()'
.. code-block:: console
# jq.
$ jsonDATA | jq '.[0]'
# jqfpy.
$ jsonDATA | jqfpy 'get()[0]'
.. code-block:: console
# 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")}'
.. code-block:: console
# 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]'
.. code-block:: console
# 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.
.. code-block:: console
$ pip install jqfpy[yaml]
and calling jqfpy with `--input-format,-i` option and `--output-format,-o` option.
02data.yaml
.. code-block:: yaml
person:
name: foo
age: 20
nickname: fool
.. code-block:: console
$ 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()
pick()
.. code-block:: console
$ 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()
.. code-block:: console
$ cat 02data.yaml | jqfpy -i yaml 'h.omit("person/nickname")'
{
"person": {
"name": "foo",
"age": 20
}
}
individual helper module with --additionals
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
match.py
.. code-block:: python
import re
def match(rx, text):
if text is None:
return False
return re.search(rx, text)
.. code-block:: console
$ 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.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
========================================
.. image:: https://travis-ci.org/podhmo/jqfpy.svg?branch=master
:target: https://travis-ci.org/podhmo/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.
.. code-block:: json
{
"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).
.. code-block:: console
$ 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?
.. code-block:: console
$ 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
----------------------------------------
.. code-block:: console
$ pip install jqfpy
how to use
----------------------------------------
describe syntax
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
todo.
tutorial
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
this is jqfpy version of `jq's Tutorial <https://stedolan.github.io/jq/tutorial/>`_.
.. code-block:: console
$ alias jsonDATA="curl 'https://api.github.com/repos/stedolan/jq/commits?per_page=5'"
# jq.
$ jsonDATA | jq '.'
# jqfpy.
$ jsonDATA | jqfpy 'get()'
.. code-block:: console
# jq.
$ jsonDATA | jq '.[0]'
# jqfpy.
$ jsonDATA | jqfpy 'get()[0]'
.. code-block:: console
# 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")}'
.. code-block:: console
# 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]'
.. code-block:: console
# 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.
.. code-block:: console
$ pip install jqfpy[yaml]
and calling jqfpy with `--input-format,-i` option and `--output-format,-o` option.
02data.yaml
.. code-block:: yaml
person:
name: foo
age: 20
nickname: fool
.. code-block:: console
$ 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()
pick()
.. code-block:: console
$ 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()
.. code-block:: console
$ cat 02data.yaml | jqfpy -i yaml 'h.omit("person/nickname")'
{
"person": {
"name": "foo",
"age": 20
}
}
individual helper module with --additionals
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
match.py
.. code-block:: python
import re
def match(rx, text):
if text is None:
return False
return re.search(rx, text)
.. code-block:: console
$ 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.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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
No source distribution files available for this release.See tutorial on generating distribution archives.
Built Distribution
jqfpy-0.5.0-py2.py3-none-any.whl
(10.9 kB
view details)
File details
Details for the file jqfpy-0.5.0-py2.py3-none-any.whl
.
File metadata
- Download URL: jqfpy-0.5.0-py2.py3-none-any.whl
- Upload date:
- Size: 10.9 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.31.1 CPython/3.7.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 01e01eebe4e940a07861f543fd81f4d8c2f3c829c00c492b46ba522dacf92628 |
|
MD5 | c8af0c5471c75dcf5dd0e6a5b8954bcd |
|
BLAKE2b-256 | 67228cfcd081b8653bdf2a235aa755d972284a711039ed1b573531cf7f54d284 |