From bce596b4c50b6c28f9c10c558c890c87eee44ca8 Mon Sep 17 00:00:00 2001 From: Joe Gregorio Date: Tue, 5 Apr 2011 00:45:40 -0400 Subject: [PATCH] Added enable-app-engine-project --- MANIFEST.in | 1 + bin/enable-app-engine-project | 116 ++++++++++++++++++++++++++++++++++ setup.py | 3 +- 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 bin/enable-app-engine-project diff --git a/MANIFEST.in b/MANIFEST.in index 58ab961..9154e7b 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -12,3 +12,4 @@ include setpath.sh include setup_utils.py include gflags.py include gflags_validators.py +include bin/enable-app-engine-project diff --git a/bin/enable-app-engine-project b/bin/enable-app-engine-project new file mode 100644 index 0000000..07dfb7b --- /dev/null +++ b/bin/enable-app-engine-project @@ -0,0 +1,116 @@ +#!/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, or symbolically links 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. +""" + +__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): + 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) + + # 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: + logging.info('Copied to: %s' % filename) + else: + filename, copied = copy_file(src, dst, FLAGS.dry_run) + logging.info('Copied to: %s Successfully: %s' % (filename, copied)) + except DistutilsFileError, e: + sys.exit(str(e)) + +if __name__ == '__main__': + main(sys.argv) diff --git a/setup.py b/setup.py index ae4d21e..ef75d98 100644 --- a/setup.py +++ b/setup.py @@ -64,7 +64,7 @@ long_desc = """The Google API Client for Python is a client library for accessing the Buzz, Moderator, and Latitude APIs.""" setup(name="google-api-python-client", - version="1.0alpha11", + version="1.0beta1", description="Google API Client Library for Python", long_description=long_desc, author="Joe Gregorio", @@ -76,6 +76,7 @@ setup(name="google-api-python-client", package_data={ 'apiclient': ['contrib/*/*.json'] }, + scripts=['bin/enable-app-engine-project'], license="Apache 2.0", keywords="google api client", classifiers=['Development Status :: 3 - Alpha',