Skip to content

Enacero/json_modify

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

json_modify

https://img.shields.io/pypi/v/json_modify https://img.shields.io/github/license/Enacero/json_modify https://travis-ci.org/Enacero/json_modify.svg?branch=master

json_modify is simple library that helps apply modifications to json/yaml files and python representations of json.

Installation

pip install json_modify

Example

from json_modify import apply_actions

source = {
    "spec": {
        "name": "test",
        "metadata": [
            {"name": "test1", "value": "test1"},
            {"name": "test2", "value": "test2"}
        ],
        "values": {"value1": 10, "value2": 20}
    }
}

actions = [
    {"action": "add",
     "path": "spec/values",
     "value": {"value3": 30, "value4": 40}}
]

result = apply_actions(source, actions)

print(result)

{"spec": {
    "name": "test",
    "metadata": [
        {"name": "test1", "value": "test1"},
        {"name": "test2", "value": "test2"}
    ],
    "values": {
        "value1": 10, "value2": 20,
        "value3": 30, "value4": 40}
    }
}

Markers

json_modify uses markers to traverse lists. Markers should be used in path for example:

"path": "metadata/$project_name/name"

There are two types of markers:

  • Filter marker ($<marker_name>) - the kind of marker, that is used to select dictionary in list by list of section[key] == value. Filter marker should be described in action where it's used. For example:
{
    "action": "delete",
    "path": "metadata/$project_name/name",
    "project_name": [{"key": "name", "value": "nginx"}]
}
  • Index marker ($<index>) - the kind of marker, that is used to select specific element in list, by it's index. For example:
{
    "action": "replace",
    "path": ["users", "$0"],
    "value": { "name": "test_user", "id": 0}
}

It's allowed to use any quantity of markers and mix both types of markers in single path.

Action schema

  • action (Required): Type of action, possible values are: add, replace, delete, rename(only for dictionaries).
  • path (Required): Path to the field that we want to change. path can be string, separated by delimiter (default is \) or list of strings.
  • value (Optional for delete, Required for other): Value that should be applied to specified path. The type of value is described for each action separately.
  • marker (Required for each non index marker in path): List of dictionaries, that should be applied to find value in list. Each dictionary consist of:
    • key (Required): Name of the key that should be used for search.
    • value (Required): Value that is used to find concrete dictionary in list of dictionaries.

Supported actions

  1. add: Insert values into section, specified by last key of path. The last key in section should lead to list or dict section.
    • For add action on list value should be of type list, so that it'll be possible to extend current list.
    • For add action on dict value should be of type dict, so that we can update current dict.
  2. replace: Replace section, specified by last key of path with value.
  3. delete: Delete section, specified by last key of path.
  4. rename: Move content of section, specified by last key of path to section with name specified in value.

TODO

  1. Add documentation to ReadTheDocs
  2. Add creation of action's by diff.

License

Copyright Oleksii Petrenko, 2020.

Distributed under the terms of the MIT license, json_modify is free and open source software.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages