uberpoet/genproj.py (64 lines of code) (raw):

# Copyright (c) 2018 Uber Technologies, Inc. # # 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. from __future__ import absolute_import import argparse import logging import sys import time from . import commandlineutil, projectgen from .moduletree import ModuleGenType class GenProjCommandLine(object): @staticmethod def make_args(args): """Parses command line arguments""" arg_desc = 'Generate a fake test project with many buck modules' parser = argparse.ArgumentParser(description=arg_desc) parser.add_argument('-o', '--output_directory', required=True, help='Where the mock project should be output.') parser.add_argument( '-bmp', '--buck_module_path', required=True, help='The root of the BUCK dependency path of the generated code.') parser.add_argument( '-gt', '--gen_type', required=True, choices=ModuleGenType.enum_list(), help='What kind of mock app generation you want. See layer_types.md for a description of graph types.') parser.add_argument( '-wmo', '--use_wmo', default=False, help='Wether or not to use whole module optimization when building swift modules.') parser.add_argument( '--print_dependency_graph', default=False, help='If true, prints out the dependency edge list and exits instead of generating an application.') commandlineutil.AppGenerationConfig.add_app_gen_options(parser) args = parser.parse_args(args) commandlineutil.AppGenerationConfig.validate_app_gen_options(args) return args def main(self, args=sys.argv[1:]): logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(funcName)s: %(message)s') start = time.time() args = self.make_args(args) graph_config = commandlineutil.AppGenerationConfig() graph_config.pull_from_args(args) app_node, node_list = commandlineutil.gen_graph(args.gen_type, graph_config) if args.print_dependency_graph: print_nodes(node_list) exit(0) commandlineutil.del_old_output_dir(args.output_directory) gen = projectgen.BuckProjectGenerator(args.output_directory, args.buck_module_path, use_wmo=args.use_wmo) logging.info("Generation type: %s", args.gen_type) logging.info("Creating a {} module count mock app in {}".format(len(node_list), args.output_directory)) logging.info("Example command to generate xcode workspace: $ buck project /{}/App:MockApp".format( args.buck_module_path)) gen.gen_app(app_node, node_list, graph_config.lines_of_code) fin = time.time() logging.info("Done in %f s", fin - start) def print_nodes(node_list): edges = [(node.name, dep.name) for node in node_list for dep in node.deps] for edge in edges: print edge[0], edge[1] def main(): GenProjCommandLine().main() if __name__ == '__main__': main()