Index: scripts/slave/recipe_modules/json/api.py |
diff --git a/scripts/slave/recipe_modules/json/api.py b/scripts/slave/recipe_modules/json/api.py |
deleted file mode 100644 |
index c41bd42e17fb9f05b8fcca8792acb2d9c9b73bd6..0000000000000000000000000000000000000000 |
--- a/scripts/slave/recipe_modules/json/api.py |
+++ /dev/null |
@@ -1,122 +0,0 @@ |
-# Copyright 2013 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-import functools |
-import collections |
-import contextlib |
-import json |
- |
-from recipe_engine import recipe_api |
-from recipe_engine import util as recipe_util |
-from recipe_engine import config_types |
- |
- |
-class JsonOutputPlaceholder(recipe_util.Placeholder): |
- """JsonOutputPlaceholder is meant to be a placeholder object which, when added |
- to a step's cmd list, will be replaced by annotated_run with the path to a |
- temporary file (e.g. /tmp/tmp4lp1qM) which will exist only for the duration of |
- the step. If the script requires a flag (e.g. --output-json /path/to/file), |
- you must supply that flag yourself in the cmd list. |
- |
- This placeholder can be optionally added when you use the Steps.step() |
- method in this module. |
- |
- FIXME |
- After the termination of the step, this file is expected to contain a valid |
- JSON document, which will be set as the json.output for that step in the |
- step_history OrderedDict passed to your recipe generator. |
- """ |
- def __init__(self, api, add_json_log): |
- self.raw = api.m.raw_io.output('.json') |
- self.add_json_log = add_json_log |
- super(JsonOutputPlaceholder, self).__init__() |
- |
- @property |
- def backing_file(self): |
- return self.raw.backing_file |
- |
- def render(self, test): |
- return self.raw.render(test) |
- |
- def result(self, presentation, test): |
- raw_data = self.raw.result(presentation, test) |
- |
- valid = False |
- ret = None |
- try: |
- ret = json.loads(raw_data, object_pairs_hook=collections.OrderedDict) |
- valid = True |
- # TypeError is raised when raw_data is None, which can happen if the json |
- # file was not created. We then correctly handle this as invalid result. |
- except (ValueError, TypeError): # pragma: no cover |
- pass |
- |
- if self.add_json_log: |
- key = self.name + ('' if valid else ' (invalid)') |
- with contextlib.closing(recipe_util.StringListIO()) as listio: |
- json.dump(ret, listio, indent=2, sort_keys=True) |
- presentation.logs[key] = listio.lines |
- |
- return ret |
- |
- |
-class JsonApi(recipe_api.RecipeApi): |
- def __init__(self, **kwargs): |
- super(JsonApi, self).__init__(**kwargs) |
- self.loads = json.loads |
- @functools.wraps(json.dumps) |
- def dumps(*args, **kwargs): |
- kwargs['sort_keys'] = True |
- kwargs.setdefault('default', config_types.json_fixup) |
- return json.dumps(*args, **kwargs) |
- self.dumps = dumps |
- |
- def is_serializable(self, obj): |
- """Returns True if the object is JSON-serializable.""" |
- try: |
- self.dumps(obj) |
- return True |
- except Exception: |
- return False |
- |
- @recipe_util.returns_placeholder |
- def input(self, data): |
- """A placeholder which will expand to a file path containing <data>.""" |
- return self.m.raw_io.input(self.dumps(data), '.json') |
- |
- @recipe_util.returns_placeholder |
- def output(self, add_json_log=True): |
- """A placeholder which will expand to '/tmp/file'.""" |
- return JsonOutputPlaceholder(self, add_json_log) |
- |
- # TODO(you): This method should be in the `file` recipe_module |
- def read(self, name, path, **kwargs): |
- """Returns a step that reads a JSON file.""" |
- return self.m.python.inline( |
- name, |
- """ |
- import shutil |
- import sys |
- shutil.copy(sys.argv[1], sys.argv[2]) |
- """, |
- args=[path, self.output()], |
- add_python_log=False, |
- **kwargs |
- ) |
- |
- def property_args(self): |
- """Return --build-properties and --factory-properties arguments. LEGACY! |
- |
- Since properties is the merge of build_properties and factory_properties, |
- pass the merged dict as both arguments. |
- |
- It's vastly preferable to have your recipe only pass the bare minimum |
- of arguments to steps. Passing property objects obscures the data that |
- the script actually consumes from the property object. |
- """ |
- prop_str = self.dumps(dict(self.m.properties.legacy())) |
- return [ |
- '--factory-properties', prop_str, |
- '--build-properties', prop_str |
- ] |