From bd02783f7535cb05e43fa825ca7eb482f92b4d8b Mon Sep 17 00:00:00 2001 From: Anton Medvedev Date: Tue, 10 May 2022 21:39:30 +0200 Subject: [PATCH] Split reducers docs --- README.md | 4 +- doc/doc.md | 167 +++++--------------------------------------------- doc/js.md | 120 ++++++++++++++++++++++++++++++++++++ doc/python.md | 27 ++++++++ doc/ruby.md | 23 +++++++ 5 files changed, 186 insertions(+), 155 deletions(-) create mode 100644 doc/js.md create mode 100644 doc/python.md create mode 100644 doc/ruby.md diff --git a/README.md b/README.md index b6d3f91..26ccff8 100644 --- a/README.md +++ b/README.md @@ -56,8 +56,8 @@ curl ... | fx . ### Reducers -Write reducers in your favorite language: [JavaScript](doc/doc.md#reducers) (default), -[Python](doc/doc.md#python), or [Ruby](doc/doc.md#ruby). +Write reducers in your favorite language: [JavaScript](doc/js.md) (default), +[Python](doc/python.md), or [Ruby](doc/ruby.md). ```bash fx data.json '.filter(x => x.startsWith("a"))' diff --git a/doc/doc.md b/doc/doc.md index 5c7b271..766e5bd 100644 --- a/doc/doc.md +++ b/doc/doc.md @@ -16,175 +16,36 @@ $ fx data.json ## Reducers -If any additional arguments was passed, **fx** converts it to a function which -takes the JSON as an argument named `x`. - -By default, **fx** uses builtin JavaScript VM ([goja](https://github.com/dop251/goja)), -but **fx** also can be used with [node](#node), [python](#python), or [ruby](#ruby). - -### JavaScript - -```sh -export FX_LANG=js -``` - -An example of anonymous function used as a reducer: -```sh -$ echo '{"foo": [{"bar": "value"}]}' | fx 'x => x.foo[0].bar' -value -``` - -The same reducer function can be simplified to: - -```sh -$ echo '{"foo": [{"bar": "value"}]}' | fx 'x.foo[0].bar' -value -``` - -Each argument treated as a reducer function. - -```sh -$ echo '{"foo": [{"bar": "value"}]}' | fx 'x.foo' 'x[0]' 'x.bar' -value -``` - -Update JSON using the spread operator: - -```sh -$ echo '{"name": "fx", "count": 0}' | fx '{...this, count: 1}' -{ - "name": "fx", - "count": 1 -} -``` - -Get the list - -### Dot - -Fx supports simple JS-like syntax for accessing data, which can be used with any -`FX_LANG`. - -```sh -$ echo '{"foo": [{"bar": "value"}]}' | fx .foo[0].bar -value -``` - -### .fxrc.js - -Create _.fxrc.js_ file in `$HOME` directory, and define some useful functions. - -```js -// .fxrc.js -function upper(s) { - return s.toUpperCase() -} -``` - -```sh -$ cat data.json | fx .name upper -ANTON -``` - -### Node - -```sh -export FX_LANG=node -``` - -Use any npm package by installing it globally. Create _.fxrc.js_ file in `$HOME` -directory, and require any packages or define global functions. For example, -access all lodash methods without `_` prefix. - -Put next line into your _.fxrc.js_ file: - -```js -Object.assign(global, require('lodash/fp')) -``` - -And now you will be able to call all lodash methods. For example, see who's been committing to react recently: - -```sh -curl 'https://api.github.com/repos/facebook/react/commits?per_page=100' \ -| fx 'groupBy("commit.author.name")' 'mapValues(size)' toPairs 'sortBy(1)' reverse 'take(10)' fromPairs -``` - -> To be able to require global modules make sure you have correct `NODE_PATH` env variable. -> ```sh -> export NODE_PATH=`npm root -g` -> ``` - -The _.fxrc.js_ file supports both: import and require. - -```js -// .fxrc.js -import 'zx/globals' -const _ = require('lodash') -``` - -> If you want to use _.fxrc.js_ for both `FX_LANG=js` and `FX_LANG=node`, -> separate parts by `// nodejs:` comment: -> ```js -> // .fxrc.js -> function upper(s) { -> return s.toUpperCase() -> } -> // nodejs: -> import 'zx/globals' -> const _ = require('lodash') -> ``` - -### Python - -```sh -export FX_LANG=python -``` -Or -```sh -export FX_LANG=python3 -``` - -Example: - -```sh -fx data.json '[x["age"] + i for i in range(10)]' -``` - -### Ruby - -```sh -export FX_LANG=ruby -``` - -Example: - -```sh -fx data.json 'x.to_a.map {|x| x[1]}' -``` +Use [JavaScript](js.md), [Python](python.md), or [Ruby](ruby.md). ## Streaming mode -The **fx** supports line-delimited JSON streaming and concatenated JSON streaming. +The **fx** supports line-delimited JSON streaming or concatenated JSON streaming. ```sh -$ kubectl logs ... | fx .message +$ echo ' +> {"message": "hello"} +> {"message": "world!"} +> ' | fx .message +hello +world! ``` ## Interactive mode -Type `?` to see full list of available shortcuts while in interactive mode. +Type `?` to see the full list of available shortcuts while in the interactive mode. ### Search -Press `/` and type regexp pattern to search in current JSON. -Search is performed on internal representation of the JSON without newlines. +Press `/` and type regexp pattern to search in the current JSON. +Search is performed on the internal representation of the JSON without newlines. -Type `n` to jump to next result, and `N` to previous.s +Type `n` to jump to the next result, and `N` to the previous ### Selecting text -You can't just select text in fx. This is due the fact that all mouse events are -redirected to stdin. To be able to select again you need instruct your terminal +You can't just select text in fx. This is due to the fact that all mouse events are +redirected to stdin. To be able to select again you need to instruct your terminal not to do it. This can be done by holding special keys while selecting: | Key | Terminal | diff --git a/doc/js.md b/doc/js.md new file mode 100644 index 0000000..939e25d --- /dev/null +++ b/doc/js.md @@ -0,0 +1,120 @@ +# JavaScript Reducers + +If any additional arguments were passed, fx converts them into a function which +takes the JSON as an argument named `x`. + +By default, fx uses builtin JavaScript VM ([goja](https://github.com/dop251/goja)), +but also can be used with node. + +```sh +export FX_LANG=js # Default +``` + +Or for usage with node: + +```sh +export FX_LANG=node +``` + +An example of anonymous function used as a reducer: +```sh +$ echo '{"foo": [{"bar": "value"}]}' | fx 'x => x.foo[0].bar' +value +``` + +The same reducer function can be simplified to: + +```sh +$ echo '{"foo": [{"bar": "value"}]}' | fx 'x.foo[0].bar' +value +``` + +Each argument treated as a reducer function. + +```sh +$ echo '{"foo": [{"bar": "value"}]}' | fx 'x.foo' 'x[0]' 'x.bar' +value +``` + +Update JSON using the spread operator: + +```sh +$ echo '{"name": "fx", "count": 0}' | fx '{...this, count: 1}' +{ + "name": "fx", + "count": 1 +} +``` + +## Dot + +Fx supports simple JS-like syntax for accessing data, which can be used with any `FX_LANG`. + +```sh +$ echo '{"foo": [{"bar": "value"}]}' | fx .foo[0].bar +value +``` + +## .fxrc.js + +Create _.fxrc.js_ file in `$HOME` directory, and define some useful functions. + +```js +// .fxrc.js +function upper(s) { + return s.toUpperCase() +} +``` + +```sh +$ cat data.json | fx .name upper +ANTON +``` + +## Node + +```sh +export FX_LANG=node +``` + +Use any npm package by installing it globally. Create _.fxrc.js_ file in `$HOME` +directory, and require any packages or define global functions. For example, +to access all lodash methods without `_` prefix, put next line into your +_.fxrc.js_ file: + +```js +Object.assign(global, require('lodash/fp')) +``` + +And now you will be able to call all lodash methods. For example, see who's been +committing to react recently: + +```sh +curl 'https://api.github.com/repos/facebook/react/commits?per_page=100' \ +| fx 'groupBy("commit.author.name")' 'mapValues(size)' toPairs 'sortBy(1)' reverse 'take(10)' fromPairs +``` + +> To be able to require global modules make sure you have correct `NODE_PATH` env variable. +> ```sh +> export NODE_PATH=`npm root -g` +> ``` + +The _.fxrc.js_ file supports both: `import` and `require`. + +```js +// .fxrc.js +import 'zx/globals' +const _ = require('lodash') +``` + +> If you want to use _.fxrc.js_ for both `FX_LANG=js` and `FX_LANG=node`, +> separate parts by `// nodejs:` comment: +> ```js +> // .fxrc.js +> function upper(s) { +> return s.toUpperCase() +> } +> // nodejs: +> import 'zx/globals' +> const _ = require('lodash') +> ``` diff --git a/doc/python.md b/doc/python.md new file mode 100644 index 0000000..d678a49 --- /dev/null +++ b/doc/python.md @@ -0,0 +1,27 @@ +# Python Reducers + +If any additional arguments was passed, **fx** converts it to a function which +takes the JSON as an argument named `x`. + +```sh +export FX_LANG=python +``` +Or +```sh +export FX_LANG=python3 +``` + +Example: + +```sh +fx data.json '[x["age"] + i for i in range(10)]' +``` + +## Dot + +Fx supports simple syntax for accessing data, which can be used with any `FX_LANG`. + +```sh +$ echo '{"foo": [{"bar": "value"}]}' | fx .foo[0].bar +value +``` diff --git a/doc/ruby.md b/doc/ruby.md new file mode 100644 index 0000000..74d6d43 --- /dev/null +++ b/doc/ruby.md @@ -0,0 +1,23 @@ +# Ruby Reducers + +If any additional arguments was passed, **fx** converts it to a function which +takes the JSON as an argument named `x`. + +```sh +export FX_LANG=ruby +``` + +Example: + +```sh +fx data.json 'x.to_a.map {|x| x[1]}' +``` + +## Dot + +Fx supports simple syntax for accessing data, which can be used with any `FX_LANG`. + +```sh +$ echo '{"foo": [{"bar": "value"}]}' | fx .foo[0].bar +value +```