| #!/usr/bin/env python |
| # |
| # Copyright 2007 Google 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. |
| |
| """Copy the sources for google-api-python-client into an App Engine project. |
| |
| Copies the sources of the google-api-python-client |
| library into a Google App Engine project. This is necessary so that the |
| source can be uploaded when the application is deployed. |
| |
| $ enable-app-engine-project [flags] directory |
| |
| """ |
| |
| __author__ = 'jcgregorio@google.com (Joe Gregorio)' |
| |
| import gflags |
| import logging |
| import sys |
| import os |
| |
| from distutils.dir_util import copy_tree |
| from distutils.file_util import copy_file |
| from distutils.errors import DistutilsFileError |
| |
| FLAGS = gflags.FLAGS |
| SOURCES = [ |
| 'gflags', |
| 'gflags_validators', |
| 'httplib2', |
| 'oauth2client', |
| 'oauth2', |
| 'apiclient', |
| 'uritemplate', |
| ] |
| |
| gflags.DEFINE_enum('logging_level', 'ERROR', |
| ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], |
| 'Set the level of logging detail.') |
| |
| gflags.DEFINE_boolean('force', 'False', |
| 'Forcibly copy over client library files.') |
| |
| gflags.DEFINE_boolean('dry_run', 'False', 'Don\'t actually do anything.') |
| |
| def find_source(module): |
| """Find the absolute path for the source of a module. |
| |
| Args: |
| module: str, Name of the module. |
| Returns: |
| A tuple of (isdir, location), a boolean indicating if it |
| is a directory (True) or a single file module (False), and |
| the absolute path of the source. |
| """ |
| isdir = False |
| location = '' |
| m = __import__(module) |
| logging.debug('Absolute path for module %s: %s' % (module, m.__file__)) |
| basename = os.path.basename(m.__file__) |
| if basename.startswith('__init__.'): |
| isdir = True |
| location = os.path.dirname(m.__file__) |
| else: |
| location = m.__file__.rsplit('.', 1)[0] + '.py' |
| |
| return (isdir, location) |
| |
| def main(argv): |
| # Let the gflags module process the command-line arguments |
| try: |
| argv = FLAGS(argv) |
| except gflags.FlagsError, e: |
| print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS) |
| sys.exit(1) |
| |
| if len(argv) == 1: |
| print 'Usage: %s ARGS\n%s' % (argv[0], FLAGS) |
| sys.exit(1) |
| |
| # Set the logging according to the command-line flag |
| logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level)) |
| |
| logging.info('Setting up the directories: %s' % argv[1:]) |
| for dir in argv[1:]: |
| # Check if the supplied directory is an App Engine project by looking |
| # for an app.yaml |
| if not os.path.isfile(os.path.join(dir, 'app.yaml')): |
| sys.exit('The given directory is not a Google App Engine project: %s' % dir) |
| |
| |
| # Build up the set of file or directory copying actions we need to do |
| action = [] # (src, dst, isdir) |
| for source in SOURCES: |
| isdir, source_location = find_source(source) |
| if isdir: |
| target = source |
| else: |
| target = source + ".py" |
| full_target = os.path.join(dir, target) |
| if not FLAGS.force and os.path.exists(full_target): |
| noun = isdir and 'Directory' or 'File' |
| sys.exit("%s already exists in project: %s" % (noun, target)) |
| action.append((source_location, full_target, isdir)) |
| |
| # Now perform all the copying actions we collected |
| try: |
| for src, dst, isdir in action: |
| if isdir: |
| results = copy_tree(src, dst, FLAGS.dry_run) |
| for filename in results: |
| print 'Copied: %s' % filename |
| else: |
| filename, copied = copy_file(src, dst, FLAGS.dry_run) |
| print 'Copied: %s Successfully: %s' % (filename, copied) |
| except DistutilsFileError, e: |
| sys.exit(str(e)) |
| |
| if __name__ == '__main__': |
| main(sys.argv) |