depresso

Dependency resolution with json path expressions

npm install depresso
16 downloads in the last week
32 downloads in the last month

You have a deeply nested object with some missing values. You also have some rules how to calculate a value from other values. Depresso takes an object and the calculation rules, and does a dependency resolution. Let's see an example.

We have an object with a placeholder for missing values:


    MISSING = -1

    inventory =
      general:
        discount: 0.1
        price: MISSING
      products: [
        name: 'Bag'
        netPrice: 20
        tax: 0.1
        price: MISSING
      ,
        name: 'Beer'
        netPrice: 10
        tax: 0.2
        price: 12
      ]

There are two rules

  • A product price can be calculated by adding tax to the net price.
  • The total price is the sum of all product prices.

Here is the code describing these rules:


    rules = [
      target: '/products//price'
      depends: 
        netPrice: '../netPrice'
        tax: '../tax'
      calculate: ->
        @netPrice * (1 + @tax)
    ,
      target: '/general/price'
      depends:
        prices: '/products//price'
      calculate: ->
        _.reduce(
          @prices
          (x,y) -> x+y
          0)
    ]

A rule consists of

  • A target pointing to one or more nodes in the object.
  • Dependencies, mapping a name to an xpath-like expression.
  • A calculation which has access to the values defined in the dependencies, and returns a value that will be written into the underlying object.

Circular rules should be avoided.

Finally, we specify which node(s) should be calculated:


    {resolve} = require 'depresso'
    resolve inventory, rules, '/general/price'
    console.log inventory.general.price # prints 34

The xpath-like expressions used throughout the examples are provided by SpahQL, the order of dependency resolution is calculated with DepGraph. The spahql query language has some limitations, the biggest one being the lack of the parent path. Improvements are expected, see https://github.com/danski/spahql/issues/1

npm loves you