From 7be6bf978ddf33d8371b9e03f920e266e01bb333 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Tue, 30 Jun 2015 10:22:02 -0700 Subject: [PATCH] Add a script for packaging Sky bundles This script consumes a sky.yaml file and produces a bundle that contains the listed material design assets as well as the snapshot binary. This script isn't wired into the build system yet because we don't yet download the material design icons using DEPS. R=chinmaygarde@google.com, eseidel@google.com Review URL: https://codereview.chromium.org/1220893002. --- engine/src/flutter/tools/skyx.py | 75 ++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 engine/src/flutter/tools/skyx.py diff --git a/engine/src/flutter/tools/skyx.py b/engine/src/flutter/tools/skyx.py new file mode 100755 index 00000000000..cc4cfac3416 --- /dev/null +++ b/engine/src/flutter/tools/skyx.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python +# Copyright 2015 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 subprocess +import sys +import yaml +import zipfile +import os +import argparse +import copy + +SNAPSHOT_KEY = 'snapshot_blob.bin' +DENSITIES = ['drawable-xxhdpi'] +THEMES = ['white', 'black', 'grey600'] +SIZES = [24] + +class MaterialAsset(object): + def __init__(self, descriptor): + self.name = descriptor['name'] + self.size = descriptor['size'] + self.theme = descriptor['theme'] + self.density = descriptor['density'] + + @property + def key(self): + category, subtype = self.name.split('/', 1) + return os.path.join(category, self.density, 'ic_%(subtype)s_%(theme)s_%(size)sdp.png' % { + 'subtype': subtype, 'theme': self.theme, 'size': self.size, + }) + +def generate_values(asset_descriptor, key, default): + if key in asset_descriptor: + return [asset_descriptor[key]] + return default + +def generate_material_assets(asset_descriptor): + current_asset_descriptor = copy.deepcopy(asset_descriptor) + for density in generate_values(asset_descriptor, 'density', DENSITIES): + current_asset_descriptor['density'] = density + for theme in generate_values(asset_descriptor, 'theme', THEMES): + current_asset_descriptor['theme'] = theme + for size in generate_values(asset_descriptor, 'size', SIZES): + current_asset_descriptor['size'] = size + yield MaterialAsset(current_asset_descriptor) + +def load_manifest(manifest): + with open(manifest) as manifest_file: + return yaml.load(manifest_file) + +def parse_material_assets(manifest_descriptor): + for asset_descriptor in manifest_descriptor['material-design-icons']: + for asset in generate_material_assets(asset_descriptor): + yield asset + +def main(): + parser = argparse.ArgumentParser(description='Taco') + parser.add_argument('manifest', type=str) + parser.add_argument('--asset-base', type=str) + parser.add_argument('--snapshot', type=str) + parser.add_argument('-o', '--output-file', type=str) + args = parser.parse_args() + + manifest_descriptor = load_manifest(args.manifest) + material_assets = list(parse_material_assets( manifest_descriptor)) + + with zipfile.ZipFile(args.output_file, 'w', zipfile.ZIP_DEFLATED) as archive: + if args.snapshot is not None: + archive.write(args.snapshot, SNAPSHOT_KEY) + for asset in material_assets: + archive.write(os.path.join(args.asset_base, asset.key), asset.key, zipfile.ZIP_STORED) + +if __name__ == '__main__': + sys.exit(main())