Skip to main content

JSON Merge Tree (built on top of json-multi-merge) merges JSON objects in a hierarchy, allowing customization of how objects are merged.

Project description

json-merge-tree

JSON Merge Tree (built on top of json-multi-merge) merges JSON objects in a hierarchy, allowing customization of how objects are merged.

The hierarchy is defined by the caller's parents module, which specifies a function for each resource type that returns the parent ID and another function to get its parents (unless it's the top level).

It relies on a SQLAlchemy Table containing the fields id (UUID), resource_id (UUID), resource_type (string), slug (string), and a field that stores the JSON object you want to merge.

Installation

Install this package, e.g., pip install json-merge-tree.


## merge_tree

Main entrypoint for merging JSON objects in a table up a hierarchy defined by `parents`.

### Example
```python
from json_merge_tree import merge_tree

import widget_service.parents
from widget_service.db import widgets

# Merge widgets of all the requested resource's ancestors and return the result
merged_json = merge_tree(
    table=widgets, 
    id='228135fb-6a3d-4551-93db-17ed1bbe466a', 
    type='brand', 
    json_field='widget', 
    parents=widget_service.parents, 
    slugs=None, 
    debug='annotate'
)

merge

Generic function to merge two JSON objects together. Largely the same as jsonmerge.Merger.merge but with the added ability to customize how objects are merged with the annotations below.

Merge key annotations

You can append the annotation listed below to a key at any level to customize how its value affects the merged json.

-- Unset

Unset this key in the merged json. The value of this key does not matter - you can set it to null.

  • E.g. 1
{
  "colors": {
    "content": "#000000", 
    "section--": null
  }
}

merged into

{
  "colors": {
    "section": "#000001"
  }
}

results in

{
  "colors": {
    "content": "#000000"
  }
}

  • E.g. 2
{
  "styles": {
    "h1--": null, 
    "h2": {
      "fontSize": 3
    }
  }
}

merged into

{
  "styles": {
    "h1": {
      "fontWeight": "heading"
    }
  }
}

results in

{
  "styles": {
    "h2": {
      "fontSize": 3
    }
  }
}

! Replace

Replace this key's value with this value.

  • E.g. 1
{
  "colors": {
      "content": "#000000", 
      "section!": "#000002"
  }
}

merged into

{
  "colors": {
    "section": "#000001"
  }
}

results in

{
  "colors": {
    "content": "#000000", 
    "section": "#000002"
  }
}

  • E.g. 2
{
  "styles": {
    "h1!": {
      "fontFamily": "heading",
      "fontSize": 5
    }
  }
}

merged into

{
  "styles": {
    "h1": {
      "fontWeight": "heading"
    }
  }
}

results in

{
  "styles": {
    "h1": {
      "fontFamily": "heading",
      "fontSize": 5
    }
  }
}

Slugs

Slugs are kind of a weird feature – and getting weirder as we use them to solve more use cases.

Originally, A slug was a named json object scoped under a resource in the hierarchy to be merged. In our case, a custom-page theme merged under one of the resources in our resource hierarchy.

The use of slugs has been extended to included named json object mixins not associated with any one resource at the bottom of the hierarchy, but scoped to a resource at any level. For example, a site wants to have a "dark" theme that could be applied to any page within the site.

When merging, the library first merges the json objects without slugs, then merges json objects with slugs at each level. Multiple slugs can be included when merging.

slugs_only

When slugs_only=True is passed to merge_tree, the resource JSON at every level of the hierarchy is skipped — only slug JSON objects are merged. This is useful when you only need the slug data without any of the base resource JSON mixed in.

merged_json = merge_tree(
    table=widgets,
    id='228135fb-6a3d-4551-93db-17ed1bbe466a',
    type='brand',
    json_field='widget',
    parents=widget_service.parents,
    slugs=['dark-theme'],
    slugs_only=True,
)

Note that the underlying query still fetches all resource records (to check inherits and maintain correct cache invalidation), it just excludes them from the merge.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

json_merge_tree-0.8.1.tar.gz (4.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

json_merge_tree-0.8.1-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

Details for the file json_merge_tree-0.8.1.tar.gz.

File metadata

  • Download URL: json_merge_tree-0.8.1.tar.gz
  • Upload date:
  • Size: 4.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for json_merge_tree-0.8.1.tar.gz
Algorithm Hash digest
SHA256 5d246ba0197699536001d97ec72c672055d8366dfe56d2bcb95953c4162a154e
MD5 099dd74d5b5a11083151b326c57d222f
BLAKE2b-256 01c0ee57d61db67352a48a4e57d9111e6b2e0c3f212d687d582841739a52d9e6

See more details on using hashes here.

File details

Details for the file json_merge_tree-0.8.1-py3-none-any.whl.

File metadata

File hashes

Hashes for json_merge_tree-0.8.1-py3-none-any.whl
Algorithm Hash digest
SHA256 13f86ce23dc99a02626ec942be463216b65831409b7b29b6fbaf68f653663698
MD5 db67daf74fd1f3cfb428fed9bedfa861
BLAKE2b-256 16a62f609fea46f0fe3775fc6952df5e0ca6fac596aa21543c59e60f7aae6948

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page