jsqryはjqよりも優れています

私にはHabréの最後の記事で、私が書いたJsqryのライブラリJSONオブジェクトのためのシンプルで便利なクエリ言語(DSL)を提供し、。それからかなりの時間が経過し、ライブラリも開発されました。誇りの別の理由-ライブラリはテストによって98%のコードカバレッジを持っています。ただし、この記事は完全に彼女に関するものではありません。



多くの方はjq、コマンドラインとスクリプトでJSONを操作するための事実上の標準であるツールに精通していると思います。私もそれのアクティブユーザーでした。しかし、私はこのユーティリティのクエリの不当な複雑さと直感的でない構文について常に心配していました。そして私だけではありません、ここにハッカーニュースからのほんの少しの引用があります



私は何年もjqを使用していますが、それでも期待どおりに動作させることができません。



jqでも同じ問題があります。単純な選択以外の方法を理解するには、googlefuを使用する必要があります。



メンタルモデルという用語が何であるかはわかりませんが、jqをクリックさせることができません。主な理由は、たまにしか必要ないからです。それは非常に強力に見えるので、それは私にとってイライラします。



私はここで反対意見かもしれないことを知っていますが、頭を包むことはできませんjq。私が管理することができjq .jq .fooそしてjq -r、それを超えて、DSLは、私にはちょうど不透明です。



それを言いましょう:jqは素晴らしいツールですが、DSLはただ悪いです。



ええ、私はjqがregexesを書くのに似ていると思います:私は常に構文を調べなければならず、パターンが一致しない理由が混乱した後にのみ機能し、数日ですべてを忘れるので、後でもう一度学習する必要があります。

要するに、あなたはおそらくすでに推測しているでしょう。JSライブラリをコマンドラインの実行可能ファイルに変えてみませんか。ここには1つのニュアンスがあります。ライブラリはJSで記述されており、そのDSLもJSに依存しています。これは、プログラムと一部のJSランタイムを自己完結型の実行可能ファイルにパッケージ化する方法を見つける必要があることを意味します。



jsqry-GraalVMエディション



まだ主題に触れていない人(本当にまだそのようなものはありますか?OO)のために、GraalVMは追加機能を備えたOracleからのそのようなポンプアップされたJVMであり、その中で最も注目すべきものは次のとおりです。



  1. JVM — Java, Javascript, Python, Ruby, R, ..
  2. AOT- — Java
  3. JIT- Java.


Graal , , -.



, 1. 2. — JS .



https://github.com/jsqry/jsqry-cli. , — deprecated. , . , 99 . - . , jq 3.7 Linux 64.



.



, Java + JS GraalVM.





App.java. , java- Apache Commons CLI.



java- javascript , src/main/resources.



. -



scripts.add(new String(Files.readAllBytes(Paths.get(jsFileResource.toURI()))));


( , native-image)



java.nio.file.FileSystemNotFoundException: Provider "resource" not installed


"" InputStream



scripts.add(new Scanner(jsFileResource.openStream()).useDelimiter("\\A").next());


, 100% Java .



java.awt.Graphics. GraalVM AWS Lambda .



jsqry — QuickJS edition



- JS QuickJS . qjsc . ES2020. !



, CLI- jsqry: https://github.com/jsqry/jsqry-cli2.

.



, jsqry?



jsqry ( jq) JSON "" DSL.



— JS jsqry .







$ echo '[{"name":"John","age":30},
         {"name":"Alice","age":25},
         {"name":"Bob","age":50}]' | jsqry 'name'
[
  "John",
  "Alice",
  "Bob"
]




$ echo '[{"name":"John","age":30},
         {"name":"Alice","age":25},
         {"name":"Bob","age":50}]' | jsqry -1 'name'
"John"




$ echo '[{"name":"John","age":30},{"name":"Alice","age":25},{"name":"Bob","age":50}]' \
    | jsqry '[ _.age>=? && _.name.toLowerCase().startsWith(?) ]' --arg 30 --arg-str joh 
[
  {
    "name": "John",
    "age": 30
  }
]


JSON pretty-printer



$ echo '[{"name":"John","age":30},{"name":"Alice","age":25},{"name":"Bob","age":50}]' \
 | jsqry
[
  {
    "name": "John",
    "age": 30
  },
  {
    "name": "Alice",
    "age": 25
  },
  {
    "name": "Bob",
    "age": 50
  }
]


JSON . !



-



2, 100, 2 . . DSL.



$ echo '[1,2,3,4,5]' | jsqry '[_>2] {_+100} s(-_) [-2:]'
[
  104,
  103
]


JS



jsqry JS- 1 , JS !



$ echo '["HTTP://EXAMPLE.COM/123", 
         "https://www.Google.com/search?q=test", 
         "https://www.YouTube.com/watch?v=_OBlgSz8sSM"]' \
 | jsqry '{ _.match(/:\/\/([^\/]+)\//)[1].toLowerCase() }'
[
  "example.com",
  "www.google.com",
  "www.youtube.com"
]


help-



$ jsqry
jsqry ver. 0.1.2
Usage: echo $JSON | jsqry 'query'
 -1,--first     return first result element
 -h,--help      print help and exit
 -v,--version   print version and exit
 -c,--compact   compact output (no pretty-print)
 -u,--unquote   unquote output string(s)
 -as ARG,
 --arg-str ARG  supply string query argument
 -a ARG,
 --arg ARG      supply query argument of any other type


jq



jq jsqry .





( ): 0.1.2.



, Linux x64 . , . .



, :



$ sudo bash -e -c "
wget https://github.com/jsqry/jsqry-cli2/releases/download/v0.1.2/jsqry-linux-amd64 -O/usr/local/bin/jsqry
chmod +x /usr/local/bin/jsqry
echo \"jsqry \$(jsqry -v) installed successfully\" 
"


CLI-



GitHub - . - , . , CLI- , . , , , — .



"bash unit testing" BATS, ShellSpec, Bach , , ( 14 ), tush, .



tush



$ command --that --should --execute correctly
| expected stdout output

$ command --that --will --cause error
@ expected stderr output
? expected-exit-code


tush $, |, @ ? — , . , $ , diff. , diff . :



$ /bin/bash /home/xonix/proj/jsqry-cli2/tests.sh
--- tests.tush expected
+++ tests.tush actual
@@ -1,5 +1,5 @@
 $ jsqry -v
-| 0.1.2
+| 0.1.1

 $ jsqry -h
 | jsqry ver. 0.1.1
!!! TESTS FAILED !!!




tests.tush.



, , .



GitHub Action, , :



ビルドとテスト





JSON



JSON . zvakanaka/color-json , StackOverflow . jq. , null .



スクリーンショット



, .



npm- QuickJS



npm- jsqry . package.json . npm i. prepare-for-qjs.py, nodejs ES, QuickJS. jsqry-cli.js.



UTF-8 QuickJS



QuickJS stdin. , , QuickJS, . , UTF-8 JS-. , , QuickJS: twardoch/svgop.





build.sh.



"" , .



tests.sh. , , .



build.sh QuickJS, tests.sh tush. — .



. ls -lh jsqry . , , CLI- . , — , QuickJS.



652 KB. , , JS.





jq. .




All Articles