jsqry أفضل من jq

في مقالتي الأخيرة عن Habré ، كتبت عن مكتبة Jsqry ، التي توفر لغة استعلام بسيطة ومريحة (DSL) لكائنات JSON. لقد مر وقت طويل منذ ذلك الحين وتطورت المكتبة أيضًا. سبب منفصل للفخر - المكتبة لديها تغطية كود 98٪ عن طريق الاختبارات. ومع ذلك ، فإن هذا المقال لا يتعلق بها بالكامل.



أعتقد أن الكثير منكم على دراية بالأداة jq، وهي عمليا المعيار الفعلي للعمل مع JSON في سطر الأوامر والنصوص. كنت أيضًا مستخدمًا نشطًا لها. ولكن طوال الوقت كنت قلقًا بشأن التعقيد غير المبرر والبنية غير البديهية لاستعلامات هذه الأداة. ولست أنا وحدي ، فإليك بعض الاقتباسات من أخبار القراصنة :



لقد كنت أستخدم jq لسنوات وما زلت لا أستطيع تشغيله تمامًا كما أتوقعه.



لدي نفس المشكلة مع jq. أحتاج إلى استخدام برنامج google fu الخاص بي لمعرفة كيفية القيام بأي شيء أكثر من مجرد اختيار بسيط.



لا أعرف ما هو المصطلح ، النموذج العقلي ، لكن لا يمكنني الحصول على jq للنقر. في الغالب لأنني أحتاجه فقط من حين لآخر. إنه محبط بالنسبة لي لأنه يبدو قوياً للغاية.



أعلم أنني قد أكون رأيًا مخالفًا هنا ، لكن لا يمكنني أبدًا الالتفاف حول رأسي jq. أستطيع أن إدارة jq .، jq .fooو jq -r، ولكن أبعد من ذلك، وDSL هو مجرد مبهمة بالنسبة لي.



دعنا نقولها فقط: jq هي أداة رائعة ، لكن DSL سيء للغاية.



نعم ، أجد jq مشابهًا لكتابة regexes: يجب دائمًا أن أبحث عن بناء الجملة ، فقط أجعله يعمل بعد بعض الالتباس حول سبب عدم تطابق الأنماط الخاصة بي ، ثم أنسى كل شيء في غضون أيام قليلة ، لذا يجب أن أتعلمه مرة أخرى لاحقًا.

باختصار ، ربما تكون قد خمنت ذلك بالفعل. خطرت لي فكرة ، لماذا لا أحول مكتبة JS الخاصة بي إلى سطر أوامر قابل للتنفيذ.هناك فارق بسيط واحد هنا. المكتبة مكتوبة بلغة JS ويعتمد DSL أيضًا على JS. هذا يعني أننا بحاجة إلى إيجاد طريقة لحزم البرنامج وبعض وقت تشغيل JS في ملف قابل للتنفيذ قائم بذاته.



jsqry - طبعة GraalVM



بالنسبة لأولئك الذين لم يتطرقوا إلى الموضوع بعد (هل لا يزال هناك مثل هذا بالفعل؟ OO) ، اسمحوا لي أن أذكركم بأن GraalVM عبارة عن JVM مضخّمة من Oracle بميزات إضافية ، أبرزها:



  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