Skip to content
Open
Changes from 1 commit
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
523859b
Replace specs for expressions with shared library
bkeepers Mar 30, 2023
10fa1b4
Move expressions schemas into this repo
bkeepers Mar 30, 2023
a72ae35
Make Ruby 2.6 happy
bkeepers Mar 30, 2023
87c3de4
Use vitest to run tests
bkeepers Mar 31, 2023
0d065b5
Shuffle around somethings in schema.json and rename defs
bkeepers Mar 31, 2023
ee46fab
Add Min/Max functions
bkeepers Mar 31, 2023
6a2e622
Rename url-unfriendly defs
bkeepers Mar 31, 2023
08b03c1
Move expression examples out of test dir
bkeepers Mar 31, 2023
5004b6f
Initial docs for implementing functions
bkeepers Mar 31, 2023
4c35f3e
Run JS lint/tests
bkeepers Mar 31, 2023
c51eda3
Add not about running tests to expression docs
bkeepers Mar 31, 2023
50dc917
Fix README formatting
bkeepers Mar 31, 2023
6262795
Remove use of path
bkeepers Apr 1, 2023
4a10eaf
Simplfy schemas by making implementation cast function arguments to a…
bkeepers Apr 1, 2023
48308dd
Add json_schemer as a dependency
bkeepers Apr 1, 2023
81a1d65
Fix JS lint
bkeepers Apr 1, 2023
b8279c5
Validate schemas in strict mode
bkeepers Apr 2, 2023
270f290
$defs => definitions for draft 7
bkeepers Apr 3, 2023
8f69da4
Build sourcemaps
bkeepers Apr 10, 2023
a498b3a
Add explorer to inspect information about the schema
bkeepers Apr 4, 2023
a2c501a
Add simple js expression model
bkeepers Apr 4, 2023
a3b2076
Add validate method to Expression/Constant
bkeepers Apr 5, 2023
ad07179
Add simple schema class to browse and validate schemas
bkeepers Apr 8, 2023
d96ec78
Add proxying back to schema to resolve refs
bkeepers Apr 9, 2023
d134ae6
Add/Subtract/Multiply/Divide functions
bkeepers Apr 10, 2023
b4e7035
Fix bug where ajv eagerly resolves ref in array items
bkeepers Apr 10, 2023
7c5016b
use exported Schema class where possible
bkeepers Apr 10, 2023
26a08f3
Pair schema with expression and constant
bkeepers Apr 12, 2023
82cf6ac
Add operator keyword to schemas
bkeepers Apr 12, 2023
3f6d241
Allow null as a constant
bkeepers Jul 17, 2023
cfecaf5
Specify json_schemer version number
bkeepers Jul 17, 2023
e3b32c4
JS: Define expression.add(…) to build new expression
bkeepers Jul 19, 2023
0848411
Add parent to expressions, refactor
bkeepers Jul 25, 2023
639d2a7
Use external package for schemas
bkeepers Oct 12, 2023
8aa356c
Merge branch 'main' into expressions-schema
bkeepers Oct 12, 2023
6512d63
Add flipper-expressions-schema as separate gem for now
bkeepers Oct 12, 2023
21a0806
Merge remote-tracking branch 'origin/main' into expressions-schema
bkeepers Oct 12, 2023
9725f56
Ensure schemas are downloaded
bkeepers Oct 12, 2023
8e1bfb1
Ensure node is setup before bundling
bkeepers Oct 12, 2023
7fc02ff
Revert renaming of ci job
bkeepers Oct 12, 2023
15099b9
English properly
bkeepers Oct 12, 2023
6640afc
Don't auth to install npm/gems from github
bkeepers Oct 12, 2023
ed90c55
Try using the gem post_install hook to avoid issue with GitHub Actions
bkeepers Oct 13, 2023
6350f0e
Remove actions/cache, just rely on ruby/node actions for caching
bkeepers Oct 13, 2023
b36dd09
Run npm install before setting up ruby
bkeepers Oct 13, 2023
5470e59
Rename expressions repo
bkeepers Oct 13, 2023
afb896a
Merge remote-tracking branch 'origin/main' into expressions-schema
bkeepers Nov 10, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Initial docs for implementing functions
  • Loading branch information
bkeepers committed Mar 31, 2023
commit 5004b6f41cb7264b7e82ca52ceb98f5559f9f616
275 changes: 12 additions & 263 deletions packages/expressions/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,266 +2,15 @@

> A schema for Flipper Expressions

```
PASS test/schemas.test.js
expressions.schema.json
expressions
valid
✓ "string" (2 ms)
✓ true
✓ false (1 ms)
✓ 1
✓ 1.1
invalid
✓ null
✓ {}
✓ []
Time
valid
✓ {"Number":{"Time":["2021-01-01T00:00:00Z"]}} (1 ms)
✓ {"Number":{"Time":"2021-01-01T00:00:00-05:00"}} (1 ms)
✓ {"Number":{"Time":{"Property":"created_at"}}}
invalid
✓ {"Time":"2021-01-01"} (1 ms)
✓ {"Time":"January 1, 2021 10:00"}
✓ {"Time":null}
✓ {"Time":false} (1 ms)
✓ {"Time":[{"Property":"created_at"},{"Property":"updated_at"}]}
String
valid
✓ {"String":true}
✓ {"String":false}
✓ {"String":"already a string"}
✓ {"String":1} (1 ms)
✓ {"String":1.1}
✓ {"String":[true]}
✓ {"String":[false]}
✓ {"String":["already a string"]}
✓ {"String":[1]}
✓ {"String":[1.1]}
✓ {"String":{"All":[]}}
✓ {"String":[{"Any":[]}]}
invalid
✓ {"String":null}
✓ {"String":[true,false]}
✓ {"String":true,"Any":[]}
Random
valid
✓ {"Random":[]}
✓ {"Random":2}
✓ {"Random":[100]}
✓ {"Random":[{"Property":"max_rand"}]} (1 ms)
invalid
✓ {"Random":null}
✓ {"Random":[1,2]}
Property
valid
✓ {"Property":"name"}
✓ {"Property":["flipper_id"]}
✓ {"Property":["flipper_id"]}
✓ {"Property":["flipper_id"]}
invalid
✓ {"Property":[]}
✓ {"Property":null}
PercentageOfActors
valid
✓ {"PercentageOfActors":["User;1",42]} (1 ms)
✓ {"PercentageOfActors":["User;1",0]}
✓ {"PercentageOfActors":["string",99.99]}
✓ {"PercentageOfActors":["string",100]}
✓ {"PercentageOfActors":[{"Property":["flipper_id"]},{"Property":["probability"]}]}
✓ {"PercentageOfActors":["User;1",70]}
✓ {"PercentageOfActors":["User;1",70]}
✓ {"PercentageOfActors":["string",-1]}
✓ {"PercentageOfActors":["string",101]}
invalid
✓ {"PercentageOfActors":["string"]}
✓ {"PercentageOfActors":[100]}
✓ {"PercentageOfActors":[{"Property":["flipper_id"]}]} (1 ms)
Percentage
valid
✓ {"Percentage":[0]}
✓ {"Percentage":[99.999]}
✓ {"Percentage":[100]}
✓ {"Percentage":[{"Property":["nines"]}]}
✓ {"Percentage":[-1]}
✓ {"Percentage":[101]} (1 ms)
invalid
✓ {"Percentage":[1,2]}
✓ {"Percentage":[null]}
✓ {"Percentage":null}
Number
valid
✓ {"Number":0}
✓ {"Number":1}
✓ {"Number":1} (1 ms)
✓ {"Number":"0"}
✓ {"Number":"1"}
✓ {"Number":"1.0"}
✓ {"Number":[0]}
✓ {"Number":[1]}
✓ {"Number":[1]}
✓ {"Number":{"Property":"age"}}
invalid
✓ {"Number":null}
✓ {"Number":[true,false]}
✓ {"Number":true,"Any":[]}
Now
valid
✓ {"Now":[]}
✓ {"String":{"Now":[]}}
invalid
✓ {"Now":null}
✓ {"Now":[1]} (2 ms)
✓ {"Now":1}
NotEqual
valid
✓ {"NotEqual":[1,1]} (1 ms)
✓ {"NotEqual":["a","a"]}
✓ {"NotEqual":[1,2]}
✓ {"NotEqual":["a","b"]}
✓ {"NotEqual":[true,false]}
✓ {"NotEqual":[true,true]} (1 ms)
✓ {"NotEqual":[{"Property":"age"},21]}
invalid
✓ {"NotEqual":[1,2,3]}
✓ {"NotEqual":[1]}
✓ {"NotEqual":1}
✓ {"NotEqual":null}
✓ {"NotEqual":[1,2],"Any":[]}
LessThanOrEqualTo
valid
✓ {"LessThanOrEqualTo":[1,1]}
✓ {"LessThanOrEqualTo":[2,1]}
✓ {"LessThanOrEqualTo":["a","b"]} (1 ms)
✓ {"LessThanOrEqualTo":["b","b"]}
✓ {"LessThanOrEqualTo":[1,2]}
✓ {"LessThanOrEqualTo":["b","a"]}
✓ {"LessThanOrEqualTo":[{"Property":"age"},21]}
✓ {"LessThanOrEqualTo":[{"Property":"age"},18]}
invalid
✓ {"LessThanOrEqualTo":[1,2,3]}
✓ {"LessThanOrEqualTo":[1]}
✓ {"LessThanOrEqualTo":1}
✓ {"LessThanOrEqualTo":null}
✓ {"LessThanOrEqualTo":[1,2],"Any":[]}
LessThan
valid
✓ {"LessThan":[1,1]}
✓ {"LessThan":["a","a"]}
✓ {"LessThan":[2,1]}
✓ {"LessThan":[1,2]}
✓ {"LessThan":["b","a"]}
✓ {"LessThan":["a","b"]}
✓ {"LessThan":[{"Property":"age"},18]}
✓ {"LessThan":[{"Property":"age"},18]}
invalid
✓ {"LessThan":[1,2,3]}
✓ {"LessThan":[1]}
✓ {"LessThan":1}
✓ {"LessThan":null} (1 ms)
✓ {"LessThan":[1,2],"Any":[]}
GreaterThanOrEqualTo
valid
✓ {"GreaterThanOrEqualTo":[1,1]}
✓ {"GreaterThanOrEqualTo":[2,1]}
✓ {"GreaterThanOrEqualTo":["a","b"]}
✓ {"GreaterThanOrEqualTo":["b","b"]}
✓ {"GreaterThanOrEqualTo":[1,2]}
✓ {"GreaterThanOrEqualTo":["b","a"]}
✓ {"GreaterThanOrEqualTo":["a","b"]}
✓ {"GreaterThanOrEqualTo":[true,false]}
✓ {"GreaterThanOrEqualTo":[{"Property":"age"},18]}
invalid
✓ {"GreaterThanOrEqualTo":[1,2,3]}
✓ {"GreaterThanOrEqualTo":[1]}
✓ {"GreaterThanOrEqualTo":1}
✓ {"GreaterThanOrEqualTo":null}
✓ {"GreaterThanOrEqualTo":[1,2],"Any":[]}
GreaterThan
valid
✓ {"GreaterThan":[1,1]}
✓ {"GreaterThan":["a","a"]}
✓ {"GreaterThan":[2,1]}
✓ {"GreaterThan":["b","a"]}
✓ {"GreaterThan":["a","b"]}
✓ {"GreaterThan":[{"Property":"age"},18]}
invalid
✓ {"GreaterThan":[1,2,3]}
✓ {"GreaterThan":[1]}
✓ {"GreaterThan":1}
✓ {"GreaterThan":null}
✓ {"GreaterThan":[1,2],"Any":[]}
Equal
valid
✓ {"Equal":[1,1]}
✓ {"Equal":["a","a"]}
✓ {"Equal":[1,2]}
✓ {"Equal":["a","b"]}
✓ {"Equal":[true,false]}
✓ {"Equal":[{"Property":"age"},21]}
invalid
✓ {"Equal":[1,2,3]} (1 ms)
✓ {"Equal":[1]}
✓ {"Equal":1}
✓ {"Equal":null}
✓ {"Equal":[1,2],"Any":[]}
Durations
valid
✓ {"Duration":[2,"seconds"]} (1 ms)
✓ {"Duration":[2,"minutes"]}
✓ {"Duration":[2,"hours"]}
✓ {"Duration":[2,"days"]}
✓ {"Duration":[2,"weeks"]}
✓ {"Duration":[2,"months"]} (1 ms)
✓ {"Duration":[2,"years"]}
invalid
✓ {"Duration":2}
✓ {"Duration":[2]}
✓ {"Duration":[4,"score"]}
Boolean
valid
✓ {"Boolean":true}
✓ {"Boolean":"true"}
✓ {"Boolean":1}
✓ {"Boolean":[true]}
✓ {"Boolean":["true"]}
✓ {"Boolean":[1]}
✓ {"Boolean":{"All":[]}}
✓ {"Boolean":false}
✓ {"Boolean":"false"}
✓ {"Boolean":0}
✓ {"Boolean":[false]}
✓ {"Boolean":["false"]}
✓ {"Boolean":[0]}
✓ {"Boolean":[{"Any":[]}]}
invalid
✓ {"Boolean":null}
✓ {"Boolean":[true,false]}
✓ {"Boolean":true,"Any":[]}
Any
valid
✓ {"Any":[]} (1 ms)
✓ {"Any":[true]}
✓ {"Any":[true,false]}
✓ {"Any":[false,false]}
✓ {"Any":[1,true,"string"]}
✓ {"Any":true} (1 ms)
✓ {"Any":false}
✓ {"Any":[{"Boolean":false},{"Property":"admin"}]}
invalid
✓ {"Any":null}
✓ {"Any":[],"All":[]}
All
valid
✓ {"All":[]}
✓ {"All":[true]}
✓ {"All":[true,false]}
✓ {"All":[1,true,"string"]}
✓ {"All":true}
✓ {"All":false}
✓ {"All":[{"Boolean":true},{"Property":"admin"}]}
invalid
✓ {"All":null}
✓ {"All":[],"Any":[]}
❯```
The structure for flipper Expressions is defined in `[`schemas/schema.json`](./schemas/schema.json) using [JSON Schema](https://json-schema.org) ([draft-07](https://json-schema.org/specification-links.html#draft-7)).

To learn more about JSON Schema, read [Understanding JSON Schema](https://json-schema.org/understanding-json-schema/) or the [Ajv JSON schema validator docs](https://ajv.js.org/json-schema.html).

## Adding a new expression

1. Describe arguments by creating a new file in [`schemas/`](schemas/) named `NewName.schema.json`. You can copy an existing function that has similar semantics to get started.
2. Add the new function in [`schemas/schema.json`](schemas/schema.json) to `$defs/function`.
3. Create a new file in [`examples/`](./examples) named `NewName.json` with valid and invalid examples for the new function. See other examples for inspiration.
4. Implement the function in [`lib/flipper/expressions/`](../../lib/flipper/expressions/).

See [this commit that adds Min/Max functions](https://github.com/jnunemaker/flipper/commit/ee46fab0cda21a32c3a921a8ed1fb94b0842b6b4) for a concrete example.