From c6e0ba997a76624583b8f7c063fb731c4aed8f83 Mon Sep 17 00:00:00 2001 From: Michiel Borkent Date: Sat, 17 Oct 2020 11:31:17 +0200 Subject: [PATCH] Move examples page [skip ci] --- doc/examples.md | 320 +-------------------------------------------- examples/README.md | 318 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 320 insertions(+), 318 deletions(-) create mode 100644 examples/README.md diff --git a/doc/examples.md b/doc/examples.md index 7e1fad8e..911cd226 100644 --- a/doc/examples.md +++ b/doc/examples.md @@ -1,319 +1,3 @@ -## Examples +# Examples -Here's a gallery of useful examples. Do you have a useful example? PR welcome! - -### Delete a list of files returned by a Unix command - -``` -find . | grep conflict | bb -i '(doseq [f *input*] (.delete (io/file f)))' -``` - -### Calculate aggregate size of directory - -``` clojure -#!/usr/bin/env bb - -(as-> (io/file (or (first *command-line-args*) ".")) $ - (file-seq $) - (map #(.length %) $) - (reduce + $) - (/ $ (* 1024 1024)) - (println (str (int $) "M"))) -``` - -``` shellsession -$ dir-size -130M - -$ dir-size ~/Dropbox/bin -233M -``` - - -### Shuffle the lines of a file - -``` shellsession -$ cat /tmp/test.txt -1 Hello -2 Clojure -3 Babashka -4 Goodbye - -$ < /tmp/test.txt bb -io '(shuffle *input*)' -3 Babashka -2 Clojure -4 Goodbye -1 Hello -``` - -### Fetch latest Github release tag - -``` shell -(require '[clojure.java.shell :refer [sh]] - '[cheshire.core :as json]) - -(defn babashka-latest-version [] - (-> (sh "curl" "https://api.github.com/repos/borkdude/babashka/tags") - :out - (json/parse-string true) - first - :name)) - -(babashka-latest-version) ;;=> "v0.0.73" -``` - -### Generate deps.edn entry for a gitlib - -``` clojure -#!/usr/bin/env bb - -(require '[clojure.java.shell :refer [sh]] - '[clojure.string :as str]) - -(let [[username project branch] *command-line-args* - branch (or branch "master") - url (str "https://github.com/" username "/" project) - sha (-> (sh "git" "ls-remote" url branch) - :out - (str/split #"\s") - first)] - {:git/url url - :sha sha}) -``` - -``` shell -$ gitlib.clj nate fs -{:git/url "https://github.com/nate/fs", :sha "75b9fcd399ac37cb4f9752a4c7a6755f3fbbc000"} -$ clj -Sdeps "{:deps {fs $(gitlib.clj nate fs)}}" \ - -e "(require '[nate.fs :as fs]) (fs/creation-time \".\")" -#object[java.nio.file.attribute.FileTime 0x5c748168 "2019-07-05T14:06:26Z"] -``` - -### View download statistics from Clojars - -Contributed by [@plexus](https://github.com/plexus). - -``` shellsession -$ curl https://clojars.org/stats/all.edn | -bb -o '(for [[[group art] counts] *input*] (str (reduce + (vals counts)) " " group "/" art))' | -sort -rn | -less -14113842 clojure-complete/clojure-complete -9065525 clj-time/clj-time -8504122 cheshire/cheshire -... -``` - -### Portable tree command - -See [examples/tree.clj](https://github.com/borkdude/babashka/blob/master/examples/tree.clj). - -``` shellsession -$ clojure -Sdeps '{:deps {org.clojure/tools.cli {:mvn/version "0.4.2"}}}' examples/tree.clj src -src -└── babashka - ├── impl - │ ├── tools - │ │ └── cli.clj -... - -$ examples/tree.clj src -src -└── babashka - ├── impl - │ ├── tools - │ │ └── cli.clj -... -``` - -### List outdated maven dependencies - -See [examples/outdated.clj](https://github.com/borkdude/babashka/blob/master/examples/outdated.clj). -Inspired by an idea from [@seancorfield](https://github.com/seancorfield). - -``` shellsession -$ cat /tmp/deps.edn -{:deps {cheshire {:mvn/version "5.8.1"} - clj-http {:mvn/version "3.4.0"}}} - -$ examples/outdated.clj /tmp/deps.edn -clj-http/clj-http can be upgraded from 3.4.0 to 3.10.0 -cheshire/cheshire can be upgraded from 5.8.1 to 5.9.0 -``` - -### Convert project.clj to deps.edn - -Contributed by [@plexus](https://github.com/plexus). - -``` shellsession -$ cat project.clj | -sed -e 's/#=//g' -e 's/~@//g' -e 's/~//g' | -bb '(let [{:keys [dependencies source-paths resource-paths]} (apply hash-map (drop 3 *input*))] - {:paths (into source-paths resource-paths) - :deps (into {} (for [[d v] dependencies] [d {:mvn/version v}]))}) ' | -jet --pretty > deps.edn -``` - -A script with the same goal can be found [here](https://gist.github.com/swlkr/3f346c66410e5c60c59530c4413a248e#gistcomment-3232605). - -### Print current time in California - -See [examples/pst.clj](https://github.com/borkdude/babashka/blob/master/examples/pst.clj) - -### Tiny http server - -See [examples/http_server.clj](https://github.com/borkdude/babashka/blob/master/examples/http_server.clj) - -Original by [@souenzzo](https://gist.github.com/souenzzo/a959a4c5b8c0c90df76fe33bb7dfe201) - -### Print random docstring - -See [examples/random_doc.clj](https://github.com/borkdude/babashka/blob/master/examples/random_doc.clj) - -``` shell -$ examples/random_doc.clj -------------------------- -clojure.core/ffirst -([x]) - Same as (first (first x)) -``` - -### Cryptographic hash - -`sha1.clj`: -``` clojure -#!/usr/bin/env bb - -(defn sha1 - [s] - (let [hashed (.digest (java.security.MessageDigest/getInstance "SHA-1") - (.getBytes s)) - sw (java.io.StringWriter.)] - (binding [*out* sw] - (doseq [byte hashed] - (print (format "%02X" byte)))) - (str sw))) - -(sha1 (first *command-line-args*)) -``` - -``` shell -$ sha1.clj babashka -"0AB318BE3A646EEB1E592781CBFE4AE59701EDDF" -``` - -### Package script as Docker image - -`Dockerfile`: -``` dockerfile -FROM borkdude/babashka -RUN echo $'\ -(println "Your command line args:" *command-line-args*)\ -'\ ->> script.clj - -ENTRYPOINT ["bb", "script.clj"] -``` - -``` shell -$ docker build . -t script -... -$ docker run --rm script 1 2 3 -Your command line args: (1 2 3) -``` - -### Extract single file from zip - -``` clojure -;; Given the following: - -;; $ echo 'contents' > file -;; $ zip zipfile.zip file -;; $ rm file - -;; we extract the single file from the zip archive using java.nio: - -(import '[java.nio.file Files FileSystems CopyOption]) -(let [zip-file (io/file "zipfile.zip") - file (io/file "file") - fs (FileSystems/newFileSystem (.toPath zip-file) nil) - file-in-zip (.getPath fs "file" (into-array String []))] - (Files/copy file-in-zip (.toPath file) - (into-array CopyOption []))) -``` - -### Note taking app - -See -[examples/notes.clj](https://github.com/borkdude/babashka/blob/master/examples/notes.clj). This -is a variation on the -[http-server](https://github.com/borkdude/babashka/#tiny-http-server) -example. If you get prompted with a login, use `admin`/`admin`. - - - -### which - -The `which` command re-implemented in Clojure. See -[examples/which.clj](https://github.com/borkdude/babashka/blob/master/examples/which.clj). -Prints the canonical file name. - -``` shell -$ examples/which.clj rg -/usr/local/Cellar/ripgrep/11.0.1/bin/rg -``` - -### pom.xml version - -A script to retrieve the version from a `pom.xml` file. See -[examples/get_pom_version.clj](../examples/get_pom_version.clj). Written by [@wilkerlucio](https://github.com/wilkerlucio). - -### Whatsapp frequencies - -Show frequencies of messages by user in Whatsapp group chats. -See [examples/whatsapp_frequencies.clj](../examples/whatsapp_frequencies.clj) - -### Find unused vars - -[This](../examples/hsqldb_unused_vars.clj) script invokes clj-kondo, stores -returned data in an in memory HSQLDB database and prints the result of a query -which finds unused vars. It uses -[pod-babashka-hsqldb](https://github.com/borkdude/pod-babashka-hsqldb). - -``` shell -$ bb examples/hsqldb_unused_vars.clj src - -| :VARS/NS | :VARS/NAME | :VARS/FILENAME | :VARS/ROW | :VARS/COL | -|----------------------------+--------------------------+------------------------------------+-----------+-----------| -| babashka.impl.bencode.core | read-netstring | src/babashka/impl/bencode/core.clj | 162 | 1 | -| babashka.impl.bencode.core | write-netstring | src/babashka/impl/bencode/core.clj | 201 | 1 | -| babashka.impl.classes | generate-reflection-file | src/babashka/impl/classes.clj | 230 | 1 | -| babashka.impl.classpath | ->DirectoryResolver | src/babashka/impl/classpath.clj | 12 | 1 | -| babashka.impl.classpath | ->JarFileResolver | src/babashka/impl/classpath.clj | 37 | 1 | -| babashka.impl.classpath | ->Loader | src/babashka/impl/classpath.clj | 47 | 1 | -| babashka.impl.clojure.test | file-position | src/babashka/impl/clojure/test.clj | 286 | 1 | -| babashka.impl.nrepl-server | stop-server! | src/babashka/impl/nrepl_server.clj | 179 | 1 | -| babashka.main | -main | src/babashka/main.clj | 485 | 1 | -``` - -### List contents of jar file - -For the code see [examples/ls_jar.clj](../examples/ls_jar.clj). - -``` shell -$ ls_jar.clj borkdude/sci 0.0.13-alpha.24 -META-INF/MANIFEST.MF -META-INF/maven/borkdude/sci/pom.xml -META-INF/leiningen/borkdude/sci/project.clj -... -``` - -### Invoke vim inside a script - -See [examples/vim.clj](../examples/vim.clj). - -### YAML inspector - -This script uses [djblue/portal](https://github.com/djblue/portal/) for viewing a YAML file piped to stdin. - -See [examples/yaml_inspector.clj](../examples/yaml_inspector.clj). +This pages was moved [here](../examples/README.md). diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..6f58efc5 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,318 @@ +# Examples + +Here's a gallery of useful examples. Do you have a useful example? PR welcome! + +## Delete a list of files returned by a Unix command + +``` +find . | grep conflict | bb -i '(doseq [f *input*] (.delete (io/file f)))' +``` + +## Calculate aggregate size of directory + +``` clojure +#!/usr/bin/env bb + +(as-> (io/file (or (first *command-line-args*) ".")) $ + (file-seq $) + (map #(.length %) $) + (reduce + $) + (/ $ (* 1024 1024)) + (println (str (int $) "M"))) +``` + +``` shellsession +$ dir-size +130M + +$ dir-size ~/Dropbox/bin +233M +``` + +## Shuffle the lines of a file + +``` shellsession +$ cat /tmp/test.txt +1 Hello +2 Clojure +3 Babashka +4 Goodbye + +$ < /tmp/test.txt bb -io '(shuffle *input*)' +3 Babashka +2 Clojure +4 Goodbye +1 Hello +``` + +## Fetch latest Github release tag + +``` shell +(require '[clojure.java.shell :refer [sh]] + '[cheshire.core :as json]) + +(defn babashka-latest-version [] + (-> (sh "curl" "https://api.github.com/repos/borkdude/babashka/tags") + :out + (json/parse-string true) + first + :name)) + +(babashka-latest-version) ;;=> "v0.0.73" +``` + +## Generate deps.edn entry for a gitlib + +``` clojure +#!/usr/bin/env bb + +(require '[clojure.java.shell :refer [sh]] + '[clojure.string :as str]) + +(let [[username project branch] *command-line-args* + branch (or branch "master") + url (str "https://github.com/" username "/" project) + sha (-> (sh "git" "ls-remote" url branch) + :out + (str/split #"\s") + first)] + {:git/url url + :sha sha}) +``` + +``` shell +$ gitlib.clj nate fs +{:git/url "https://github.com/nate/fs", :sha "75b9fcd399ac37cb4f9752a4c7a6755f3fbbc000"} +$ clj -Sdeps "{:deps {fs $(gitlib.clj nate fs)}}" \ + -e "(require '[nate.fs :as fs]) (fs/creation-time \".\")" +#object[java.nio.file.attribute.FileTime 0x5c748168 "2019-07-05T14:06:26Z"] +``` + +## View download statistics from Clojars + +Contributed by [@plexus](https://github.com/plexus). + +``` shellsession +$ curl https://clojars.org/stats/all.edn | +bb -o '(for [[[group art] counts] *input*] (str (reduce + (vals counts)) " " group "/" art))' | +sort -rn | +less +14113842 clojure-complete/clojure-complete +9065525 clj-time/clj-time +8504122 cheshire/cheshire +... +``` + +## Portable tree command + +See [examples/tree.clj](https://github.com/borkdude/babashka/blob/master/examples/tree.clj). + +``` shellsession +$ clojure -Sdeps '{:deps {org.clojure/tools.cli {:mvn/version "0.4.2"}}}' examples/tree.clj src +src +└── babashka + ├── impl + │ ├── tools + │ │ └── cli.clj +... + +$ examples/tree.clj src +src +└── babashka + ├── impl + │ ├── tools + │ │ └── cli.clj +... +``` + +## List outdated maven dependencies + +See [examples/outdated.clj](https://github.com/borkdude/babashka/blob/master/examples/outdated.clj). +Inspired by an idea from [@seancorfield](https://github.com/seancorfield). + +``` shellsession +$ cat /tmp/deps.edn +{:deps {cheshire {:mvn/version "5.8.1"} + clj-http {:mvn/version "3.4.0"}}} + +$ examples/outdated.clj /tmp/deps.edn +clj-http/clj-http can be upgraded from 3.4.0 to 3.10.0 +cheshire/cheshire can be upgraded from 5.8.1 to 5.9.0 +``` + +## Convert project.clj to deps.edn + +Contributed by [@plexus](https://github.com/plexus). + +``` shellsession +$ cat project.clj | +sed -e 's/#=//g' -e 's/~@//g' -e 's/~//g' | +bb '(let [{:keys [dependencies source-paths resource-paths]} (apply hash-map (drop 3 *input*))] + {:paths (into source-paths resource-paths) + :deps (into {} (for [[d v] dependencies] [d {:mvn/version v}]))}) ' | +jet --pretty > deps.edn +``` + +A script with the same goal can be found [here](https://gist.github.com/swlkr/3f346c66410e5c60c59530c4413a248e#gistcomment-3232605). + +## Print current time in California + +See [examples/pst.clj](https://github.com/borkdude/babashka/blob/master/examples/pst.clj) + +## Tiny http server + +See [examples/http_server.clj](https://github.com/borkdude/babashka/blob/master/examples/http_server.clj) + +Original by [@souenzzo](https://gist.github.com/souenzzo/a959a4c5b8c0c90df76fe33bb7dfe201) + +## Print random docstring + +See [examples/random_doc.clj](https://github.com/borkdude/babashka/blob/master/examples/random_doc.clj) + +``` shell +$ examples/random_doc.clj +------------------------- +clojure.core/ffirst +([x]) + Same as (first (first x)) +``` + +## Cryptographic hash + +`sha1.clj`: +``` clojure +#!/usr/bin/env bb + +(defn sha1 + [s] + (let [hashed (.digest (java.security.MessageDigest/getInstance "SHA-1") + (.getBytes s)) + sw (java.io.StringWriter.)] + (binding [*out* sw] + (doseq [byte hashed] + (print (format "%02X" byte)))) + (str sw))) + +(sha1 (first *command-line-args*)) +``` + +``` shell +$ sha1.clj babashka +"0AB318BE3A646EEB1E592781CBFE4AE59701EDDF" +``` + +## Package script as Docker image + +`Dockerfile`: +``` dockerfile +FROM borkdude/babashka +RUN echo $'\ +(println "Your command line args:" *command-line-args*)\ +'\ +>> script.clj + +ENTRYPOINT ["bb", "script.clj"] +``` + +``` shell +$ docker build . -t script +... +$ docker run --rm script 1 2 3 +Your command line args: (1 2 3) +``` + +## Extract single file from zip + +``` clojure +;; Given the following: + +;; $ echo 'contents' > file +;; $ zip zipfile.zip file +;; $ rm file + +;; we extract the single file from the zip archive using java.nio: + +(import '[java.nio.file Files FileSystems CopyOption]) +(let [zip-file (io/file "zipfile.zip") + file (io/file "file") + fs (FileSystems/newFileSystem (.toPath zip-file) nil) + file-in-zip (.getPath fs "file" (into-array String []))] + (Files/copy file-in-zip (.toPath file) + (into-array CopyOption []))) +``` + +## Note taking app + +See +[examples/notes.clj](https://github.com/borkdude/babashka/blob/master/examples/notes.clj). This +is a variation on the +[http-server](https://github.com/borkdude/babashka/#tiny-http-server) +example. If you get prompted with a login, use `admin`/`admin`. + + + +## which + +The `which` command re-implemented in Clojure. See +[examples/which.clj](https://github.com/borkdude/babashka/blob/master/examples/which.clj). +Prints the canonical file name. + +``` shell +$ examples/which.clj rg +/usr/local/Cellar/ripgrep/11.0.1/bin/rg +``` + +## pom.xml version + +A script to retrieve the version from a `pom.xml` file. See +[examples/get_pom_version.clj](get_pom_version.clj). Written by [@wilkerlucio](https://github.com/wilkerlucio). + +## Whatsapp frequencies + +Show frequencies of messages by user in Whatsapp group chats. +See [examples/whatsapp_frequencies.clj](whatsapp_frequencies.clj) + +## Find unused vars + +[This](hsqldb_unused_vars.clj) script invokes clj-kondo, stores +returned data in an in memory HSQLDB database and prints the result of a query +which finds unused vars. It uses +[pod-babashka-hsqldb](https://github.com/borkdude/pod-babashka-hsqldb). + +``` shell +$ bb examples/hsqldb_unused_vars.clj src + +| :VARS/NS | :VARS/NAME | :VARS/FILENAME | :VARS/ROW | :VARS/COL | +|----------------------------+--------------------------+------------------------------------+-----------+-----------| +| babashka.impl.bencode.core | read-netstring | src/babashka/impl/bencode/core.clj | 162 | 1 | +| babashka.impl.bencode.core | write-netstring | src/babashka/impl/bencode/core.clj | 201 | 1 | +| babashka.impl.classes | generate-reflection-file | src/babashka/impl/classes.clj | 230 | 1 | +| babashka.impl.classpath | ->DirectoryResolver | src/babashka/impl/classpath.clj | 12 | 1 | +| babashka.impl.classpath | ->JarFileResolver | src/babashka/impl/classpath.clj | 37 | 1 | +| babashka.impl.classpath | ->Loader | src/babashka/impl/classpath.clj | 47 | 1 | +| babashka.impl.clojure.test | file-position | src/babashka/impl/clojure/test.clj | 286 | 1 | +| babashka.impl.nrepl-server | stop-server! | src/babashka/impl/nrepl_server.clj | 179 | 1 | +| babashka.main | -main | src/babashka/main.clj | 485 | 1 | +``` + +## List contents of jar file + +For the code see [examples/ls_jar.clj](ls_jar.clj). + +``` shell +$ ls_jar.clj borkdude/sci 0.0.13-alpha.24 +META-INF/MANIFEST.MF +META-INF/maven/borkdude/sci/pom.xml +META-INF/leiningen/borkdude/sci/project.clj +... +``` + +### Invoke vim inside a script + +See [examples/vim.clj](examples/vim.clj). + +### YAML inspector + +This script uses [djblue/portal](https://github.com/djblue/portal/) for viewing a YAML file piped to stdin. + +See [examples/yaml_inspector.clj](yaml_inspector.clj).