diff options
author | Jooyung Han <jooyung@google.com> | 2019-08-01 23:35:08 +0900 |
---|---|---|
committer | Jooyung Han <jooyung@google.com> | 2019-08-02 00:08:05 +0900 |
commit | 04329f131ad3d8d274a6af20784e6110c88db981 (patch) | |
tree | 044f847a5c31b52f69eecec3ae1a41b2dc258a3c /scripts | |
parent | e16330393ac53154f75740d0280c7f0c28d86fe1 (diff) | |
download | build_soong-04329f131ad3d8d274a6af20784e6110c88db981.tar.gz build_soong-04329f131ad3d8d274a6af20784e6110c88db981.tar.bz2 build_soong-04329f131ad3d8d274a6af20784e6110c88db981.zip |
Add jsonmodify tool
This tool is used to modify apex_manifest.json when building apex
module.
Here's the usage:
usage: jsonmodify [-h] [-o output] [-v path value] [-s path value]
[-r path] [-a path [value ...]]
[input]
positional arguments:
input JSON file
optional arguments:
-h, --help show this help message and exit
-o output, --out output
write result to a file. If omitted, print to stdout
-v path value, --value path value
set value of the key specified by path. If path
doesn't exist, creates new one.
-s path value, --replace path value
replace value of the key specified by path. If path
doesn't exist, no op.
-r path, --remove path
remove the key specified by path. If path doesn't
exist, no op.
-a path [value ...], --append_list path [value ...]
append values to the list specified by path. If path
doesn't exist, creates new list for it.
Bug: 138695532
Test: m jsonmodify
Test: echo {} | jsonmodify -v name hello -a list.nested a b c
{
"name": "hello",
"list": {
"nested": [
"a",
"b",
"c"
]
}
}
Change-Id: I2cd043c614b3ad2306a0c27ccee302633c6d2525
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/Android.bp | 16 | ||||
-rwxr-xr-x | scripts/jsonmodify.py | 121 |
2 files changed, 137 insertions, 0 deletions
diff --git a/scripts/Android.bp b/scripts/Android.bp index 31f59227..8c59cbc5 100644 --- a/scripts/Android.bp +++ b/scripts/Android.bp @@ -69,3 +69,19 @@ python_test_host { }, test_suites: ["general-tests"], } + +python_binary_host { + name: "jsonmodify", + main: "jsonmodify.py", + srcs: [ + "jsonmodify.py", + ], + version: { + py2: { + enabled: true, + }, + py3: { + enabled: false, + }, + } +} diff --git a/scripts/jsonmodify.py b/scripts/jsonmodify.py new file mode 100755 index 00000000..4b2c3c25 --- /dev/null +++ b/scripts/jsonmodify.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python +# +# Copyright (C) 2019 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +import argparse +import collections +import json +import sys + +def follow_path(obj, path): + cur = obj + last_key = None + for key in path.split('.'): + if last_key: + if last_key not in cur: + return None,None + cur = cur[last_key] + last_key = key + if last_key not in cur: + return None,None + return cur, last_key + + +def ensure_path(obj, path): + cur = obj + last_key = None + for key in path.split('.'): + if last_key: + if last_key not in cur: + cur[last_key] = dict() + cur = cur[last_key] + last_key = key + return cur, last_key + + +class SetValue(str): + def apply(self, obj, val): + cur, key = ensure_path(obj, self) + cur[key] = val + + +class Replace(str): + def apply(self, obj, val): + cur, key = follow_path(obj, self) + if cur: + cur[key] = val + + +class Remove(str): + def apply(self, obj): + cur, key = follow_path(obj, self) + if cur: + del cur[key] + + +class AppendList(str): + def apply(self, obj, *args): + cur, key = ensure_path(obj, self) + if key not in cur: + cur[key] = list() + if not isinstance(cur[key], list): + raise ValueError(self + " should be a array.") + cur[key].extend(args) + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('-o', '--out', + help='write result to a file. If omitted, print to stdout', + metavar='output', + action='store') + parser.add_argument('input', nargs='?', help='JSON file') + parser.add_argument("-v", "--value", type=SetValue, + help='set value of the key specified by path. If path doesn\'t exist, creates new one.', + metavar=('path', 'value'), + nargs=2, dest='patch', default=[], action='append') + parser.add_argument("-s", "--replace", type=Replace, + help='replace value of the key specified by path. If path doesn\'t exist, no op.', + metavar=('path', 'value'), + nargs=2, dest='patch', action='append') + parser.add_argument("-r", "--remove", type=Remove, + help='remove the key specified by path. If path doesn\'t exist, no op.', + metavar='path', + nargs=1, dest='patch', action='append') + parser.add_argument("-a", "--append_list", type=AppendList, + help='append values to the list specified by path. If path doesn\'t exist, creates new list for it.', + metavar=('path', 'value'), + nargs='+', dest='patch', default=[], action='append') + args = parser.parse_args() + + if args.input: + with open(args.input) as f: + obj = json.load(f, object_pairs_hook=collections.OrderedDict) + else: + obj = json.load(sys.stdin, object_pairs_hook=collections.OrderedDict) + + for p in args.patch: + p[0].apply(obj, *p[1:]) + + if args.out: + with open(args.out, "w") as f: + json.dump(obj, f, indent=2) + else: + print(json.dumps(obj, indent=2)) + + +if __name__ == '__main__': + main() |