From 7cded65b2cb45906b4b9a268581fa66cc85a69f6 Mon Sep 17 00:00:00 2001 From: Jon San Miguel Date: Fri, 16 Jan 2015 20:20:47 -0800 Subject: [PATCH] GAE Sdk 1.9.15 --- MANIFEST | 970 ++++++++++++++++++ MANIFEST.in | 3 + RELEASE_NOTES | 24 - VERSION | 4 +- google/appengine/api/app_logging.py | 17 +- google/appengine/api/appinfo.py | 98 +- google/appengine/api/logservice/logservice.py | 107 +- google/appengine/api/search/search.py | 54 +- .../appengine/api/search/stub/simple_facet.py | 17 +- google/appengine/api/urlfetch_stub.py | 11 - .../appengine/client/services/port_manager.py | 7 +- google/appengine/datastore/datastore_pbs.py | 99 +- google/appengine/datastore/datastore_query.py | 496 ++------- google/appengine/datastore/datastore_rpc.py | 14 +- .../datastore/datastore_stub_util.py | 64 +- .../appengine/datastore/datastore_v4_stub.py | 6 - google/appengine/ext/admin/__init__.py | 13 +- .../ext/analytics/static/analytics_js.js | 34 +- .../ext/appstats/static/appstats_js.js | 164 +-- .../appengine/ext/mapreduce/input_readers.py | 16 - .../appengine/ext/mapreduce/output_writers.py | 92 +- google/appengine/ext/ndb/query.py | 4 - google/appengine/ext/testbed/__init__.py | 4 - .../tools/app_engine_web_xml_parser.py | 74 +- google/appengine/tools/appcfg.py | 10 +- google/appengine/tools/appcfg_java.py | 13 +- google/appengine/tools/appengine_rpc.py | 24 +- google/appengine/tools/dev-channel-js.js | 31 +- .../tools/dev_appserver_apiserver.py | 44 +- .../tools/dev_appserver_blobimage.py | 9 +- .../tools/dev_appserver_blobstore.py | 19 +- .../appengine/tools/dev_appserver_channel.py | 9 +- .../tools/dev_appserver_import_hook.py | 3 - google/appengine/tools/dev_appserver_index.py | 5 +- google/appengine/tools/dev_appserver_login.py | 4 +- google/appengine/tools/dev_appserver_main.py | 24 +- .../tools/dev_appserver_multiprocess.py | 3 +- google/appengine/tools/dev_appserver_oauth.py | 11 +- .../appengine/tools/dev_appserver_upload.py | 5 +- .../admin/templates/instance_logs.html | 6 +- .../admin/templates/modules.html | 2 +- .../application_configuration.py | 44 +- .../application_configuration_test.py | 54 +- .../tools/devappserver2/dispatcher.py | 11 +- .../tools/devappserver2/file_watcher.py | 22 +- .../devappserver2/health_check_service.py | 10 +- .../devappserver2/inotify_file_watcher.py | 106 +- .../appengine/tools/devappserver2/instance.py | 3 - .../tools/devappserver2/log_manager.py | 15 +- .../appengine/tools/devappserver2/module.py | 45 +- .../tools/devappserver2/module_test.py | 38 +- .../tools/devappserver2/mtime_file_watcher.py | 59 +- .../tools/devappserver2/scheduled_executor.py | 3 +- .../tools/devappserver2/thread_executor.py | 6 +- .../tools/devappserver2/vm_runtime_factory.py | 8 + .../tools/devappserver2/vm_runtime_proxy.py | 4 +- .../devappserver2/vm_runtime_proxy_dart.py | 64 +- .../devappserver2/vm_runtime_proxy_go.py | 9 +- .../tools/devappserver2/win32_file_watcher.py | 221 ++-- .../devappserver2/win32_file_watcher_test.py | 183 ++-- .../tools/devappserver2/wsgi_server.py | 4 +- google/appengine/tools/docker/containers.py | 3 +- google/appengine/tools/jarfile.py | 34 +- google/appengine/tools/java_quickstart.py | 121 +-- google/appengine/tools/yaml_translator.py | 123 +-- google/net/proto2/proto/descriptor_pb2.py | 101 +- .../proto2/python/internal/python_message.py | 2 - .../proto2/python/internal/type_checkers.py | 7 +- google/net/proto2/python/public/descriptor.py | 5 +- .../python/public/descriptor_database.py | 4 +- .../speckle/proto/client_error_code_pb2.py | 10 +- setup.py | 3 +- 72 files changed, 1873 insertions(+), 2063 deletions(-) create mode 100644 MANIFEST create mode 100644 MANIFEST.in diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 00000000..1d0a2f0c --- /dev/null +++ b/MANIFEST @@ -0,0 +1,970 @@ +# file GENERATED by distutils, do NOT edit +.gitignore +BUGS +LICENSE +MANIFEST +MANIFEST.in +README +RELEASE_NOTES +VERSION +setup.py +google/__init__.py +google/appengine/__init__.py +google/appengine/_internal/__init__.py +google/appengine/_internal/antlr3/__init__.py +google/appengine/_internal/antlr3/compat.py +google/appengine/_internal/antlr3/constants.py +google/appengine/_internal/antlr3/dfa.py +google/appengine/_internal/antlr3/dottreegen.py +google/appengine/_internal/antlr3/exceptions.py +google/appengine/_internal/antlr3/extras.py +google/appengine/_internal/antlr3/recognizers.py +google/appengine/_internal/antlr3/streams.py +google/appengine/_internal/antlr3/tokens.py +google/appengine/_internal/antlr3/tree.py +google/appengine/_internal/antlr3/treewizard.py +google/appengine/_internal/django/__init__.py +google/appengine/_internal/django/conf/__init__.py +google/appengine/_internal/django/conf/global_settings.py +google/appengine/_internal/django/conf/app_template/__init__.py +google/appengine/_internal/django/conf/app_template/models.py +google/appengine/_internal/django/conf/app_template/tests.py +google/appengine/_internal/django/conf/app_template/views.py +google/appengine/_internal/django/conf/locale/en/__init__.py +google/appengine/_internal/django/conf/locale/en/formats.py +google/appengine/_internal/django/conf/locale/en/LC_MESSAGES/django.mo +google/appengine/_internal/django/conf/locale/en/LC_MESSAGES/django.po +google/appengine/_internal/django/conf/locale/en/LC_MESSAGES/djangojs.mo +google/appengine/_internal/django/conf/locale/en/LC_MESSAGES/djangojs.po +google/appengine/_internal/django/conf/project_template/__init__.py +google/appengine/_internal/django/conf/project_template/manage.py +google/appengine/_internal/django/conf/project_template/settings.py +google/appengine/_internal/django/conf/project_template/urls.py +google/appengine/_internal/django/conf/urls/__init__.py +google/appengine/_internal/django/conf/urls/defaults.py +google/appengine/_internal/django/conf/urls/i18n.py +google/appengine/_internal/django/conf/urls/shortcut.py +google/appengine/_internal/django/core/__init__.py +google/appengine/_internal/django/core/context_processors.py +google/appengine/_internal/django/core/exceptions.py +google/appengine/_internal/django/core/paginator.py +google/appengine/_internal/django/core/signals.py +google/appengine/_internal/django/core/template_loader.py +google/appengine/_internal/django/core/urlresolvers.py +google/appengine/_internal/django/core/validators.py +google/appengine/_internal/django/core/xheaders.py +google/appengine/_internal/django/core/cache/__init__.py +google/appengine/_internal/django/core/cache/backends/__init__.py +google/appengine/_internal/django/core/cache/backends/base.py +google/appengine/_internal/django/core/cache/backends/db.py +google/appengine/_internal/django/core/cache/backends/dummy.py +google/appengine/_internal/django/core/cache/backends/filebased.py +google/appengine/_internal/django/core/cache/backends/locmem.py +google/appengine/_internal/django/core/cache/backends/memcached.py +google/appengine/_internal/django/core/files/__init__.py +google/appengine/_internal/django/core/files/base.py +google/appengine/_internal/django/core/files/images.py +google/appengine/_internal/django/core/files/locks.py +google/appengine/_internal/django/core/files/move.py +google/appengine/_internal/django/core/files/storage.py +google/appengine/_internal/django/core/files/temp.py +google/appengine/_internal/django/core/files/uploadedfile.py +google/appengine/_internal/django/core/files/uploadhandler.py +google/appengine/_internal/django/core/files/utils.py +google/appengine/_internal/django/core/handlers/__init__.py +google/appengine/_internal/django/core/handlers/base.py +google/appengine/_internal/django/core/handlers/modpython.py +google/appengine/_internal/django/core/handlers/profiler-hotshot.py +google/appengine/_internal/django/core/handlers/wsgi.py +google/appengine/_internal/django/core/mail/__init__.py +google/appengine/_internal/django/core/mail/message.py +google/appengine/_internal/django/core/mail/utils.py +google/appengine/_internal/django/core/mail/backends/__init__.py +google/appengine/_internal/django/core/mail/backends/base.py +google/appengine/_internal/django/core/mail/backends/console.py +google/appengine/_internal/django/core/mail/backends/dummy.py +google/appengine/_internal/django/core/mail/backends/filebased.py +google/appengine/_internal/django/core/mail/backends/locmem.py +google/appengine/_internal/django/core/mail/backends/smtp.py +google/appengine/_internal/django/core/management/__init__.py +google/appengine/_internal/django/core/management/base.py +google/appengine/_internal/django/core/management/color.py +google/appengine/_internal/django/core/management/sql.py +google/appengine/_internal/django/core/management/validation.py +google/appengine/_internal/django/core/management/commands/__init__.py +google/appengine/_internal/django/core/management/commands/cleanup.py +google/appengine/_internal/django/core/management/commands/compilemessages.py +google/appengine/_internal/django/core/management/commands/createcachetable.py +google/appengine/_internal/django/core/management/commands/dbshell.py +google/appengine/_internal/django/core/management/commands/diffsettings.py +google/appengine/_internal/django/core/management/commands/dumpdata.py +google/appengine/_internal/django/core/management/commands/flush.py +google/appengine/_internal/django/core/management/commands/inspectdb.py +google/appengine/_internal/django/core/management/commands/loaddata.py +google/appengine/_internal/django/core/management/commands/makemessages.py +google/appengine/_internal/django/core/management/commands/reset.py +google/appengine/_internal/django/core/management/commands/runfcgi.py +google/appengine/_internal/django/core/management/commands/runserver.py +google/appengine/_internal/django/core/management/commands/shell.py +google/appengine/_internal/django/core/management/commands/sql.py +google/appengine/_internal/django/core/management/commands/sqlall.py +google/appengine/_internal/django/core/management/commands/sqlclear.py +google/appengine/_internal/django/core/management/commands/sqlcustom.py +google/appengine/_internal/django/core/management/commands/sqlflush.py +google/appengine/_internal/django/core/management/commands/sqlindexes.py +google/appengine/_internal/django/core/management/commands/sqlinitialdata.py +google/appengine/_internal/django/core/management/commands/sqlreset.py +google/appengine/_internal/django/core/management/commands/sqlsequencereset.py +google/appengine/_internal/django/core/management/commands/startapp.py +google/appengine/_internal/django/core/management/commands/startproject.py +google/appengine/_internal/django/core/management/commands/syncdb.py +google/appengine/_internal/django/core/management/commands/test.py +google/appengine/_internal/django/core/management/commands/testserver.py +google/appengine/_internal/django/core/management/commands/validate.py +google/appengine/_internal/django/core/serializers/__init__.py +google/appengine/_internal/django/core/serializers/base.py +google/appengine/_internal/django/core/serializers/json.py +google/appengine/_internal/django/core/serializers/python.py +google/appengine/_internal/django/core/serializers/pyyaml.py +google/appengine/_internal/django/core/serializers/xml_serializer.py +google/appengine/_internal/django/core/servers/__init__.py +google/appengine/_internal/django/core/servers/basehttp.py +google/appengine/_internal/django/core/servers/fastcgi.py +google/appengine/_internal/django/template/__init__.py +google/appengine/_internal/django/template/context.py +google/appengine/_internal/django/template/debug.py +google/appengine/_internal/django/template/defaultfilters.py +google/appengine/_internal/django/template/defaulttags.py +google/appengine/_internal/django/template/loader.py +google/appengine/_internal/django/template/loader_tags.py +google/appengine/_internal/django/template/smartif.py +google/appengine/_internal/django/template/loaders/__init__.py +google/appengine/_internal/django/template/loaders/app_directories.py +google/appengine/_internal/django/template/loaders/cached.py +google/appengine/_internal/django/template/loaders/eggs.py +google/appengine/_internal/django/template/loaders/filesystem.py +google/appengine/_internal/django/templatetags/__init__.py +google/appengine/_internal/django/templatetags/cache.py +google/appengine/_internal/django/templatetags/i18n.py +google/appengine/_internal/django/utils/__init__.py +google/appengine/_internal/django/utils/_os.py +google/appengine/_internal/django/utils/_threading_local.py +google/appengine/_internal/django/utils/autoreload.py +google/appengine/_internal/django/utils/cache.py +google/appengine/_internal/django/utils/checksums.py +google/appengine/_internal/django/utils/copycompat.py +google/appengine/_internal/django/utils/daemonize.py +google/appengine/_internal/django/utils/datastructures.py +google/appengine/_internal/django/utils/dateformat.py +google/appengine/_internal/django/utils/dates.py +google/appengine/_internal/django/utils/datetime_safe.py +google/appengine/_internal/django/utils/decorators.py +google/appengine/_internal/django/utils/encoding.py +google/appengine/_internal/django/utils/feedgenerator.py +google/appengine/_internal/django/utils/formats.py +google/appengine/_internal/django/utils/functional.py +google/appengine/_internal/django/utils/hashcompat.py +google/appengine/_internal/django/utils/html.py +google/appengine/_internal/django/utils/http.py +google/appengine/_internal/django/utils/importlib.py +google/appengine/_internal/django/utils/itercompat.py +google/appengine/_internal/django/utils/module_loading.py +google/appengine/_internal/django/utils/numberformat.py +google/appengine/_internal/django/utils/regex_helper.py +google/appengine/_internal/django/utils/safestring.py +google/appengine/_internal/django/utils/stopwords.py +google/appengine/_internal/django/utils/synch.py +google/appengine/_internal/django/utils/termcolors.py +google/appengine/_internal/django/utils/text.py +google/appengine/_internal/django/utils/thread_support.py +google/appengine/_internal/django/utils/timesince.py +google/appengine/_internal/django/utils/tree.py +google/appengine/_internal/django/utils/tzinfo.py +google/appengine/_internal/django/utils/version.py +google/appengine/_internal/django/utils/xmlutils.py +google/appengine/_internal/django/utils/simplejson/__init__.py +google/appengine/_internal/django/utils/simplejson/decoder.py +google/appengine/_internal/django/utils/simplejson/encoder.py +google/appengine/_internal/django/utils/simplejson/scanner.py +google/appengine/_internal/django/utils/simplejson/tool.py +google/appengine/_internal/django/utils/translation/__init__.py +google/appengine/_internal/django/utils/translation/trans_null.py +google/appengine/_internal/django/utils/translation/trans_real.py +google/appengine/_internal/graphy/__init__.py +google/appengine/_internal/graphy/bar_chart.py +google/appengine/_internal/graphy/common.py +google/appengine/_internal/graphy/formatters.py +google/appengine/_internal/graphy/line_chart.py +google/appengine/_internal/graphy/pie_chart.py +google/appengine/_internal/graphy/util.py +google/appengine/_internal/graphy/backends/__init__.py +google/appengine/_internal/graphy/backends/google_chart_api/__init__.py +google/appengine/_internal/graphy/backends/google_chart_api/encoders.py +google/appengine/_internal/graphy/backends/google_chart_api/util.py +google/appengine/api/__init__.py +google/appengine/api/api_base_pb.py +google/appengine/api/apiproxy_rpc.py +google/appengine/api/apiproxy_stub.py +google/appengine/api/apiproxy_stub_map.py +google/appengine/api/app_logging.py +google/appengine/api/appinfo.py +google/appengine/api/appinfo_errors.py +google/appengine/api/appinfo_includes.py +google/appengine/api/backendinfo.py +google/appengine/api/client_deployinfo.py +google/appengine/api/conf.py +google/appengine/api/croninfo.py +google/appengine/api/datastore.py +google/appengine/api/datastore_admin.py +google/appengine/api/datastore_entities.py +google/appengine/api/datastore_errors.py +google/appengine/api/datastore_file_stub.py +google/appengine/api/datastore_types.py +google/appengine/api/dispatchinfo.py +google/appengine/api/dosinfo.py +google/appengine/api/lib_config.py +google/appengine/api/mail.py +google/appengine/api/mail_errors.py +google/appengine/api/mail_service_pb.py +google/appengine/api/mail_stub.py +google/appengine/api/pagespeedinfo.py +google/appengine/api/queueinfo.py +google/appengine/api/quota.py +google/appengine/api/rdbms.py +google/appengine/api/rdbms_mysqldb.py +google/appengine/api/request_info.py +google/appengine/api/urlfetch.py +google/appengine/api/urlfetch_errors.py +google/appengine/api/urlfetch_service_pb.py +google/appengine/api/urlfetch_stub.py +google/appengine/api/user_service_pb.py +google/appengine/api/user_service_stub.py +google/appengine/api/users.py +google/appengine/api/validation.py +google/appengine/api/yaml_builder.py +google/appengine/api/yaml_errors.py +google/appengine/api/yaml_listener.py +google/appengine/api/yaml_object.py +google/appengine/api/app_identity/__init__.py +google/appengine/api/app_identity/app_identity.py +google/appengine/api/app_identity/app_identity_keybased_stub.py +google/appengine/api/app_identity/app_identity_service_pb.py +google/appengine/api/app_identity/app_identity_stub.py +google/appengine/api/backends/__init__.py +google/appengine/api/backends/backends.py +google/appengine/api/background_thread/__init__.py +google/appengine/api/background_thread/background_thread.py +google/appengine/api/blobstore/__init__.py +google/appengine/api/blobstore/blobstore.py +google/appengine/api/blobstore/blobstore_service_pb.py +google/appengine/api/blobstore/blobstore_stub.py +google/appengine/api/blobstore/dict_blob_storage.py +google/appengine/api/blobstore/file_blob_storage.py +google/appengine/api/capabilities/__init__.py +google/appengine/api/capabilities/capability_service_pb.py +google/appengine/api/capabilities/capability_stub.py +google/appengine/api/channel/__init__.py +google/appengine/api/channel/channel.py +google/appengine/api/channel/channel_service_pb.py +google/appengine/api/channel/channel_service_stub.py +google/appengine/api/files/__init__.py +google/appengine/api/files/blobstore.py +google/appengine/api/files/crc32c.py +google/appengine/api/files/file.py +google/appengine/api/files/file_service_pb.py +google/appengine/api/files/file_service_stub.py +google/appengine/api/files/gs.py +google/appengine/api/files/records.py +google/appengine/api/files/shuffler.py +google/appengine/api/files/testutil.py +google/appengine/api/images/__init__.py +google/appengine/api/images/images_blob_stub.py +google/appengine/api/images/images_not_implemented_stub.py +google/appengine/api/images/images_service_pb.py +google/appengine/api/images/images_stub.py +google/appengine/api/labs/__init__.py +google/appengine/api/labs/taskqueue/__init__.py +google/appengine/api/labs/taskqueue/taskqueue.py +google/appengine/api/labs/taskqueue/taskqueue_service_pb.py +google/appengine/api/labs/taskqueue/taskqueue_stub.py +google/appengine/api/logservice/__init__.py +google/appengine/api/logservice/log_service_pb.py +google/appengine/api/logservice/logservice.py +google/appengine/api/logservice/logservice_stub.py +google/appengine/api/logservice/logsutil.py +google/appengine/api/memcache/__init__.py +google/appengine/api/memcache/memcache_service_pb.py +google/appengine/api/memcache/memcache_stub.py +google/appengine/api/modules/__init__.py +google/appengine/api/modules/modules.py +google/appengine/api/modules/modules_service_pb.py +google/appengine/api/modules/modules_stub.py +google/appengine/api/namespace_manager/__init__.py +google/appengine/api/namespace_manager/namespace_manager.py +google/appengine/api/oauth/__init__.py +google/appengine/api/oauth/oauth_api.py +google/appengine/api/prospective_search/__init__.py +google/appengine/api/prospective_search/error_pb.py +google/appengine/api/prospective_search/prospective_search.py +google/appengine/api/prospective_search/prospective_search_admin.py +google/appengine/api/prospective_search/prospective_search_pb.py +google/appengine/api/prospective_search/prospective_search_stub.py +google/appengine/api/remote_socket/__init__.py +google/appengine/api/remote_socket/_remote_socket.py +google/appengine/api/remote_socket/_remote_socket_addr.py +google/appengine/api/remote_socket/_remote_socket_error.py +google/appengine/api/remote_socket/_remote_socket_stub.py +google/appengine/api/remote_socket/remote_socket_service_pb.py +google/appengine/api/runtime/__init__.py +google/appengine/api/runtime/runtime.py +google/appengine/api/search/ExpressionLexer.py +google/appengine/api/search/ExpressionParser.py +google/appengine/api/search/QueryLexer.py +google/appengine/api/search/QueryParser.py +google/appengine/api/search/__init__.py +google/appengine/api/search/expression_parser.py +google/appengine/api/search/geo_util.py +google/appengine/api/search/query_parser.py +google/appengine/api/search/search.py +google/appengine/api/search/search_service_pb.py +google/appengine/api/search/search_util.py +google/appengine/api/search/simple_search_stub.py +google/appengine/api/search/stub/__init__.py +google/appengine/api/search/stub/document_matcher.py +google/appengine/api/search/stub/expression_evaluator.py +google/appengine/api/search/stub/geo_util.py +google/appengine/api/search/stub/simple_facet.py +google/appengine/api/search/stub/simple_tokenizer.py +google/appengine/api/search/stub/tokens.py +google/appengine/api/system/__init__.py +google/appengine/api/system/system_service_pb.py +google/appengine/api/system/system_stub.py +google/appengine/api/taskqueue/__init__.py +google/appengine/api/taskqueue/taskqueue.py +google/appengine/api/taskqueue/taskqueue_service_pb.py +google/appengine/api/taskqueue/taskqueue_stub.py +google/appengine/api/xmpp/__init__.py +google/appengine/api/xmpp/xmpp_service_pb.py +google/appengine/api/xmpp/xmpp_service_stub.py +google/appengine/base/__init__.py +google/appengine/base/capabilities_pb.py +google/appengine/client/__init__.py +google/appengine/client/services/__init__.py +google/appengine/client/services/port_manager.py +google/appengine/client/services/vme_constants.py +google/appengine/client/services/vme_errors.py +google/appengine/cron/GrocLexer.py +google/appengine/cron/GrocParser.py +google/appengine/cron/__init__.py +google/appengine/cron/groc.py +google/appengine/cron/groctimespecification.py +google/appengine/datastore/__init__.py +google/appengine/datastore/acl_pb.py +google/appengine/datastore/action_pb.py +google/appengine/datastore/datastore_index.py +google/appengine/datastore/datastore_index_xml.py +google/appengine/datastore/datastore_pb.py +google/appengine/datastore/datastore_pbs.py +google/appengine/datastore/datastore_query.py +google/appengine/datastore/datastore_rpc.py +google/appengine/datastore/datastore_sqlite_stub.py +google/appengine/datastore/datastore_stats_generator.py +google/appengine/datastore/datastore_stub_index.py +google/appengine/datastore/datastore_stub_util.py +google/appengine/datastore/datastore_v3_pb.py +google/appengine/datastore/datastore_v4_pb.py +google/appengine/datastore/datastore_v4_stub.py +google/appengine/datastore/datastore_v4_validator.py +google/appengine/datastore/document_pb.py +google/appengine/datastore/entity_pb.py +google/appengine/datastore/entity_v4_pb.py +google/appengine/datastore/snapshot_pb.py +google/appengine/datastore/sortable_pb_encoder.py +google/appengine/dist/__init__.py +google/appengine/dist/_library.py +google/appengine/dist/_threading_local.py +google/appengine/dist/httplib.py +google/appengine/dist/neo_cgi.py +google/appengine/dist/py_imp.py +google/appengine/dist/py_select.py +google/appengine/dist/py_zipimport.py +google/appengine/dist/select.py +google/appengine/dist/socket.py +google/appengine/dist/subprocess.py +google/appengine/dist/tempfile.py +google/appengine/dist27/__init__.py +google/appengine/dist27/httplib.py +google/appengine/dist27/socket.py +google/appengine/dist27/threading.py +google/appengine/dist27/urllib.py +google/appengine/dist27/gae_override/__init__.py +google/appengine/dist27/gae_override/httplib.py +google/appengine/dist27/python_std_lib/__init__.py +google/appengine/dist27/python_std_lib/httplib.py +google/appengine/ext/__init__.py +google/appengine/ext/admin/__init__.py +google/appengine/ext/admin/templates/backend.html +google/appengine/ext/admin/templates/backends.html +google/appengine/ext/admin/templates/base.html +google/appengine/ext/admin/templates/cron.html +google/appengine/ext/admin/templates/datastore.html +google/appengine/ext/admin/templates/datastore_admin_frame.html +google/appengine/ext/admin/templates/datastore_edit.html +google/appengine/ext/admin/templates/datastore_indexes.html +google/appengine/ext/admin/templates/datastore_stats.html +google/appengine/ext/admin/templates/inboundmail.html +google/appengine/ext/admin/templates/interactive-output.html +google/appengine/ext/admin/templates/interactive.html +google/appengine/ext/admin/templates/memcache.html +google/appengine/ext/admin/templates/pager.html +google/appengine/ext/admin/templates/queues.html +google/appengine/ext/admin/templates/search.html +google/appengine/ext/admin/templates/search_document.html +google/appengine/ext/admin/templates/search_index.html +google/appengine/ext/admin/templates/tasks.html +google/appengine/ext/admin/templates/xmpp.html +google/appengine/ext/admin/templates/css/ae.css +google/appengine/ext/admin/templates/css/base.css +google/appengine/ext/admin/templates/css/cron.css +google/appengine/ext/admin/templates/css/datastore.css +google/appengine/ext/admin/templates/css/datastore_indexes.css +google/appengine/ext/admin/templates/css/form.css +google/appengine/ext/admin/templates/css/inboundmail.css +google/appengine/ext/admin/templates/css/memcache.css +google/appengine/ext/admin/templates/css/nav.css +google/appengine/ext/admin/templates/css/pager.css +google/appengine/ext/admin/templates/css/queues.css +google/appengine/ext/admin/templates/css/tasks.css +google/appengine/ext/admin/templates/css/xmpp.css +google/appengine/ext/admin/templates/images/google.gif +google/appengine/ext/admin/templates/js/multipart_form_data.js +google/appengine/ext/admin/templates/js/rfc822_date.js +google/appengine/ext/admin/templates/js/webhook.js +google/appengine/ext/admin_redirect/__init__.py +google/appengine/ext/admin_redirect/main.py +google/appengine/ext/analytics/__init__.py +google/appengine/ext/analytics/app.yaml +google/appengine/ext/analytics/entity.py +google/appengine/ext/analytics/main.py +google/appengine/ext/analytics/process.py +google/appengine/ext/analytics/standaloneapp.py +google/appengine/ext/analytics/stats.py +google/appengine/ext/analytics/static/analytics_css.css +google/appengine/ext/analytics/static/analytics_js.js +google/appengine/ext/analytics/static/pix.gif +google/appengine/ext/analytics/templates/drill.html +google/appengine/ext/analytics/templates/error.html +google/appengine/ext/analytics/templates/main.html +google/appengine/ext/analytics/templates/showPklFiles.html +google/appengine/ext/appstats/__init__.py +google/appengine/ext/appstats/datamodel_pb.py +google/appengine/ext/appstats/formatting.py +google/appengine/ext/appstats/loader.py +google/appengine/ext/appstats/recording.py +google/appengine/ext/appstats/sample_appengine_config.py +google/appengine/ext/appstats/ui.py +google/appengine/ext/appstats/static/app_engine_logo_sm.gif +google/appengine/ext/appstats/static/appstats_css.css +google/appengine/ext/appstats/static/appstats_js.js +google/appengine/ext/appstats/static/gantt.js +google/appengine/ext/appstats/static/minus.gif +google/appengine/ext/appstats/static/pix.gif +google/appengine/ext/appstats/static/plus.gif +google/appengine/ext/appstats/templates/base.html +google/appengine/ext/appstats/templates/details.html +google/appengine/ext/appstats/templates/file.html +google/appengine/ext/appstats/templates/main.html +google/appengine/ext/appstats/templates/test.html +google/appengine/ext/blobstore/__init__.py +google/appengine/ext/blobstore/blobstore.py +google/appengine/ext/builtins/__init__.py +google/appengine/ext/builtins/admin_redirect/include-python27.yaml +google/appengine/ext/builtins/admin_redirect/include.yaml +google/appengine/ext/builtins/appstats/include-python27.yaml +google/appengine/ext/builtins/appstats/include.yaml +google/appengine/ext/builtins/datastore_admin/include-python27.yaml +google/appengine/ext/builtins/datastore_admin/include.yaml +google/appengine/ext/builtins/default/include-python27.yaml +google/appengine/ext/builtins/default/include.yaml +google/appengine/ext/builtins/deferred/include-python27.yaml +google/appengine/ext/builtins/deferred/include.yaml +google/appengine/ext/builtins/django_wsgi/include-python27.yaml +google/appengine/ext/builtins/django_wsgi/include.yaml +google/appengine/ext/builtins/mapreduce/include-python27.yaml +google/appengine/ext/builtins/mapreduce/include.yaml +google/appengine/ext/builtins/remote_api/include-python27.yaml +google/appengine/ext/builtins/remote_api/include.yaml +google/appengine/ext/bulkload/__init__.py +google/appengine/ext/bulkload/bulkload_deprecated.py +google/appengine/ext/bulkload/bulkloader_config.py +google/appengine/ext/bulkload/bulkloader_errors.py +google/appengine/ext/bulkload/bulkloader_parser.py +google/appengine/ext/bulkload/bulkloader_wizard.py +google/appengine/ext/bulkload/bulkloader_wizard.yaml +google/appengine/ext/bulkload/connector_interface.py +google/appengine/ext/bulkload/constants.py +google/appengine/ext/bulkload/csv_connector.py +google/appengine/ext/bulkload/simpletext_connector.py +google/appengine/ext/bulkload/simplexml_connector.py +google/appengine/ext/bulkload/transform.py +google/appengine/ext/cloudstorage/__init__.py +google/appengine/ext/cloudstorage/cloudstorage_stub.py +google/appengine/ext/cloudstorage/common.py +google/appengine/ext/cloudstorage/stub_dispatcher.py +google/appengine/ext/datastore_admin/__init__.py +google/appengine/ext/datastore_admin/backup_handler.py +google/appengine/ext/datastore_admin/backup_pb2.py +google/appengine/ext/datastore_admin/config.py +google/appengine/ext/datastore_admin/copy_handler.py +google/appengine/ext/datastore_admin/delete_handler.py +google/appengine/ext/datastore_admin/main.py +google/appengine/ext/datastore_admin/remote_api_put_stub.py +google/appengine/ext/datastore_admin/utils.py +google/appengine/ext/datastore_admin/static/css/compiled.css +google/appengine/ext/datastore_admin/static/img/help.gif +google/appengine/ext/datastore_admin/static/img/tip.png +google/appengine/ext/datastore_admin/static/img/icn/icn-warning.gif +google/appengine/ext/datastore_admin/static/js/compiled.js +google/appengine/ext/datastore_admin/templates/backup_information.html +google/appengine/ext/datastore_admin/templates/base.html +google/appengine/ext/datastore_admin/templates/confirm_abort_backup.html +google/appengine/ext/datastore_admin/templates/confirm_backup.html +google/appengine/ext/datastore_admin/templates/confirm_backup_import.html +google/appengine/ext/datastore_admin/templates/confirm_copy.html +google/appengine/ext/datastore_admin/templates/confirm_delete.html +google/appengine/ext/datastore_admin/templates/confirm_delete_backup.html +google/appengine/ext/datastore_admin/templates/confirm_restore_from_backup.html +google/appengine/ext/datastore_admin/templates/do_backup.html +google/appengine/ext/datastore_admin/templates/do_copy.html +google/appengine/ext/datastore_admin/templates/do_delete.html +google/appengine/ext/datastore_admin/templates/do_restore_from_backup.html +google/appengine/ext/datastore_admin/templates/list_actions.html +google/appengine/ext/db/__init__.py +google/appengine/ext/db/djangoforms.py +google/appengine/ext/db/metadata.py +google/appengine/ext/db/polymodel.py +google/appengine/ext/db/stats.py +google/appengine/ext/deferred/__init__.py +google/appengine/ext/deferred/deferred.py +google/appengine/ext/deferred/handler.py +google/appengine/ext/django/__init__.py +google/appengine/ext/django/main.py +google/appengine/ext/django/backends/__init__.py +google/appengine/ext/django/backends/rdbms/__init__.py +google/appengine/ext/django/backends/rdbms/base.py +google/appengine/ext/django/management/__init__.py +google/appengine/ext/django/management/commands/__init__.py +google/appengine/ext/django/management/commands/getoauthtoken.py +google/appengine/ext/endpoints/__init__.py +google/appengine/ext/ereporter/__init__.py +google/appengine/ext/ereporter/ereporter.py +google/appengine/ext/ereporter/report_generator.py +google/appengine/ext/ereporter/templates/report.html +google/appengine/ext/gql/__init__.py +google/appengine/ext/key_range/__init__.py +google/appengine/ext/mapreduce/__init__.py +google/appengine/ext/mapreduce/base_handler.py +google/appengine/ext/mapreduce/context.py +google/appengine/ext/mapreduce/control.py +google/appengine/ext/mapreduce/datastore_range_iterators.py +google/appengine/ext/mapreduce/errors.py +google/appengine/ext/mapreduce/file_format_parser.py +google/appengine/ext/mapreduce/file_format_root.py +google/appengine/ext/mapreduce/file_formats.py +google/appengine/ext/mapreduce/handlers.py +google/appengine/ext/mapreduce/hooks.py +google/appengine/ext/mapreduce/input_readers.py +google/appengine/ext/mapreduce/json_util.py +google/appengine/ext/mapreduce/key_ranges.py +google/appengine/ext/mapreduce/main.py +google/appengine/ext/mapreduce/map_job_context.py +google/appengine/ext/mapreduce/mapper_pipeline.py +google/appengine/ext/mapreduce/mapreduce_pipeline.py +google/appengine/ext/mapreduce/model.py +google/appengine/ext/mapreduce/namespace_range.py +google/appengine/ext/mapreduce/output_writers.py +google/appengine/ext/mapreduce/parameters.py +google/appengine/ext/mapreduce/pipeline_base.py +google/appengine/ext/mapreduce/property_range.py +google/appengine/ext/mapreduce/records.py +google/appengine/ext/mapreduce/shard_life_cycle.py +google/appengine/ext/mapreduce/shuffler.py +google/appengine/ext/mapreduce/status.py +google/appengine/ext/mapreduce/test_support.py +google/appengine/ext/mapreduce/util.py +google/appengine/ext/mapreduce/api/__init__.py +google/appengine/ext/mapreduce/api/map_job/__init__.py +google/appengine/ext/mapreduce/api/map_job/abstract_datastore_input_reader.py +google/appengine/ext/mapreduce/api/map_job/datastore_input_reader.py +google/appengine/ext/mapreduce/api/map_job/input_reader.py +google/appengine/ext/mapreduce/api/map_job/map_job_config.py +google/appengine/ext/mapreduce/api/map_job/map_job_control.py +google/appengine/ext/mapreduce/api/map_job/mapper.py +google/appengine/ext/mapreduce/api/map_job/model_datastore_input_reader.py +google/appengine/ext/mapreduce/api/map_job/output_writer.py +google/appengine/ext/mapreduce/api/map_job/sample_input_reader.py +google/appengine/ext/mapreduce/lib/__init__.py +google/appengine/ext/mapreduce/lib/input_reader/__init__.py +google/appengine/ext/mapreduce/lib/input_reader/_gcs.py +google/appengine/ext/mapreduce/operation/__init__.py +google/appengine/ext/mapreduce/operation/base.py +google/appengine/ext/mapreduce/operation/counters.py +google/appengine/ext/mapreduce/operation/db.py +google/appengine/ext/mapreduce/static/base.css +google/appengine/ext/mapreduce/static/detail.html +google/appengine/ext/mapreduce/static/jquery-1.6.1.min.js +google/appengine/ext/mapreduce/static/jquery.json-2.2.min.js +google/appengine/ext/mapreduce/static/jquery.url.js +google/appengine/ext/mapreduce/static/overview.html +google/appengine/ext/mapreduce/static/status.js +google/appengine/ext/mapreduce/tools/__init__.py +google/appengine/ext/mapreduce/tools/gcs_file_seg_reader.py +google/appengine/ext/ndb/__init__.py +google/appengine/ext/ndb/blobstore.py +google/appengine/ext/ndb/context.py +google/appengine/ext/ndb/django_middleware.py +google/appengine/ext/ndb/eventloop.py +google/appengine/ext/ndb/google_imports.py +google/appengine/ext/ndb/key.py +google/appengine/ext/ndb/metadata.py +google/appengine/ext/ndb/model.py +google/appengine/ext/ndb/msgprop.py +google/appengine/ext/ndb/polymodel.py +google/appengine/ext/ndb/prospective_search.py +google/appengine/ext/ndb/query.py +google/appengine/ext/ndb/stats.py +google/appengine/ext/ndb/tasklets.py +google/appengine/ext/ndb/utils.py +google/appengine/ext/preload/__init__.py +google/appengine/ext/remote_api/__init__.py +google/appengine/ext/remote_api/handler.py +google/appengine/ext/remote_api/remote_api_pb.py +google/appengine/ext/remote_api/remote_api_services.py +google/appengine/ext/remote_api/remote_api_stub.py +google/appengine/ext/remote_api/throttle.py +google/appengine/ext/search/__init__.py +google/appengine/ext/testbed/__init__.py +google/appengine/ext/vendor/__init__.py +google/appengine/ext/webapp/__init__.py +google/appengine/ext/webapp/_template.py +google/appengine/ext/webapp/_webapp25.py +google/appengine/ext/webapp/blobstore_handlers.py +google/appengine/ext/webapp/mail_handlers.py +google/appengine/ext/webapp/mock_webapp.py +google/appengine/ext/webapp/template.py +google/appengine/ext/webapp/util.py +google/appengine/ext/webapp/xmpp_handlers.py +google/appengine/ext/zipserve/__init__.py +google/appengine/runtime/__init__.py +google/appengine/runtime/apiproxy.py +google/appengine/runtime/apiproxy_errors.py +google/appengine/runtime/background.py +google/appengine/runtime/cgi.py +google/appengine/runtime/features.py +google/appengine/runtime/request_environment.py +google/appengine/runtime/runtime.py +google/appengine/runtime/shutdown.py +google/appengine/runtime/wsgi.py +google/appengine/tools/__init__.py +google/appengine/tools/adaptive_thread_pool.py +google/appengine/tools/api_server.py +google/appengine/tools/app_engine_config_exception.py +google/appengine/tools/app_engine_web_xml_parser.py +google/appengine/tools/appcfg.py +google/appengine/tools/appcfg_java.py +google/appengine/tools/appengine_rpc.py +google/appengine/tools/appengine_rpc_httplib2.py +google/appengine/tools/augment_mimetypes.py +google/appengine/tools/backends_conversion.py +google/appengine/tools/backends_xml_parser.py +google/appengine/tools/boolean_action.py +google/appengine/tools/bulkload_client.py +google/appengine/tools/bulkloader.py +google/appengine/tools/cron_xml_parser.py +google/appengine/tools/dev-channel-js.js +google/appengine/tools/dev_appserver.py +google/appengine/tools/dev_appserver_apiserver.py +google/appengine/tools/dev_appserver_blobimage.py +google/appengine/tools/dev_appserver_blobstore.py +google/appengine/tools/dev_appserver_channel.py +google/appengine/tools/dev_appserver_import_hook.py +google/appengine/tools/dev_appserver_index.py +google/appengine/tools/dev_appserver_login.py +google/appengine/tools/dev_appserver_main.py +google/appengine/tools/dev_appserver_multiprocess.py +google/appengine/tools/dev_appserver_oauth.py +google/appengine/tools/dev_appserver_upload.py +google/appengine/tools/dispatch_xml_parser.py +google/appengine/tools/dos_xml_parser.py +google/appengine/tools/download_appstats.py +google/appengine/tools/endpointscfg.py +google/appengine/tools/gen_protorpc.py +google/appengine/tools/handler.py +google/appengine/tools/handler_generator.py +google/appengine/tools/jarfile.py +google/appengine/tools/java_quickstart.py +google/appengine/tools/java_utils.py +google/appengine/tools/os_compat.py +google/appengine/tools/php_cli.py +google/appengine/tools/queue_xml_parser.py +google/appengine/tools/remote_api_shell.py +google/appengine/tools/requeue.py +google/appengine/tools/sdk_update_checker.py +google/appengine/tools/value_mixin.py +google/appengine/tools/web_xml_parser.py +google/appengine/tools/xml_parser_utils.py +google/appengine/tools/yaml_translator.py +google/appengine/tools/devappserver2/__init__.py +google/appengine/tools/devappserver2/api_server.py +google/appengine/tools/devappserver2/api_server_test.py +google/appengine/tools/devappserver2/application_configuration.py +google/appengine/tools/devappserver2/application_configuration_test.py +google/appengine/tools/devappserver2/blob_download.py +google/appengine/tools/devappserver2/blob_download_test.py +google/appengine/tools/devappserver2/blob_image.py +google/appengine/tools/devappserver2/blob_image_test.py +google/appengine/tools/devappserver2/blob_upload.py +google/appengine/tools/devappserver2/blob_upload_test.py +google/appengine/tools/devappserver2/channel.py +google/appengine/tools/devappserver2/channel_test.py +google/appengine/tools/devappserver2/constants.py +google/appengine/tools/devappserver2/devappserver2.py +google/appengine/tools/devappserver2/devappserver2_test.py +google/appengine/tools/devappserver2/dispatcher.py +google/appengine/tools/devappserver2/dispatcher_test.py +google/appengine/tools/devappserver2/environ_utils.py +google/appengine/tools/devappserver2/environ_utils_test.py +google/appengine/tools/devappserver2/errors.py +google/appengine/tools/devappserver2/file_watcher.py +google/appengine/tools/devappserver2/gcd_application.py +google/appengine/tools/devappserver2/gcs_application.py +google/appengine/tools/devappserver2/gcs_application_test.py +google/appengine/tools/devappserver2/gcs_server.py +google/appengine/tools/devappserver2/gcs_server_test.py +google/appengine/tools/devappserver2/go_application.py +google/appengine/tools/devappserver2/go_runtime.py +google/appengine/tools/devappserver2/health_check_service.py +google/appengine/tools/devappserver2/http_proxy.py +google/appengine/tools/devappserver2/http_proxy_test.py +google/appengine/tools/devappserver2/http_runtime.py +google/appengine/tools/devappserver2/http_runtime_constants.py +google/appengine/tools/devappserver2/http_runtime_test.py +google/appengine/tools/devappserver2/http_utils.py +google/appengine/tools/devappserver2/inotify_file_watcher.py +google/appengine/tools/devappserver2/inotify_file_watcher_test.py +google/appengine/tools/devappserver2/instance.py +google/appengine/tools/devappserver2/instance_test.py +google/appengine/tools/devappserver2/java_application.py +google/appengine/tools/devappserver2/java_runtime.py +google/appengine/tools/devappserver2/log_manager.py +google/appengine/tools/devappserver2/login.py +google/appengine/tools/devappserver2/login_test.py +google/appengine/tools/devappserver2/module.py +google/appengine/tools/devappserver2/module_test.py +google/appengine/tools/devappserver2/mtime_file_watcher.py +google/appengine/tools/devappserver2/mtime_file_watcher_test.py +google/appengine/tools/devappserver2/php_runtime.py +google/appengine/tools/devappserver2/python_runtime.py +google/appengine/tools/devappserver2/request_rewriter.py +google/appengine/tools/devappserver2/request_rewriter_test.py +google/appengine/tools/devappserver2/runtime_config_pb2.py +google/appengine/tools/devappserver2/safe_subprocess.py +google/appengine/tools/devappserver2/scheduled_executor.py +google/appengine/tools/devappserver2/scheduled_executor_test.py +google/appengine/tools/devappserver2/shutdown.py +google/appengine/tools/devappserver2/shutdown_test.py +google/appengine/tools/devappserver2/start_response_utils.py +google/appengine/tools/devappserver2/start_response_utils_test.py +google/appengine/tools/devappserver2/static_files_handler.py +google/appengine/tools/devappserver2/static_files_handler_test.py +google/appengine/tools/devappserver2/tee.py +google/appengine/tools/devappserver2/tee_test.py +google/appengine/tools/devappserver2/thread_executor.py +google/appengine/tools/devappserver2/thread_executor_test.py +google/appengine/tools/devappserver2/update_checker.py +google/appengine/tools/devappserver2/update_checker_test.py +google/appengine/tools/devappserver2/url_handler.py +google/appengine/tools/devappserver2/url_handler_test.py +google/appengine/tools/devappserver2/util.py +google/appengine/tools/devappserver2/util_test.py +google/appengine/tools/devappserver2/vm_runtime_factory.py +google/appengine/tools/devappserver2/vm_runtime_proxy.py +google/appengine/tools/devappserver2/vm_runtime_proxy_dart.py +google/appengine/tools/devappserver2/vm_runtime_proxy_go.py +google/appengine/tools/devappserver2/watcher_common.py +google/appengine/tools/devappserver2/win32_file_watcher.py +google/appengine/tools/devappserver2/win32_file_watcher_test.py +google/appengine/tools/devappserver2/wsgi_handler.py +google/appengine/tools/devappserver2/wsgi_request_info.py +google/appengine/tools/devappserver2/wsgi_request_info_test.py +google/appengine/tools/devappserver2/wsgi_server.py +google/appengine/tools/devappserver2/wsgi_server_test.py +google/appengine/tools/devappserver2/wsgi_test_utils.py +google/appengine/tools/devappserver2/admin/__init__.py +google/appengine/tools/devappserver2/admin/admin_request_handler.py +google/appengine/tools/devappserver2/admin/admin_request_handler_test.py +google/appengine/tools/devappserver2/admin/admin_server.py +google/appengine/tools/devappserver2/admin/blobstore_viewer.py +google/appengine/tools/devappserver2/admin/blobstore_viewer_test.py +google/appengine/tools/devappserver2/admin/console.py +google/appengine/tools/devappserver2/admin/console_test.py +google/appengine/tools/devappserver2/admin/cron_handler.py +google/appengine/tools/devappserver2/admin/cron_handler_test.py +google/appengine/tools/devappserver2/admin/datastore_indexes_viewer.py +google/appengine/tools/devappserver2/admin/datastore_stats_handler.py +google/appengine/tools/devappserver2/admin/datastore_viewer.py +google/appengine/tools/devappserver2/admin/datastore_viewer_test.py +google/appengine/tools/devappserver2/admin/logs_handler.py +google/appengine/tools/devappserver2/admin/mail_request_handler.py +google/appengine/tools/devappserver2/admin/mail_request_handler_test.py +google/appengine/tools/devappserver2/admin/memcache_viewer.py +google/appengine/tools/devappserver2/admin/modules_handler.py +google/appengine/tools/devappserver2/admin/quit_handler.py +google/appengine/tools/devappserver2/admin/search_handler.py +google/appengine/tools/devappserver2/admin/static_file_handler.py +google/appengine/tools/devappserver2/admin/taskqueue_queues_handler.py +google/appengine/tools/devappserver2/admin/taskqueue_queues_handler_test.py +google/appengine/tools/devappserver2/admin/taskqueue_tasks_handler.py +google/appengine/tools/devappserver2/admin/taskqueue_utils.py +google/appengine/tools/devappserver2/admin/taskqueue_utils_test.py +google/appengine/tools/devappserver2/admin/xmpp_request_handler.py +google/appengine/tools/devappserver2/admin/xmpp_request_handler_test.py +google/appengine/tools/devappserver2/admin/assets/check_no_box.png +google/appengine/tools/devappserver2/admin/assets/common.css +google/appengine/tools/devappserver2/admin/assets/google_logo_41.png +google/appengine/tools/devappserver2/admin/assets/jquery-1.8.2.min.js +google/appengine/tools/devappserver2/admin/templates/blob_viewer.html +google/appengine/tools/devappserver2/admin/templates/blobstore_viewer.css +google/appengine/tools/devappserver2/admin/templates/blobstore_viewer.html +google/appengine/tools/devappserver2/admin/templates/blobstore_viewer.js +google/appengine/tools/devappserver2/admin/templates/console.css +google/appengine/tools/devappserver2/admin/templates/console.html +google/appengine/tools/devappserver2/admin/templates/console.js +google/appengine/tools/devappserver2/admin/templates/cron.css +google/appengine/tools/devappserver2/admin/templates/cron.html +google/appengine/tools/devappserver2/admin/templates/datastore_edit.html +google/appengine/tools/devappserver2/admin/templates/datastore_edit.js +google/appengine/tools/devappserver2/admin/templates/datastore_indexes_viewer.css +google/appengine/tools/devappserver2/admin/templates/datastore_indexes_viewer.html +google/appengine/tools/devappserver2/admin/templates/datastore_stats.css +google/appengine/tools/devappserver2/admin/templates/datastore_stats.html +google/appengine/tools/devappserver2/admin/templates/datastore_viewer.css +google/appengine/tools/devappserver2/admin/templates/datastore_viewer.html +google/appengine/tools/devappserver2/admin/templates/datastore_viewer.js +google/appengine/tools/devappserver2/admin/templates/instance_logs.css +google/appengine/tools/devappserver2/admin/templates/instance_logs.html +google/appengine/tools/devappserver2/admin/templates/mail.css +google/appengine/tools/devappserver2/admin/templates/mail.html +google/appengine/tools/devappserver2/admin/templates/memcache_viewer.css +google/appengine/tools/devappserver2/admin/templates/memcache_viewer.html +google/appengine/tools/devappserver2/admin/templates/modules.css +google/appengine/tools/devappserver2/admin/templates/modules.html +google/appengine/tools/devappserver2/admin/templates/search.css +google/appengine/tools/devappserver2/admin/templates/search.html +google/appengine/tools/devappserver2/admin/templates/search_document.html +google/appengine/tools/devappserver2/admin/templates/search_index.html +google/appengine/tools/devappserver2/admin/templates/search_index.js +google/appengine/tools/devappserver2/admin/templates/skeleton.html +google/appengine/tools/devappserver2/admin/templates/taskqueue_queues.html +google/appengine/tools/devappserver2/admin/templates/taskqueue_tasks.html +google/appengine/tools/devappserver2/admin/templates/xmpp.css +google/appengine/tools/devappserver2/admin/templates/xmpp.html +google/appengine/tools/devappserver2/endpoints/__init__.py +google/appengine/tools/devappserver2/endpoints/api_config_manager.py +google/appengine/tools/devappserver2/endpoints/api_config_manager_test.py +google/appengine/tools/devappserver2/endpoints/api_request.py +google/appengine/tools/devappserver2/endpoints/api_request_test.py +google/appengine/tools/devappserver2/endpoints/discovery_api_proxy.py +google/appengine/tools/devappserver2/endpoints/discovery_api_proxy_test.py +google/appengine/tools/devappserver2/endpoints/discovery_service.py +google/appengine/tools/devappserver2/endpoints/discovery_service_test.py +google/appengine/tools/devappserver2/endpoints/endpoints_server.py +google/appengine/tools/devappserver2/endpoints/endpoints_server_regtest.py +google/appengine/tools/devappserver2/endpoints/endpoints_server_test.py +google/appengine/tools/devappserver2/endpoints/errors.py +google/appengine/tools/devappserver2/endpoints/generated_error_info.py +google/appengine/tools/devappserver2/endpoints/parameter_converter.py +google/appengine/tools/devappserver2/endpoints/test_utils.py +google/appengine/tools/devappserver2/endpoints/util.py +google/appengine/tools/devappserver2/endpoints/util_test.py +google/appengine/tools/devappserver2/endpoints/testdata/app.yaml +google/appengine/tools/devappserver2/endpoints/testdata/test_service.py +google/appengine/tools/devappserver2/endpoints/testdata/tictactoe-v1.api +google/appengine/tools/devappserver2/php/__init__.py +google/appengine/tools/devappserver2/php/check_environment.php +google/appengine/tools/devappserver2/php/runtime.py +google/appengine/tools/devappserver2/php/setup.php +google/appengine/tools/devappserver2/python/__init__.py +google/appengine/tools/devappserver2/python/pdb_sandbox.py +google/appengine/tools/devappserver2/python/request_handler.py +google/appengine/tools/devappserver2/python/request_state.py +google/appengine/tools/devappserver2/python/request_state_test.py +google/appengine/tools/devappserver2/python/runtime.py +google/appengine/tools/devappserver2/python/runtime_test.py +google/appengine/tools/devappserver2/python/sandbox.py +google/appengine/tools/devappserver2/python/sandbox_test.py +google/appengine/tools/devappserver2/python/stubs.py +google/appengine/tools/devappserver2/python/stubs_test.py +google/appengine/tools/docker/__init__.py +google/appengine/tools/docker/containers.py +google/net/__init__.py +google/net/proto/ProtocolBuffer.py +google/net/proto/RawMessage.py +google/net/proto/__init__.py +google/net/proto/message_set.py +google/net/proto2/__init__.py +google/net/proto2/proto/__init__.py +google/net/proto2/proto/descriptor_pb2.py +google/net/proto2/python/__init__.py +google/net/proto2/python/internal/__init__.py +google/net/proto2/python/internal/api_implementation.py +google/net/proto2/python/internal/containers.py +google/net/proto2/python/internal/decoder.py +google/net/proto2/python/internal/encoder.py +google/net/proto2/python/internal/enum_type_wrapper.py +google/net/proto2/python/internal/message_listener.py +google/net/proto2/python/internal/python_message.py +google/net/proto2/python/internal/type_checkers.py +google/net/proto2/python/internal/wire_format.py +google/net/proto2/python/public/__init__.py +google/net/proto2/python/public/basic_descriptor_pool.py +google/net/proto2/python/public/descriptor.py +google/net/proto2/python/public/descriptor_database.py +google/net/proto2/python/public/descriptor_pool.py +google/net/proto2/python/public/message.py +google/net/proto2/python/public/reflection.py +google/net/proto2/python/public/service.py +google/net/proto2/python/public/service_reflection.py +google/net/proto2/python/public/symbol_database.py +google/net/proto2/python/public/text_encoding.py +google/net/proto2/python/public/text_format.py +google/pyglib/__init__.py +google/pyglib/gexcept.py +google/pyglib/singleton.py +google/storage/__init__.py +google/storage/speckle/__init__.py +google/storage/speckle/proto/__init__.py +google/storage/speckle/proto/client_error_code_pb2.py +google/storage/speckle/proto/client_pb2.py +google/storage/speckle/proto/jdbc_type.py +google/storage/speckle/proto/sql_pb2.py +google/storage/speckle/python/__init__.py +google/storage/speckle/python/api/__init__.py +google/storage/speckle/python/api/converters.py +google/storage/speckle/python/api/rdbms.py +google/storage/speckle/python/api/rdbms_apiproxy.py +google/storage/speckle/python/api/rdbms_googleapi.py +google/storage/speckle/python/api/constants/CLIENT.py +google/storage/speckle/python/api/constants/FIELD_TYPE.py +google/storage/speckle/python/api/constants/FLAG.py +google/storage/speckle/python/api/constants/__init__.py +google/storage/speckle/python/django/__init__.py +google/storage/speckle/python/django/backend/__init__.py +google/storage/speckle/python/django/backend/base.py +google/storage/speckle/python/django/backend/client.py +google/storage/speckle/python/django/backend/oauth2storage.py +google/storage/speckle/python/django/management/__init__.py +google/storage/speckle/python/django/management/commands/__init__.py +google/storage/speckle/python/django/management/commands/getoauthtoken.py +google/storage/speckle/python/tool/__init__.py +google/storage/speckle/python/tool/google_sql.py diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 00000000..2d78c0b7 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +recursive-include google * +include * +global-exclude *.pyc diff --git a/RELEASE_NOTES b/RELEASE_NOTES index b4a2ec48..1d79dff1 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -3,30 +3,6 @@ All rights reserved. App Engine SDK - Release Notes -Version 1.9.17 - -Managed VMs -============================== -- Managed VMs are now available as an open Beta feature of App Engine. -- User-defined health checks on App Engine Managed VMs no longer - require an 'ok' message body; any status 200 response is considered - healthy. - -Python -================================== -- The old development appserver (old_dev_appserver.py) has been removed - from the SDK. However, old SDKs that contain old_dev_appserver.py - will continue to be available. - -PHP -================================== -- Fixed the issue which prevented the ability to fseek a GCS file - beyond 524287 (=0x7FFFF). - https://code.google.com/p/googleappengine/issues/detail?id=10881 -- Fixed the issue causing a value of "valid metadata with spaces" to - fail validation. - https://code.google.com/p/googleappengine/issues/detail?id=11443 - Version 1.9.15 All diff --git a/VERSION b/VERSION index 120a1872..4abc0b67 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ -release: "1.9.17" -timestamp: 1415734244 +release: "1.9.15" +timestamp: 1413915397 api_versions: ['1'] supported_api_versions: python: diff --git a/google/appengine/api/app_logging.py b/google/appengine/api/app_logging.py index 8fbe238a..d591da8a 100644 --- a/google/appengine/api/app_logging.py +++ b/google/appengine/api/app_logging.py @@ -31,11 +31,13 @@ + + + import logging from google.appengine import runtime from google.appengine.api import logservice -from google.appengine.runtime import features @@ -69,17 +71,12 @@ def emit(self, record): This implementation is based on the implementation of StreamHandler.emit().""" try: - if features.IsEnabled("LogServiceWriteRecord"): - logservice.write_record(self._AppLogsLevel(record.levelno), - record.created, - self.format(record)) - else: - message = self._AppLogsMessage(record) - if isinstance(message, unicode): - message = message.encode("UTF-8") + message = self._AppLogsMessage(record) + if isinstance(message, unicode): + message = message.encode("UTF-8") - logservice.write(message) + logservice.write(message) except (KeyboardInterrupt, SystemExit, runtime.DeadlineExceededError): raise except: diff --git a/google/appengine/api/appinfo.py b/google/appengine/api/appinfo.py index 2e8e8b4b..b531c3be 100644 --- a/google/appengine/api/appinfo.py +++ b/google/appengine/api/appinfo.py @@ -320,7 +320,6 @@ CPU = 'cpu' MEMORY_GB = 'memory_gb' -DISK_SIZE_GB = 'disk_size_gb' FORWARDED_PORTS = 'forwarded_ports' @@ -531,55 +530,6 @@ def non_deprecated_versions(self): _MAX_URL_LENGTH = 2047 - - - -_CANNED_RUNTIMES = ('contrib-dart', 'dart', 'go', 'php', 'python', 'python27', - 'java', 'java7', 'vm', 'custom') -_all_runtimes = _CANNED_RUNTIMES -_vm_runtimes = _CANNED_RUNTIMES - - -def GetAllRuntimes(): - """Returns the list of all valid runtimes. - - This can include third-party runtimes as well as canned runtimes. - - Returns: - Tuple of strings. - """ - return _all_runtimes - - -def SetAllRuntimes(runtimes): - """Sets the list of all valid runtimes. - - Args: - runtimes: Tuple of strings defining the names of all valid runtimes. - """ - global _all_runtimes - _all_runtimes = runtimes - - -def GetVmRuntimes(): - """Returns the list of runtimes for the vm_runtimes field. - - Returns: - Tuple of strings. - """ - return _vm_runtimes - - -def SetVmRuntimes(runtimes): - """Sets the list of all runtimes valid for the vm_runtimes field. - - Args: - runtimes: Tuple of strings defining all valid vm runtimes. - """ - global _vm_runtimes - _vm_runtimes = runtimes - - class HandlerBase(validation.Validated): """Base class for URLMap and ApiConfigHandler.""" ATTRIBUTES = { @@ -1474,10 +1424,6 @@ def VmSafeSetRuntime(appyaml, runtime): appyaml.vm_settings['has_docker_image'] = True - elif runtime not in GetVmRuntimes(): - runtime = 'custom' - - appyaml.vm_settings['vm_runtime'] = runtime appyaml.runtime = 'vm' @@ -1549,10 +1495,13 @@ class HealthCheck(VmHealthCheck): class Resources(validation.Validated): """Class representing the configuration of VM resources.""" + + + + ATTRIBUTES = { - CPU: validation.Optional(validation.TYPE_FLOAT), - MEMORY_GB: validation.Optional(validation.TYPE_FLOAT), - DISK_SIZE_GB: validation.Optional(validation.TYPE_INT) + CPU: validation.Optional(validation.TYPE_FLOAT, default=.5), + MEMORY_GB: validation.Optional(validation.TYPE_FLOAT, default=1.3) } @@ -1816,6 +1765,11 @@ class AppInfoExternal(validation.Validated): } + + + + _skip_runtime_checks = False + def CheckInitialized(self): """Performs non-regex-based validation. @@ -1852,17 +1806,9 @@ def CheckInitialized(self): 'Found more than %d URLMap entries in application configuration' % MAX_URL_MAPS) - vm_runtime_python27 = ( - self.runtime == 'vm' and - (hasattr(self, 'vm_settings') and - self.vm_settings and - self.vm_settings.get('vm_runtime') == 'python27') or - (hasattr(self, 'beta_settings') and - self.beta_settings and - self.beta_settings.get('vm_runtime') == 'python27')) - if (self.threadsafe is None and - (self.runtime == 'python27' or vm_runtime_python27)): + self.runtime == 'python27' and + not self._skip_runtime_checks): raise appinfo_errors.MissingThreadsafe( 'threadsafe must be present and set to either "yes" or "no"') @@ -1881,7 +1827,16 @@ def CheckInitialized(self): + datastore_auto_ids_url + '\n' + appcfg_auto_ids_url + '\n') if self.libraries: - if not (vm_runtime_python27 or self.runtime == 'python27'): + vm_runtime_python27 = ( + self.runtime == 'vm' and + (hasattr(self, 'vm_settings') and + self.vm_settings and + self.vm_settings['vm_runtime'] == 'python27') or + (hasattr(self, 'beta_settings') and + self.beta_settings and + self.beta_settings['vm_runtime'] == 'python27')) + if not self._skip_runtime_checks and not ( + vm_runtime_python27 or self.runtime == 'python27'): raise appinfo_errors.RuntimeDoesNotSupportLibraries( 'libraries entries are only supported by the "python27" runtime') @@ -1907,9 +1862,9 @@ def CheckInitialized(self): raise appinfo_errors.MissingApiConfig( 'An api_endpoint handler was specified, but the required ' 'api_config stanza was not configured.') - if self.threadsafe and self.runtime == 'python27': - - + if (self.threadsafe and + self.runtime == 'python27' and + not self._skip_runtime_checks): for handler in self.handlers: if (handler.script and (handler.script.endswith('.py') or '/' in handler.script)): @@ -1923,6 +1878,7 @@ def CheckInitialized(self): "There may be only one of 'automatic_scaling', 'manual_scaling', " "or 'basic_scaling'.") + def GetAllLibraries(self): """Returns a list of all Library instances active for this configuration. diff --git a/google/appengine/api/logservice/logservice.py b/google/appengine/api/logservice/logservice.py index d904311b..5107b0d2 100644 --- a/google/appengine/api/logservice/logservice.py +++ b/google/appengine/api/logservice/logservice.py @@ -46,7 +46,6 @@ from google.appengine.api.logservice import logsutil from google.appengine.datastore import datastore_rpc from google.appengine.runtime import apiproxy_errors -from google.appengine.runtime import features AUTOFLUSH_ENABLED = True @@ -84,12 +83,6 @@ _REQUEST_ID_RE = re.compile(_REQUEST_ID_PATTERN) - - - -_NEWLINE_REPLACEMENT = '\0' - - class Error(Exception): """Base error class for this module.""" @@ -129,23 +122,33 @@ def last_end_time(self): return self.__last_end_time -class _LogsDequeBuffer(object): +class LogsBufferNew(object): """Threadsafe buffer for storing and periodically flushing app logs.""" - def __init__(self): - """Initializes the buffer. + def __init__(self, stream=None, stderr=False): + """Initializes the buffer, which wraps an internal buffer or sys.stderr. The state of the LogsBuffer is protected by a separate lock. The lock is acquired before any variables are mutated or accessed, and released afterward. A recursive lock is used so that a single thread can acquire the lock multiple times, and release it only when an identical number of 'unlock()' calls have been performed. + + Args: + stream: Unused. Left there for backward compatibility. + stderr: If specified, use sys.stderr as the underlying stream. + + Raises: + ValueError: if stream is provided. """ + if stream is not None: + raise ValueError('underlying streams are no longer supported') self._buffer = collections.deque() + self._stderr = stderr self._lock = threading.RLock() self._reset() @@ -163,6 +166,10 @@ def _truncate(line, max_length=_MAX_LINE_SIZE): def stream(self): """Returns the underlying file-like object used to buffer logs.""" + if self._stderr: + + + return sys.stderr return cStringIO.StringIO(self.contents()) @@ -232,12 +239,10 @@ def parse_logs(self): for line in self._buffer) return [logsutil.ParseLogEntry(line) for line in without_newlines if line] - def write(self, lines): + def write(self, line): """Writes a line to the logs buffer.""" with self._lock: - - for line in cStringIO.StringIO(lines): - self._write(line) + return self._write(line) def writelines(self, seq): """Writes each line in the given sequence to the logs buffer.""" @@ -266,7 +271,10 @@ def _write(self, line): self._reset() - self._put_line(line) + if self._stderr: + sys.stderr.write(line) + else: + self._put_line(line) self._autoflush() def flush(self): @@ -283,11 +291,15 @@ def flush(self): def _flush(self): """Internal version of flush() with no locking.""" + if self._stderr: + sys.stderr.flush() + return + lines_to_be_flushed = [] try: while True: group = log_service_pb.UserAppLogGroup() - bytes_left = self._MAX_FLUSH_SIZE + bytes_left = LogsBufferNew._MAX_FLUSH_SIZE while self._buffer: bare_line = self._get_line() @@ -301,7 +313,8 @@ def _flush(self): - message = self._truncate(message, self._MAX_LINE_SIZE) + message = LogsBufferNew._truncate( + message, LogsBufferNew._MAX_LINE_SIZE) if len(message) > bytes_left: @@ -331,9 +344,10 @@ def _flush(self): except Exception, e: lines_to_be_flushed.reverse() self._buffer.extendleft(lines_to_be_flushed) - line = '-' * 80 - msg = 'ERROR: Could not flush to log_service (%s)\n%s\n%s\n%s\n' - sys.stderr.write(msg % (e, line, '\n'.join(self._buffer), line)) + if not self._stderr: + line = '-' * 80 + msg = 'ERROR: Could not flush to log_service (%s)\n%s\n%s\n%s\n' + sys.stderr.write(msg % (str(e), line, '\n'.join(self._buffer), line)) self._clear() raise else: @@ -377,33 +391,6 @@ def write(message): logs_buffer().write(message) -def write_record(level, created, message): - """Add a 'record' to the logs buffer, and checks for autoflush. - - Arguments: - level: the logging level of the record. From 0 to 4 inclusive. - created: the time in seconds the record was created. - message: the formatted message. - """ - - - - - - message = message.replace('\r\n', _NEWLINE_REPLACEMENT) - message = message.replace('\r', _NEWLINE_REPLACEMENT) - message = message.replace('\n', _NEWLINE_REPLACEMENT) - if isinstance(message, unicode): - message = message.encode('UTF-8') - - - - - logs_buffer().write('LOG %d %d %s\n' % (level, - long(created * 1000 * 1000), - message)) - - def clear(): """Clear the logs buffer and reset the autoflush state.""" logs_buffer().clear() @@ -1062,13 +1049,15 @@ def fetch(start_time=None, return _LogQueryResult(request, timeout=timeout) -class _LogsStreamBuffer(object): - """Threadsafe buffer for storing and periodically flushing app logs. - This is the classic version that works with streams. It is still supported - for the early bootstrap LogsBuffer (which uses stderr) and for Python 2.5 - runtime (which uses a custom stream). - """ + + + + + + +class LogsBufferOld(object): + """Threadsafe buffer for storing and periodically flushing app logs.""" _MAX_FLUSH_SIZE = 1000 * 1000 _MAX_LINE_SIZE = _MAX_FLUSH_SIZE @@ -1231,9 +1220,9 @@ def _flush(self): for timestamp_usec, level, message in logs: - message = self._truncate(message, self._MAX_LINE_SIZE) + message = self._truncate(message, LogsBufferOld._MAX_LINE_SIZE) - if byte_size + len(message) > self._MAX_FLUSH_SIZE: + if byte_size + len(message) > LogsBufferOld._MAX_FLUSH_SIZE: break line = group.add_log_line() line.set_timestamp_usec(timestamp_usec) @@ -1272,14 +1261,8 @@ def autoflush_enabled(self): -def LogsBuffer(stream=None, stderr=False): - - - if stream or stderr or not features.IsEnabled('LogsBufferNew'): - return _LogsStreamBuffer(stream, stderr) - else: - return _LogsDequeBuffer() +LogsBuffer = LogsBufferOld _global_buffer = LogsBuffer(stderr=True) diff --git a/google/appengine/api/search/search.py b/google/appengine/api/search/search.py index b8eff659..dd7100b2 100644 --- a/google/appengine/api/search/search.py +++ b/google/appengine/api/search/search.py @@ -1092,17 +1092,18 @@ def _NewFacetsFromPb(facet_list): class FacetRange(object): - """A facet range with start and end values. + """A facet range with a name, start and end values. An example of a FacetRange for good rating is: - FacetRange(start=3.0, end=3.5) + FacetRange('good', start='3.0', end='3.5') """ - @datastore_rpc._positional(1) - def __init__(self, start=None, end=None): + @datastore_rpc._positional(2) + def __init__(self, name=None, start=None, end=None): """Initializer. Args: + name: The name of the range. start: Start value for the range, inclusive. end: End value for the range. exclusive. @@ -1111,6 +1112,7 @@ def __init__(self, start=None, end=None): attribute is passed. ValueError: If any of the parameters have invalid values. """ + self._name = name if start is None and end is None: raise ValueError( 'Either start or end need to be provided for a facet range.') @@ -1118,6 +1120,11 @@ def __init__(self, start=None, end=None): self._start = _CheckType(start, none_or_numeric_type, 'start') self._end = _CheckType(end, none_or_numeric_type, 'end') + @property + def name(self): + """Returns the name of the range.""" + return self._name + @property def start(self): """Returns inclusive start of the range.""" @@ -1140,9 +1147,9 @@ class FacetRequest(object): (results will have this facet with only specified values) Or ranges: FacetRequest('Rating', ranges=[ - FacetRange(1.0, 2.0), - FacetRange(2.0, 3.5), - FacetRange(3.5, 4.0)] + FacetRange('Fair', 1.0, 2.0), + FacetRange('Good', 2.0, 3.5), + FacetRange('Excelent', 3.5, 4.0)] (results will have this facet with specified ranges) """ @@ -1198,6 +1205,7 @@ def _CopyToProtocolBuffer(self, facet_request_pb): request_param_pb.set_value_limit(self.value_limit) for facet_range in self.ranges: range_pb = request_param_pb.add_range() + range_pb.set_name(facet_range.name) if facet_range.start is not None: range_pb.set_start(str(facet_range.start)) if facet_range.end is not None: @@ -1226,6 +1234,7 @@ def __init__(self, name, value=None, facet_range=None): name: The name of the facet. value: Value of the facet. facet_range: A FacetRange to refine facet based on a range. + FacetRange.name should be empty. Raises: TypeError: If any of the parameters have invalid types, or an unknown @@ -1236,6 +1245,8 @@ def __init__(self, name, value=None, facet_range=None): if (value is None) == (facet_range is None): raise ValueError('Either value or facet_range should be set but not ' 'both.') + if facet_range is not None and facet_range.name is not None: + logging.warning('FacetRefinement.facet_range.name should be None.') self._value = value self._facet_range = facet_range @@ -1294,6 +1305,7 @@ def FromTokenString(token_string): if ref_pb.has_range(): range_pb = ref_pb.range() facet_range = FacetRange( + name=None, start=float(range_pb.start()) if range_pb.has_start() else None, end=float(range_pb.end()) if range_pb.has_end() else None) @@ -1305,7 +1317,7 @@ def _CopyToProtocolBuffer(self, facet_refinement_pb): """Copies This object to a search_service_pb.FacetRefinement.""" facet_refinement_pb.set_name(self.name) if self.value is not None: - facet_refinement_pb.set_value(str(self.value)) + facet_refinement_pb.set_value(self.value) if self.facet_range is not None: if self.facet_range.start: facet_refinement_pb.mutable_range().set_start( @@ -1746,10 +1758,6 @@ def facet(self, facet_name): """ return self._BuildFacetMap().get(facet_name, []) - def __setstate__(self, state): - self.__dict__ = {'_facets': [], '_facet_map': None} - self.__dict__.update(state) - def __getitem__(self, field_name): """Returns a list of all fields with the provided field name. @@ -2436,10 +2444,6 @@ def facets(self): """Return the list of FacetResults that found in matched documents.""" return self._facets - def __setstate__(self, state): - self.__dict__ = {'_facets': []} - self.__dict__.update(state) - def __repr__(self): return _Repr(self, [('results', self.results), ('number_found', self.number_found), @@ -2670,7 +2674,7 @@ def __init__(self, discovery_limit=10, discovery_value_limit=None, facet_option = FacetOption(discover_facet_limit=5, discover_facet_value_limit=10, - depth=6000) + facet_depth=6000) Args: discovery_limit: Number of facets to discover if facet discovery is @@ -2682,7 +2686,7 @@ def __init__(self, discovery_limit=10, discovery_value_limit=None, Raises: TypeError: If an unknown attribute is passed. ValueError: If any of the parameters have invalid values (e.g., a - negative depth). + negative facet_depth). """ self._discovery_limit = _CheckFacetDiscoveryLimit(discovery_limit) self._discovery_value_limit = _CheckFacetValueLimit( @@ -3000,9 +3004,9 @@ def __init__(self, query_string, options=None, enable_facet_discovery=False, # discover only 5 facets and two manual facets with customized value facet_option = FacetOption(discovery_limit=5) facet1 = FacetRequest('Rating', ranges=[ - FacetRange(1.0, 2.0), - FacetRange(2.0, 3.5), - FacetRange(3.5, 4.0)] + FacetRange('Fair', 1.0, 2.0), + FacetRange('Good', 2.0, 3.5), + FacetRange('Excelent', 3.5, 4.0)] results = index.search( Query(query_string='movies', enable_facet_discovery=true, @@ -3085,13 +3089,6 @@ def return_facets(self): """Returns the list of specific facets to be included with the result.""" return self._return_facets - def __setstate__(self, state): - self.__dict__ = {'_enable_facet_discovery': False, - '_facet_options': None, - '_return_facets': [], - '_facet_refinements': []} - self.__dict__.update(state) - def _CopyQueryToProtocolBuffer(query, params): """Copies Query object to params protobuf.""" @@ -3492,6 +3489,7 @@ def _NewFacetResultFromPb(self, facet_result_pb): if refinement_pb.has_range(): range_pb = refinement_pb.range() facet_range = FacetRange( + name=None, start=(float(range_pb.start()) if range_pb.has_start() else None), end=(float(range_pb.end()) if range_pb.has_end() else None)) else: diff --git a/google/appengine/api/search/stub/simple_facet.py b/google/appengine/api/search/stub/simple_facet.py index 625eb025..926d8112 100644 --- a/google/appengine/api/search/stub/simple_facet.py +++ b/google/appengine/api/search/stub/simple_facet.py @@ -55,8 +55,7 @@ def FillFacetResponse(self, results, response): range_pair = ( float(range_pb.start()) if range_pb.has_start() else None, float(range_pb.end()) if range_pb.has_end() else None) - facet_obj.AddValue(self._GetFacetLabel(range_pb), - 0, refinement=range_pair) + facet_obj.AddValue(range_pb.name(), 0, refinement=range_pair) if not manual_facet_map and not self._params.auto_discover_facet_count(): return @@ -101,8 +100,7 @@ def FillFacetResponse(self, results, response): float(range_pb.end()) if range_pb.has_end() else None) if ((range_pair[0] is None or facet_value >= range_pair[0]) and (range_pair[1] is None or facet_value < range_pair[1])): - facet_obj.AddValue(self._GetFacetLabel(range_pb), - refinement=range_pair) + facet_obj.AddValue(range_pb.name(), refinement=range_pair) elif manual_facet_req.value_constraint_list(): for constraint in manual_facet_req.value_constraint_list(): if facet_value == float(constraint): @@ -134,7 +132,7 @@ def _FillResponseForSingleFacet(self, facet, facet_result_pb): if facet.min is not None: - facet.AddValue('[%s,%s)' % (facet.min, facet.max), facet.min_max_count, + facet.AddValue('%s,%s' % (facet.min, facet.max), facet.min_max_count, (facet.min, facet.max)) facet_result_pb.set_name(facet.name) for value in facet.GetTopValues(facet.value_limit): @@ -155,15 +153,6 @@ def _FillResponseForSingleFacet(self, facet, facet_result_pb): value_pb.set_name(str(value.label)) value_pb.set_count(value.count) - def _GetFacetLabel(self, range_pb): - if range_pb.has_name(): - return range_pb.name() - else: - return '[%s,%s)' % (str(float(range_pb.start())) - if range_pb.has_start() else '-Infinity', - str(float(range_pb.end())) - if range_pb.has_end() else 'Infinity') - def RefineResults(self, results): """Returns refined results using facet refinement parameters.""" if not self._params.facet_refinement_list(): diff --git a/google/appengine/api/urlfetch_stub.py b/google/appengine/api/urlfetch_stub.py index 6bdcd2cd..0160b06a 100644 --- a/google/appengine/api/urlfetch_stub.py +++ b/google/appengine/api/urlfetch_stub.py @@ -67,8 +67,6 @@ httplib.TEMPORARY_REDIRECT, ]) -PRESERVE_ON_REDIRECT = frozenset(['GET', 'HEAD']) - @@ -442,15 +440,6 @@ def _RetrieveURL(url, payload, method, headers, request, response, raise apiproxy_errors.ApplicationError( urlfetch_service_pb.URLFetchServiceError.MALFORMED_REPLY, error_msg) - - - - if (http_response.status != httplib.TEMPORARY_REDIRECT and - method not in PRESERVE_ON_REDIRECT): - logging.warn('Received a %s to a %s. Redirecting with a GET', - http_response.status, method) - method = 'GET' - payload = None else: response.set_statuscode(http_response.status) if (http_response.getheader('content-encoding') == 'gzip' and diff --git a/google/appengine/client/services/port_manager.py b/google/appengine/client/services/port_manager.py index 5acdddbc..5af9d921 100644 --- a/google/appengine/client/services/port_manager.py +++ b/google/appengine/client/services/port_manager.py @@ -18,13 +18,12 @@ import logging -from google.appengine.client.services import vme_constants from google.appengine.client.services import vme_errors # These ports are used by our code or critical system daemons. RESERVED_HOST_PORTS = [22, # SSH 5000, # Docker registry - vme_constants.DEFAULT_SERVING_PORT, # HTTP server + 8080, # HTTP server 10000, # For unlocking? 10001, # Nanny stubby proxy endpoint ] @@ -34,8 +33,8 @@ 10001, # Nanny stubby proxy endpoint ] -DEFAULT_CONTAINER_PORT = vme_constants.DEFAULT_SERVING_PORT -VM_PORT_FOR_CONTAINER = vme_constants.DEFAULT_SERVING_PORT +DEFAULT_CONTAINER_PORT = 8080 +VM_PORT_FOR_CONTAINER = 8080 class InconsistentPortConfigurationError(vme_errors.PermanentAppError): diff --git a/google/appengine/datastore/datastore_pbs.py b/google/appengine/datastore/datastore_pbs.py index eb954b6d..c3600f00 100644 --- a/google/appengine/datastore/datastore_pbs.py +++ b/google/appengine/datastore/datastore_pbs.py @@ -40,7 +40,7 @@ from google.appengine.datastore import entity_pb -from google.appengine.datastore import datastore_v4_pb + from google.appengine.datastore import entity_v4_pb @@ -243,13 +243,12 @@ def v3_to_v4_keys(self, v3_refs): v4_keys.append(v4_key) return v4_keys - def v4_to_v3_entity(self, v4_entity, v3_entity, is_projection=False): + def v4_to_v3_entity(self, v4_entity, v3_entity): """Converts a v4 Entity to a v3 EntityProto. Args: v4_entity: an entity_v4_pb.Entity v3_entity: an entity_pb.EntityProto to populate - is_projection: True if the v4_entity is from a projection query. """ v3_entity.Clear() for v4_property in v4_entity.property_list(): @@ -257,11 +256,9 @@ def v4_to_v3_entity(self, v4_entity, v3_entity, is_projection=False): v4_value = v4_property.value() if v4_value.list_value_list(): for v4_sub_value in v4_value.list_value_list(): - self.__add_v3_property( - property_name, True, is_projection, v4_sub_value, v3_entity) + self.__add_v3_property(property_name, True, v4_sub_value, v3_entity) else: - self.__add_v3_property( - property_name, False, is_projection, v4_value, v3_entity) + self.__add_v3_property(property_name, False, v4_value, v3_entity) if v4_entity.has_key(): v4_key = v4_entity.key() self.v4_to_v3_reference(v4_key, v3_entity.mutable_key()) @@ -330,8 +327,8 @@ def v4_value_to_v3_property_value(self, v4_value, v3_value): self.__v4_to_v3_point_value(v4_entity_value, v3_value.mutable_pointvalue()) elif v4_meaning == MEANING_PREDEFINED_ENTITY_USER: - self.v4_entity_to_v3_user_value(v4_entity_value, - v3_value.mutable_uservalue()) + self.__v4_to_v3_user_value(v4_entity_value, + v3_value.mutable_uservalue()) else: v3_entity_value = entity_pb.EntityProto() self.v4_to_v3_entity(v4_entity_value, v3_entity_value) @@ -444,8 +441,8 @@ def v3_property_to_v4_value(self, v3_property, indexed, v4_value): v3_meaning = None elif v3_property_value.has_uservalue(): - self.v3_user_value_to_v4_entity(v3_property_value.uservalue(), - v4_value.mutable_entity_value()) + self.__v3_to_v4_user_entity(v3_property_value.uservalue(), + v4_value.mutable_entity_value()) v4_value.set_meaning(MEANING_PREDEFINED_ENTITY_USER) v3_meaning = None else: @@ -460,8 +457,7 @@ def v3_property_to_v4_value(self, v3_property, indexed, v4_value): if indexed != v4_value.indexed(): v4_value.set_indexed(indexed) - def v4_to_v3_property(self, property_name, is_multi, is_projection, - v4_value, v3_property): + def __v4_to_v3_property(self, property_name, is_multi, v4_value, v3_property): """Converts info from a v4 Property to a v3 Property. v4_value must not have a list_value. @@ -469,7 +465,6 @@ def v4_to_v3_property(self, property_name, is_multi, is_projection, Args: property_name: the name of the property is_multi: whether the property contains multiple values - is_projection: whether the property is projected v4_value: an entity_v4_pb.Value v3_property: an entity_pb.Property to populate """ @@ -482,6 +477,7 @@ def v4_to_v3_property(self, property_name, is_multi, is_projection, v4_meaning = None if v4_value.has_meaning(): v4_meaning = v4_value.meaning() + if v4_value.has_timestamp_microseconds_value(): v3_property.set_meaning(entity_pb.Property.GD_WHEN) elif v4_value.has_blob_key_value(): @@ -514,27 +510,21 @@ def v4_to_v3_property(self, property_name, is_multi, is_projection, if v4_meaning is not None: v3_property.set_meaning(v4_meaning) - if is_projection: - v3_property.set_meaning(entity_pb.Property.INDEX_VALUE) - - - def __add_v3_property(self, property_name, is_multi, is_projection, - v4_value, v3_entity): + def __add_v3_property(self, property_name, is_multi, v4_value, v3_entity): """Adds a v3 Property to an Entity based on information from a v4 Property. Args: property_name: the name of the property is_multi: whether the property contains multiple values - is_projection: whether the property is a projection v4_value: an entity_v4_pb.Value v3_entity: an entity_pb.EntityProto """ if v4_value.indexed(): - self.v4_to_v3_property(property_name, is_multi, is_projection, - v4_value, v3_entity.add_property()) + self.__v4_to_v3_property(property_name, is_multi, v4_value, + v3_entity.add_property()) else: - self.v4_to_v3_property(property_name, is_multi, is_projection, - v4_value, v3_entity.add_raw_property()) + self.__v4_to_v3_property(property_name, is_multi, v4_value, + v3_entity.add_raw_property()) def __build_name_to_v4_property_map(self, v4_entity): property_map = {} @@ -698,7 +688,7 @@ def __v3_to_v4_point_entity(self, v3_point_value, v4_entity): v4_entity.property_list().append( self.__v4_double_property(PROPERTY_NAME_Y, v3_point_value.y(), False)) - def v4_entity_to_v3_user_value(self, v4_user_entity, v3_user_value): + def __v4_to_v3_user_value(self, v4_user_entity, v3_user_value): """Converts a v4 user Entity to a v3 UserValue. Args: @@ -731,7 +721,7 @@ def v4_entity_to_v3_user_value(self, v4_user_entity, v3_user_value): self.__get_v4_string_value(name_to_v4_property[ PROPERTY_NAME_FEDERATED_PROVIDER])) - def v3_user_value_to_v4_entity(self, v3_user_value, v4_entity): + def __v3_to_v4_user_entity(self, v3_user_value, v4_entity): """Converts a v3 UserValue to a v4 user Entity. Args: @@ -811,7 +801,7 @@ def ReturnFalse(): entity_pb.Property.GD_WHEN: HasInt64Value, entity_pb.Property.GD_RATING: HasInt64Value, entity_pb.Property.GEORSS_POINT: HasPointValue, - } + } default = ReturnFalse return value_checkers.get(v3_meaning, default)() @@ -888,59 +878,6 @@ def __v3_reference_value_to_v3_reference(self, v3_ref_value, v3_ref): v3_path_element.set_name(v3_ref_value_path_element.name()) -class _QueryConverter(object): - """Base converter for v3 and v4 queries.""" - - def __init__(self, entity_converter): - self._entity_converter = entity_converter - - def _v3_filter_to_v4_property_filter(self, v3_filter, v4_property_filter): - """Converts a v3 Filter to a v4 PropertyFilter. - - Args: - v3_filter: a datastore_pb.Filter - v4_property_filter: a datastore_v4_pb.PropertyFilter to populate - - Raises: - InvalidConversionError if the filter cannot be converted - """ - check_conversion(v3_filter.property_size() == 1, - 'invalid filter') - check_conversion(v3_filter.op() <= 5, - 'unsupported filter op: %d' % v3_filter.op()) - v4_property_filter.Clear() - v4_property_filter.set_operator(v3_filter.op()) - v4_property_filter.mutable_property().set_name(v3_filter.property(0).name()) - self._entity_converter.v3_property_to_v4_value( - v3_filter.property(0), True, v4_property_filter.mutable_value()) - - def _v3_query_to_v4_ancestor_filter(self, v3_query, v4_property_filter): - """Converts a v3 Query to a v4 ancestor PropertyFilter. - - Args: - v3_query: a datastore_pb.Query - v4_property_filter: a datastore_v4_pb.PropertyFilter to populate - """ - v4_property_filter.Clear() - v4_property_filter.set_operator( - datastore_v4_pb.PropertyFilter.HAS_ANCESTOR) - prop = v4_property_filter.mutable_property() - prop.set_name(PROPERTY_NAME_KEY) - self._entity_converter.v3_to_v4_key( - v3_query.ancestor(), - v4_property_filter.mutable_value().mutable_key_value()) - - def v3_order_to_v4_order(self, v3_order, v4_order): - """Converts a v3 Query order to a v4 PropertyOrder. - - Args: - v3_order: a datastore_pb.Query.Order - v4_order: a datastore_v4_pb.PropertyOrder to populate - """ - v4_order.mutable_property().set_name(v3_order.property()) - if v3_order.has_direction(): - v4_order.set_direction(v3_order.direction()) - __entity_converter = _EntityConverter() diff --git a/google/appengine/datastore/datastore_query.py b/google/appengine/datastore/datastore_query.py index ddb94b3b..1f265133 100644 --- a/google/appengine/datastore/datastore_query.py +++ b/google/appengine/datastore/datastore_query.py @@ -17,6 +17,7 @@ + """A thin wrapper around datastore query RPC calls. This provides wrappers around the internal only datastore_pb library and is @@ -51,13 +52,13 @@ 'ResultsIterator', 'make_filter', 'apply_query', - 'inject_results'] + 'inject_results', + ] import base64 import collections import pickle -from google.net.proto import ProtocolBuffer from google.appengine.datastore import entity_pb from google.appengine.api import datastore_errors @@ -65,9 +66,7 @@ from google.appengine.api.search import geo_util from google.appengine.datastore import datastore_index from google.appengine.datastore import datastore_pb -from google.appengine.datastore import datastore_pbs from google.appengine.datastore import datastore_rpc -from google.appengine.datastore import datastore_v4_pb class _BaseComponent(object): @@ -142,10 +141,6 @@ def _make_key_value_map(entity, property_names): return value_map - -_query_converter = datastore_pbs._QueryConverter( - datastore_pbs.get_entity_converter()) - class _PropertyComponent(_BaseComponent): """A component that operates on a specific set of properties.""" @@ -220,11 +215,6 @@ def _to_pbs(self): """Internal only function to generate a list of pbs.""" return [self._to_pb()] - def _to_pb_v4(self): - """Internal only function to generate a v4 pb.""" - raise NotImplementedError( - 'This filter only supports in memory operations (%r)' % self) - class _SinglePropertyFilter(FilterPredicate): """Base class for a filter that operates on a single property.""" @@ -275,7 +265,7 @@ class PropertyFilter(_SinglePropertyFilter): '>': datastore_pb.Query_Filter.GREATER_THAN, '>=': datastore_pb.Query_Filter.GREATER_THAN_OR_EQUAL, '=': datastore_pb.Query_Filter.EQUAL, - } + } _OPERATORS_INVERSE = dict((value, key) for key, value in _OPERATORS.iteritems()) @@ -286,7 +276,7 @@ class PropertyFilter(_SinglePropertyFilter): datastore_pb.Query_Filter.GREATER_THAN: '>', datastore_pb.Query_Filter.GREATER_THAN_OR_EQUAL: '>=', datastore_pb.Query_Filter.EQUAL: '==', - } + } _INEQUALITY_OPERATORS = frozenset(['<', '<=', '>', '>=']) @@ -295,7 +285,7 @@ class PropertyFilter(_SinglePropertyFilter): datastore_pb.Query_Filter.LESS_THAN_OR_EQUAL, datastore_pb.Query_Filter.GREATER_THAN, datastore_pb.Query_Filter.GREATER_THAN_OR_EQUAL, - ]) + ]) _UPPERBOUND_INEQUALITY_OPERATORS = frozenset(['<', '<=']) @@ -366,14 +356,6 @@ def _to_pb(self): """Returns the internal only pb representation.""" return self._filter - def _to_pb_v4(self): - """Returns a datastore_v4_pb.Filter representation of the filter.""" - filter_pb = datastore_v4_pb.Filter() - prop_filter_pb = filter_pb.mutable_property_filter() - _query_converter._v3_filter_to_v4_property_filter(self._filter, - prop_filter_pb) - return filter_pb - def __getstate__(self): raise pickle.PicklingError( 'Pickling of datastore_query.PropertyFilter is unsupported.') @@ -573,35 +555,6 @@ def _to_pbs(self): return pbs - def _to_pb_v4(self): - """Returns a datastore_v4_pb.Filter representation of the filter.""" - filter_pb = datastore_v4_pb.Filter() - composite_filter = filter_pb.mutable_composite_filter() - composite_filter.set_operator(datastore_v4_pb.CompositeFilter.AND) - - if self._start: - if self._start_incl: - op = datastore_v4_pb.PropertyFilter.GREATER_THAN_OR_EQUAL - else: - op = datastore_v4_pb.PropertyFilter.GREATER_THAN - pb = composite_filter.add_filter().mutable_property_filter() - pb.set_operator(op) - pb.mutable_property().set_name(self._start.name()) - datastore_pbs.get_entity_converter().v3_property_to_v4_value( - self._start, True, pb.mutable_value()) - - if self._end: - if self._end_incl: - op = datastore_v4_pb.PropertyFilter.LESS_THAN_OR_EQUAL - else: - op = datastore_v4_pb.PropertyFilter.LESS_THAN - pb = composite_filter.add_filter().mutable_property_filter() - pb.set_operator(op) - pb.mutable_property().set_name(self._end.name()) - datastore_pbs.get_entity_converter().v3_property_to_v4_value( - self._end, True, pb.mutable_value()) - return filter_pb - def __getstate__(self): raise pickle.PicklingError( 'Pickling of %r is unsupported.' % self) @@ -897,24 +850,6 @@ def _to_pbs(self): pbs.extend(f._to_pbs()) return pbs - def _to_pb_v4(self): - """Returns a datastore_v4_pb.Filter.""" - if not self._filters: - return None - if len(self._filters) == 1: - return self._filters[0]._to_pb_v4() - - pb = datastore_v4_pb.Filter() - comp_pb = pb.mutable_composite_filter() - if self.op == self.AND: - comp_pb.set_operator(datastore_v4_pb.CompositeFilter.AND) - else: - raise datastore_errors.BadArgumentError( - 'Datastore V4 only supports CompositeFilter with AND operator.') - for f in self._filters: - comp_pb.add_filter().CopyFrom(f._to_pb_v4()) - return pb - def __eq__(self, other): if self.__class__ is other.__class__: return super(CompositeFilter, self).__eq__(other) @@ -1101,10 +1036,6 @@ def _to_pb(self): """Internal only function to generate a filter pb.""" raise NotImplementedError - def _to_pb_v4(self): - """Internal only function to generate a v4 filter pb.""" - raise NotImplementedError - def key_for_filter(self, filter_predicate): if filter_predicate: return lambda x: self.key(x, filter_predicate) @@ -1310,12 +1241,6 @@ def _to_pb(self): """Returns the internal only pb representation.""" return self.__order - def _to_pb_v4(self): - """Returns a datastore_v4_pb.PropertyOrder representation of the order.""" - v4_order = datastore_v4_pb.PropertyOrder() - _query_converter.v3_order_to_v4_order(self.__order, v4_order) - return v4_order - def __getstate__(self): raise pickle.PicklingError( 'Pickling of datastore_query.PropertyOrder is unsupported.') @@ -1392,10 +1317,6 @@ def _to_pbs(self): """Returns an ordered list of internal only pb representations.""" return [order._to_pb() for order in self._orders] - def _to_pb_v4s(self): - """Returns an ordered list of datastore_v4_pb.PropertyOrder.""" - return [order._to_pb_v4() for order in self._orders] - def __eq__(self, other): if self.__class__ is other.__class__: return super(CompositeOrder, self).__eq__(other) @@ -1724,13 +1645,18 @@ def _urlsafe_to_bytes(cursor): try: - decoded_bytes = base64.b64decode( - str(cursor).replace('-', '+').replace('_', '/')) + decoded_bytes = base64.b64decode(str(cursor).replace('-', '+').replace('_', '/')) except (ValueError, TypeError), e: raise datastore_errors.BadValueError( 'Invalid cursor %s. Details: %s' % (cursor, e)) return decoded_bytes + @staticmethod + def _from_query_result(query_result): + if query_result.has_compiled_cursor(): + return Cursor(_cursor_bytes=query_result.compiled_cursor().Encode()) + return None + def advance(self, offset, query, conn): """Advances a Cursor by the given offset. @@ -1864,7 +1790,6 @@ def __call__(self, entity_or_reference): key.path().element_list()[0:len(self.__path)] == self.__path)) def _to_pb(self): - """Returns an internal pb representation.""" pb = datastore_pb.Query() pb.set_app(self.__app) @@ -1874,36 +1799,8 @@ def _to_pb(self): if self.__ancestor: ancestor = pb.mutable_ancestor() ancestor.CopyFrom(self.__ancestor) - return pb - - def _to_pb_v4(self): - """Returns a v4 internal proto representation of the query key filter. - - Returns: - A tuple (datastore_v4_pb.RunQueryRequest, datastore_v4_pb.Filter). - The second tuple value is a Filter representing the ancestor portion of the - query. If there is no ancestor constraint, this value will be None - """ - pb = datastore_v4_pb.RunQueryRequest() - partition_id = pb.mutable_partition_id() - partition_id.set_dataset_id(self.__app) - if self.__namespace: - partition_id.set_namespace(self.__namespace) - if self.__kind is not None: - pb.mutable_query().add_kind().set_name(self.__kind) - ancestor_filter = None - if self.__ancestor: - ancestor_filter = datastore_v4_pb.Filter() - ancestor_prop_filter = ancestor_filter.mutable_property_filter() - ancestor_prop_filter.set_operator( - datastore_v4_pb.PropertyFilter.HAS_ANCESTOR) - prop_pb = ancestor_prop_filter.mutable_property() - prop_pb.set_name(datastore_types.KEY_SPECIAL_PROPERTY) - datastore_pbs.get_entity_converter().v3_to_v4_key( - self.ancestor, - ancestor_prop_filter.mutable_value().mutable_key_value()) - return pb, ancestor_filter + return pb class _BaseQuery(_BaseComponent): @@ -2077,11 +1974,7 @@ def run_async(self, conn, query_options=None): if not start_cursor and query_options.produce_cursors: start_cursor = Cursor() - if conn._api_version == datastore_rpc._DATASTORE_V4: - req = self._to_pb_v4(conn, query_options) - else: - req = self._to_pb(conn, query_options) - + req = self._to_pb(conn, query_options) return Batch.create_async(self, query_options, conn, req, start_cursor=start_cursor) @@ -2115,81 +2008,6 @@ def _from_pb(cls, query_pb): order=order, group_by=group_by) - def _to_pb_v4(self, conn, query_options): - """Returns a datastore_v4_pb.RunQueryRequest.""" - v4_req, v4_ancestor_filter = self._key_filter._to_pb_v4() - v4_query = v4_req.mutable_query() - - if self.filter_predicate: - filter_predicate_pb = self._filter_predicate._to_pb_v4() - - - if self.filter_predicate and v4_ancestor_filter: - comp_filter_pb = v4_query.mutable_filter().mutable_composite_filter() - comp_filter_pb.set_operator(datastore_v4_pb.CompositeFilter.AND) - comp_filter_pb.add_filter().CopyFrom(filter_predicate_pb) - comp_filter_pb.add_filter().CopyFrom(v4_ancestor_filter) - elif self.filter_predicate: - v4_query.mutable_filter().CopyFrom(filter_predicate_pb) - elif v4_ancestor_filter: - v4_query.mutable_filter().CopyFrom(v4_ancestor_filter) - - - if self._order: - for order in self._order._to_pb_v4s(): - v4_query.add_order().CopyFrom(order) - - - if QueryOptions.keys_only(query_options, conn.config): - prop_ref_pb = v4_query.add_projection().mutable_property() - prop_ref_pb.set_name(datastore_pbs.PROPERTY_NAME_KEY) - - projection = QueryOptions.projection(query_options, conn.config) - self._validate_projection_and_group_by(projection, self._group_by) - - if projection: - for prop in projection: - prop_ref_pb = v4_query.add_projection().mutable_property() - prop_ref_pb.set_name(prop) - - if self._group_by: - for group_by in self._group_by: - v4_query.add_group_by().set_name(group_by) - - limit = QueryOptions.limit(query_options, conn.config) - if limit is not None: - v4_query.set_limit(limit) - - - - - - count = QueryOptions.batch_size(query_options, conn.config) - if count is None: - count = QueryOptions.prefetch_size(query_options, conn.config) - if count is not None: - v4_req.set_suggested_batch_size(count) - - - if query_options.offset: - v4_query.set_offset(query_options.offset) - - - if query_options.start_cursor is not None: - v4_query.set_start_cursor(query_options.start_cursor.to_bytes()) - - - if query_options.end_cursor is not None: - v4_query.set_end_cursor(query_options.end_cursor.to_bytes()) - - - - - conn._set_request_read_policy(v4_req, query_options) - conn._set_request_transaction(v4_req) - - return v4_req - def _to_pb(self, conn, query_options): """Returns the internal only pb representation.""" pb = self._key_filter._to_pb() @@ -2205,18 +2023,25 @@ def _to_pb(self, conn, query_options): pb.add_order().CopyFrom(order) + if self._group_by: + pb.group_by_property_name_list().extend(self._group_by) + + if QueryOptions.keys_only(query_options, conn.config): pb.set_keys_only(True) projection = QueryOptions.projection(query_options, conn.config) - self._validate_projection_and_group_by(projection, self._group_by) - if projection: + if self._group_by: + extra = set(projection) - set(self._group_by) + if extra: + raise datastore_errors.BadRequestError( + 'projections includes properties not in the group_by argument: %s' + % extra) pb.property_name_list().extend(projection) - - - if self._group_by: - pb.group_by_property_name_list().extend(self._group_by) + elif self._group_by: + raise datastore_errors.BadRequestError( + 'cannot specify group_by without a projection') if QueryOptions.produce_cursors(query_options, conn.config): pb.set_compile(True) @@ -2237,19 +2062,13 @@ def _to_pb(self, conn, query_options): if query_options.start_cursor is not None: - try: - pb.mutable_compiled_cursor().ParseFromString( - query_options.start_cursor.to_bytes()) - except ProtocolBuffer.ProtocolBufferDecodeError: - raise datastore_errors.BadRequestError('invalid cursor') + pb.mutable_compiled_cursor().ParseFromString( + query_options.start_cursor.to_bytes()) if query_options.end_cursor is not None: - try: - pb.mutable_end_compiled_cursor().ParseFromString( - query_options.end_cursor.to_bytes()) - except ProtocolBuffer.ProtocolBufferDecodeError: - raise datastore_errors.BadRequestError('invalid cursor') + pb.mutable_end_compiled_cursor().ParseFromString( + query_options.end_cursor.to_bytes()) if ((query_options.hint == QueryOptions.ORDER_FIRST and pb.order_size()) or @@ -2265,26 +2084,6 @@ def _to_pb(self, conn, query_options): return pb - def _validate_projection_and_group_by(self, projection, group_by): - """Validates that a query's projection and group by match. - - Args: - projection: A set of string property names in the projection. - group_by: A set of string property names in the group by. - Raises: - datastore_errors.BadRequestError: if the projection and group - by sets are not equal. - """ - if projection: - if group_by: - extra = set(projection) - set(group_by) - if extra: - raise datastore_errors.BadRequestError( - 'projections includes properties not in the group_by argument: %s' - % extra) - elif group_by: - raise datastore_errors.BadRequestError( - 'cannot specify group_by without a projection') def apply_query(query, entities): """Performs the given query on a set of in-memory entities. @@ -2308,11 +2107,11 @@ def apply_query(query, entities): """ if not isinstance(query, Query): raise datastore_errors.BadArgumentError( - 'query argument must be a datastore_query.Query (%r)' % (query,)) + "query argument must be a datastore_query.Query (%r)" % (query,)) if not isinstance(entities, list): raise datastore_errors.BadArgumentError( - 'entities argument must be a list (%r)' % (entities,)) + "entities argument must be a list (%r)" % (entities,)) filtered_entities = filter(query._key_filter, entities) @@ -2469,11 +2268,8 @@ def run_async(self, conn, query_options=None): in_memory_offset = None in_memory_limit = None - modified_query_options = QueryOptions(config=query_options, **changes) - if conn._api_version == datastore_rpc._DATASTORE_V4: - req = self._query._to_pb_v4(conn, modified_query_options) - else: - req = self._query._to_pb(conn, modified_query_options) + req = self._query._to_pb( + conn, QueryOptions(config=query_options, **changes)) start_cursor = query_options.start_cursor if not start_cursor and query_options.produce_cursors: @@ -2497,14 +2293,14 @@ def inject_results(query, updated_entities=None, deleted_keys=None): deleted and should be removed from query results. Returns: - A datastore_query.AugmentedQuery if in memory filtering is required, + A datastore_query.AugmentedQuery if in memory filtering is requred, query otherwise. """ if not isinstance(query, Query): raise datastore_errors.BadArgumentError( 'query argument should be datastore_query.Query (%r)' % (query,)) - overridden_keys = set() + overriden_keys = set() if deleted_keys is not None: if not isinstance(deleted_keys, list): @@ -2512,7 +2308,7 @@ def inject_results(query, updated_entities=None, deleted_keys=None): 'deleted_keys argument must be a list (%r)' % (deleted_keys,)) deleted_keys = filter(query._key_filter, deleted_keys) for key in deleted_keys: - overridden_keys.add(datastore_types.ReferenceToKeyValue(key)) + overriden_keys.add(datastore_types.ReferenceToKeyValue(key)) if updated_entities is not None: if not isinstance(updated_entities, list): @@ -2522,34 +2318,30 @@ def inject_results(query, updated_entities=None, deleted_keys=None): updated_entities = filter(query._key_filter, updated_entities) for entity in updated_entities: - overridden_keys.add(datastore_types.ReferenceToKeyValue(entity.key())) + overriden_keys.add(datastore_types.ReferenceToKeyValue(entity.key())) updated_entities = apply_query(query, updated_entities) else: updated_entities = [] - if not overridden_keys: + if not overriden_keys: return query return _AugmentedQuery(query, - in_memory_filter=_IgnoreFilter(overridden_keys), + in_memory_filter=_IgnoreFilter(overriden_keys), in_memory_results=updated_entities, - max_filtered_count=len(overridden_keys)) + max_filtered_count=len(overriden_keys)) class _BatchShared(object): """Data shared among the batches of a query.""" - def __init__(self, query, query_options, conn, - augmented_query=None, initial_offset=None): + def __init__(self, query, query_options, conn, augmented_query=None): self.__query = query self.__query_options = query_options self.__conn = conn self.__augmented_query = augmented_query self.__was_first_result_processed = False - if initial_offset is None: - initial_offset = query_options.offset or 0 - self.__expected_offset = initial_offset @property def query(self): @@ -2575,10 +2367,6 @@ def keys_only(self): def compiled_query(self): return self.__compiled_query - @property - def expected_offset(self): - return self.__expected_offset - @property def index_list(self): """Returns the list of indexes used by the query. @@ -2586,30 +2374,20 @@ def index_list(self): """ return self.__index_list - def process_batch(self, batch): - self.__expected_offset -= batch.skipped_results() - - + def process_query_result_if_first(self, query_result): if not self.__was_first_result_processed: self.__was_first_result_processed = True - if self.conn._api_version == datastore_rpc._DATASTORE_V4: - result_type = batch.entity_result_type() - self.__keys_only = result_type == datastore_v4_pb.EntityResult.KEY_ONLY + self.__keys_only = query_result.keys_only() + if query_result.has_compiled_query(): + self.__compiled_query = query_result.compiled_query + else: self.__compiled_query = None + try: + self.__index_list = [self.__conn.adapter.pb_to_index(index_pb) + for index_pb in query_result.index_list()] + except NotImplementedError: self.__index_list = None - else: - self.__keys_only = batch.keys_only() - if batch.has_compiled_query(): - self.__compiled_query = batch.compiled_query - else: - self.__compiled_query = None - try: - self.__index_list = [self.__conn.adapter.pb_to_index(index_pb) - for index_pb in batch.index_list()] - except NotImplementedError: - - self.__index_list = None class Batch(object): @@ -2649,7 +2427,6 @@ class Batch(object): """ __skipped_cursor = None - __end_cursor = None @classmethod @datastore_rpc._positional(5) @@ -2657,7 +2434,7 @@ def create_async(cls, query, query_options, conn, req, start_cursor): batch_shared = _BatchShared(query, query_options, conn) batch0 = cls(batch_shared, start_cursor=start_cursor) - return batch0._make_query_rpc_call(query_options, req) + return batch0._make_query_result_rpc_call('RunQuery', query_options, req) @datastore_rpc._positional(2) def __init__(self, batch_shared, start_cursor=Cursor()): @@ -2787,9 +2564,9 @@ def cursor(self, index): return self.__start_cursor elif (index == 0 and self.__skipped_cursor): - return self.__skipped_cursor + return Cursor(_cursor_bytes=self.__skipped_cursor.Encode()) elif index > 0 and self.__result_cursors: - return self.__result_cursors[index - 1] + return Cursor(_cursor_bytes=self.__result_cursors[index - 1].Encode()) elif index == len(self.__results): return self.__end_cursor @@ -2818,42 +2595,10 @@ def next_batch_async(self, fetch_options=None): return None fetch_options, next_batch = self._make_next_batch(fetch_options) - - if (fetch_options is not None and - not FetchOptions.is_configuration(fetch_options)): - raise datastore_errors.BadArgumentError('Invalid fetch options.') - - - + req = self._to_pb(fetch_options) config = self._batch_shared.query_options.merge(fetch_options) - conn = next_batch._batch_shared.conn - requested_offset = 0 - if fetch_options is not None and fetch_options.offset is not None: - requested_offset = fetch_options.offset - - if conn._api_version == datastore_rpc._DATASTORE_V4: - if (self._batch_shared.expected_offset != requested_offset): - raise datastore_errors.BadArgumentError( - 'Cannot request the next batch with a different offset than ' - ' expected. Expected: %s, Got: %s.' - % (self._batch_shared.expected_offset, requested_offset)) - else: - - next_batch.__datastore_cursor = self.__datastore_cursor - result = next_batch._make_next_rpc_call(config, self._to_pb_v4()) - else: - result = next_batch._make_next_rpc_call(config, - self._to_pb(fetch_options)) - - self.__datastore_cursor = None - return result - - def _to_pb_v4(self): - """Returns a datastore_v4_pb.ContinueQueryRequest.""" - req = datastore_v4_pb.ContinueQueryRequest() - req.set_query_handle(self.__datastore_cursor) - return req + return next_batch._make_query_result_rpc_call('Next', config, req) def _to_pb(self, fetch_options=None): req = datastore_pb.NextRequest() @@ -2869,17 +2614,16 @@ def _to_pb(self, fetch_options=None): if count is not None: req.set_count(count) - if fetch_options is not None and fetch_options.offset: req.set_offset(fetch_options.offset) req.mutable_cursor().CopyFrom(self.__datastore_cursor) + self.__datastore_cursor = None return req def _extend(self, next_batch): """Combines the current batch with the next one. Called by batcher.""" self.__datastore_cursor = next_batch.__datastore_cursor - next_batch.__datastore_cursor = None self.__more_results = next_batch.__more_results if not self.__results: @@ -2889,84 +2633,23 @@ def _extend(self, next_batch): self.__end_cursor = next_batch.__end_cursor self._skipped_results += next_batch._skipped_results - def _make_query_rpc_call(self, config, req): - """Makes a RunQuery call that will modify the instance. + def _make_query_result_rpc_call(self, name, config, req): + """Makes either a RunQuery or Next call that will modify the instance. Args: + name: A string, the name of the call to invoke. config: The datastore_rpc.Configuration to use for the call. req: The request to send with the call. Returns: A UserRPC object that can be used to fetch the result of the RPC. """ - if self._batch_shared.conn._api_version == datastore_rpc._DATASTORE_V4: - return self._batch_shared.conn._make_rpc_call( - config, 'RunQuery', req, datastore_v4_pb.RunQueryResponse(), - self.__v4_run_query_response_hook) - - return self._batch_shared.conn._make_rpc_call(config, 'RunQuery', req, - datastore_pb.QueryResult(), - self.__query_result_hook) - - def _make_next_rpc_call(self, config, req): - """Makes either a Next or ContinueQuery call that will modify the instance. - - Args: - config: The datastore_rpc.Configuration to use for the call. - req: The request to send with the call. - - Returns: - A UserRPC object that can be used to fetch the result of the RPC. - """ - if self._batch_shared.conn._api_version == datastore_rpc._DATASTORE_V4: - return self._batch_shared.conn._make_rpc_call( - config, 'ContinueQuery', req, - datastore_v4_pb.ContinueQueryResponse(), - self.__v4_continue_query_response_hook) - return self._batch_shared.conn._make_rpc_call(config, 'Next', req, + return self._batch_shared.conn._make_rpc_call(config, name, req, datastore_pb.QueryResult(), self.__query_result_hook) _need_index_header = 'The suggested index for this query is:' - def __v4_run_query_response_hook(self, rpc): - try: - self._batch_shared.conn.check_rpc_success(rpc) - except datastore_errors.NeedIndexError, exc: - - raise - if rpc.response.has_query_handle(): - self.__datastore_cursor = rpc.response.query_handle() - return self.__process_v4_query_batch(rpc.response.batch()) - - def __v4_continue_query_response_hook(self, rpc): - self._batch_shared.conn.check_rpc_success(rpc) - return self.__process_v4_query_batch(rpc.response.batch()) - - def __process_v4_query_batch(self, batch): - """Internal method to handle QueryResultBatchs from a V4 Query.""" - self._batch_shared.process_batch(batch) - - if batch.has_skipped_cursor(): - self.__skipped_cursor = Cursor(_cursor_bytes=batch.skipped_cursor()) - - self.__result_cursors = [Cursor(_cursor_bytes=result.cursor()) - for result in batch.entity_result_list() - if result.has_cursor()] - - if batch.has_end_cursor(): - self.__end_cursor = Cursor(_cursor_bytes=batch.end_cursor()) - - self._skipped_results = batch.skipped_results() - - if batch.more_results() != datastore_v4_pb.QueryResultBatch.NOT_FINISHED: - self._end() - else: - self.__more_results = True - - self.__results = self._process_v4_results(batch.entity_result_list()) - return self - def __query_result_hook(self, rpc): """Internal method used as get_result_hook for RunQuery/Next operation.""" try: @@ -2989,20 +2672,13 @@ def __query_result_hook(self, rpc): raise query_result = rpc.response - self._batch_shared.process_batch(query_result) + self._batch_shared.process_query_result_if_first(query_result) if query_result.has_skipped_results_compiled_cursor(): - self.__skipped_cursor = Cursor( - _cursor_bytes=query_result.skipped_results_compiled_cursor().Encode()) - - self.__result_cursors = [Cursor(_cursor_bytes=result.Encode()) - for result in - query_result.result_compiled_cursor_list()] - - if query_result.has_compiled_cursor(): - self.__end_cursor = Cursor( - _cursor_bytes=query_result.compiled_cursor().Encode()) + self.__skipped_cursor = query_result.skipped_results_compiled_cursor() + self.__result_cursors = list(query_result.result_compiled_cursor_list()) + self.__end_cursor = Cursor._from_query_result(query_result) self._skipped_results = query_result.skipped_results() if query_result.more_results(): @@ -3042,21 +2718,8 @@ def _process_results(self, results): Returns: A list of results that should be returned to the user. """ - converter = self._batch_shared.conn.adapter.pb_to_query_result - return [converter(result, self._batch_shared.query_options) - for result in results] - - def _process_v4_results(self, results): - """Converts the datastore results into results returned to the user. - - Args: - results: A list of datastore_v4_pb.EntityResults. - - Returns: - A list of results that should be returned to the user. - """ - converter = self._batch_shared.conn.adapter.pb_v4_to_query_result - return [converter(result.entity(), self._batch_shared.query_options) + pb_to_query_result = self._batch_shared.conn.adapter.pb_to_query_result + return [pb_to_query_result(result, self._batch_shared.query_options) for result in results] def __getstate__(self): @@ -3071,18 +2734,15 @@ class _AugmentedBatch(Batch): @datastore_rpc._positional(5) def create_async(cls, augmented_query, query_options, conn, req, in_memory_offset, in_memory_limit, start_cursor): - initial_offset = 0 if in_memory_offset is not None else None batch_shared = _BatchShared(augmented_query._query, query_options, conn, - augmented_query, - initial_offset=initial_offset) - + augmented_query) batch0 = cls(batch_shared, in_memory_offset=in_memory_offset, in_memory_limit=in_memory_limit, start_cursor=start_cursor) - return batch0._make_query_rpc_call(query_options, req) + return batch0._make_query_result_rpc_call('RunQuery', query_options, req) @datastore_rpc._positional(2) def __init__(self, batch_shared, @@ -3115,18 +2775,6 @@ def _extend(self, next_batch): self.__in_memory_offset = next_batch.__in_memory_offset self.__next_index = next_batch.__next_index - def _process_v4_results(self, results): - """Process V4 results by converting to V3 and calling _process_results.""" - v3_results = [] - is_projection = bool(self.query_options.projection) - for v4_result in results: - v3_entity = entity_pb.EntityProto() - datastore_pbs.get_entity_converter().v4_to_v3_entity(v4_result.entity(), - v3_entity, - is_projection) - v3_results.append(v3_entity) - return self._process_results(v3_results) - def _process_results(self, results): in_memory_filter = self._batch_shared.augmented_query._in_memory_filter @@ -3380,7 +3028,7 @@ def _compiled_query(self): def next(self): """Returns the next query result.""" while (not self.__current_batch or - self.__current_pos >= len(self.__current_batch.results)): + self.__current_pos >= len(self.__current_batch.results)): try: diff --git a/google/appengine/datastore/datastore_rpc.py b/google/appengine/datastore/datastore_rpc.py index c99c6693..4ce64dd9 100644 --- a/google/appengine/datastore/datastore_rpc.py +++ b/google/appengine/datastore/datastore_rpc.py @@ -158,20 +158,12 @@ def pb_to_entity(self, pb): """Turn an entity_pb.EntityProto into a user-level entity.""" raise NotImplementedError - def pb_v4_to_entity(self, pb, is_projection): + def pb_v4_to_entity(self, pb): """Turn an entity_v4_pb.Entity into a user-level entity.""" v3_entity = entity_pb.EntityProto() - datastore_pbs.get_entity_converter().v4_to_v3_entity( - pb, v3_entity, is_projection) + datastore_pbs.get_entity_converter().v4_to_v3_entity(pb, v3_entity) return self.pb_to_entity(v3_entity) - def pb_v4_to_query_result(self, pb, query_options): - """Turn an entity_v4_pb.Entity into a user-level query result.""" - if query_options.keys_only: - return self.pb_v4_to_key(pb.key()) - else: - return self.pb_v4_to_entity(pb, bool(query_options.projection)) - def pb_to_index(self, pb): """Turn an entity_pb.CompositeIndex into a user-level Index representation.""" @@ -1679,7 +1671,7 @@ def __add_get_response_entities_to_dict(self, get_response, result_dict): if isinstance(get_response, datastore_v4_pb.LookupResponse): for result in get_response.found_list(): v4_key = result.entity().key() - entity = self.__adapter.pb_v4_to_entity(result.entity(), False) + entity = self.__adapter.pb_v4_to_entity(result.entity()) result_dict[datastore_types.ReferenceToKeyValue(v4_key)] = entity else: for entity_result in get_response.entity_list(): diff --git a/google/appengine/datastore/datastore_stub_util.py b/google/appengine/datastore/datastore_stub_util.py index 4e0f3624..ae58a121 100644 --- a/google/appengine/datastore/datastore_stub_util.py +++ b/google/appengine/datastore/datastore_stub_util.py @@ -3348,11 +3348,11 @@ def _UpdateIndexes(self): self._index_config_updater.UpdateIndexConfig() -class StubQueryConverter(datastore_pbs._QueryConverter): +class StubQueryConverter(object): """Converter for v3 and v4 queries suitable for use in stubs.""" def __init__(self, entity_converter): - super(StubQueryConverter, self).__init__(entity_converter) + self._entity_converter = entity_converter def v4_to_v3_compiled_cursor(self, v4_cursor, v3_compiled_cursor): """Converts a v4 cursor string to a v3 CompiledCursor. @@ -3500,15 +3500,18 @@ def v3_to_v4_query(self, v3_query, v4_query): get_property_filter = self.__add_property_filter if v3_query.has_ancestor(): - self._v3_query_to_v4_ancestor_filter(v3_query, - get_property_filter(v4_query)) - for v3_filter in v3_query.filter_list(): - self._v3_filter_to_v4_property_filter(v3_filter, + self.__v3_query_to_v4_ancestor_filter(v3_query, get_property_filter(v4_query)) + for v3_filter in v3_query.filter_list(): + self.__v3_filter_to_v4_property_filter(v3_filter, + get_property_filter(v4_query)) for v3_order in v3_query.order_list(): - self.v3_order_to_v4_order(v3_order, v4_query.add_order()) + v4_order = v4_query.add_order() + v4_order.mutable_property().set_name(v3_order.property()) + if v3_order.has_direction(): + v4_order.set_direction(v3_order.direction()) def __get_property_filter(self, v4_query): """Returns the PropertyFilter from the query's top-level filter.""" @@ -3555,11 +3558,11 @@ def __populate_v3_filters(self, v4_filter, v3_query): not v4_property_filter.value().list_value_list(), ('unsupported value type, %s, in property filter' ' on "%s"' % ('list_value', property_name))) - self._entity_converter.v4_to_v3_property(property_name, - False, - False, - v4_property_filter.value(), - v3_filter.add_property()) + prop = v3_filter.add_property() + prop.set_multiple(False) + prop.set_name(property_name) + self._entity_converter.v4_value_to_v3_property_value( + v4_property_filter.value(), prop.mutable_value()) elif v4_filter.has_composite_filter(): datastore_pbs.check_conversion((v4_filter.composite_filter().operator() == datastore_v4_pb.CompositeFilter.AND), @@ -3567,6 +3570,43 @@ def __populate_v3_filters(self, v4_filter, v3_query): for v4_sub_filter in v4_filter.composite_filter().filter_list(): self.__populate_v3_filters(v4_sub_filter, v3_query) + def __v3_filter_to_v4_property_filter(self, v3_filter, v4_property_filter): + """Converts a v3 Filter to a v4 PropertyFilter. + + Args: + v3_filter: a datastore_pb.Filter + v4_property_filter: a datastore_v4_pb.PropertyFilter to populate + + Raises: + InvalidConversionError if the filter cannot be converted + """ + datastore_pbs.check_conversion(v3_filter.property_size() == 1, + 'invalid filter') + datastore_pbs.check_conversion(v3_filter.op() <= 5, + 'unsupported filter op: %d' % v3_filter.op()) + v4_property_filter.Clear() + v4_property_filter.set_operator(v3_filter.op()) + v4_property_filter.mutable_property().set_name(v3_filter.property(0).name()) + self._entity_converter.v3_property_to_v4_value( + v3_filter.property(0), True, v4_property_filter.mutable_value()) + + def __v3_query_to_v4_ancestor_filter(self, v3_query, v4_property_filter): + """Converts a v3 Query to a v4 ancestor PropertyFilter. + + Args: + v3_query: a datastore_pb.Query + v4_property_filter: a datastore_v4_pb.PropertyFilter to populate + """ + v4_property_filter.Clear() + v4_property_filter.set_operator( + datastore_v4_pb.PropertyFilter.HAS_ANCESTOR) + prop = v4_property_filter.mutable_property() + prop.set_name(datastore_pbs.PROPERTY_NAME_KEY) + self._entity_converter.v3_to_v4_key( + v3_query.ancestor(), + v4_property_filter.mutable_value().mutable_key_value()) + + __query_converter = StubQueryConverter(datastore_pbs.get_entity_converter()) diff --git a/google/appengine/datastore/datastore_v4_stub.py b/google/appengine/datastore/datastore_v4_stub.py index 54b88ca8..cec14841 100644 --- a/google/appengine/datastore/datastore_v4_stub.py +++ b/google/appengine/datastore/datastore_v4_stub.py @@ -246,12 +246,6 @@ def _Dynamic_RunQuery(self, req, resp): datastore_v4_pb.Error.BAD_REQUEST, str(e)) try: v4_resp = self.__service_converter.v3_to_v4_run_query_resp(v3_resp) - if req.query().projection_list(): - if req.query().projection_list() == ['__key__']: - result_type = datastore_v4_pb.EntityResult.KEY_ONLY - else: - result_type = datastore_v4_pb.EntityResult.PROJECTION - v4_resp.mutable_batch().set_entity_result_type(result_type) except datastore_pbs.InvalidConversionError, e: raise apiproxy_errors.ApplicationError( datastore_v4_pb.Error.INTERNAL_ERROR, str(e)) diff --git a/google/appengine/ext/admin/__init__.py b/google/appengine/ext/admin/__init__.py index 8e600c9a..a4903e7f 100644 --- a/google/appengine/ext/admin/__init__.py +++ b/google/appengine/ext/admin/__init__.py @@ -62,6 +62,7 @@ HAVE_CRON = True from google.appengine.api import apiproxy_stub_map +from google.appengine.api import backends from google.appengine.api import datastore from google.appengine.api import datastore_errors from google.appengine.api import datastore_types @@ -832,12 +833,6 @@ def get(self): def render_backends_page(self): """Shows template displaying all the app's backends.""" - - - - - from google.appengine.api import backends - if hasattr(self.stub, 'get_backend_info'): backend_info = self.stub.get_backend_info() or [] else: @@ -875,12 +870,6 @@ def get_backend_entry(self, backend_name): def render_backend_page(self, backend_name): """Shows template displaying a single backend.""" - - - - - from google.appengine.api import backends - backend = self.get_backend_entry(backend_name) instances = [] diff --git a/google/appengine/ext/analytics/static/analytics_js.js b/google/appengine/ext/analytics/static/analytics_js.js index 08df981f..f22e50a6 100644 --- a/google/appengine/ext/analytics/static/analytics_js.js +++ b/google/appengine/ext/analytics/static/analytics_js.js @@ -1,24 +1,24 @@ /* Copyright 2008-9 Google Inc. All Rights Reserved. */ (function(){var l,m=this,n=function(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null"; else if("function"==b&&"undefined"==typeof a.call)return"object";return b},q=function(a){return"string"==typeof a},r=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}},aa=Date.now||function(){return+new Date},s=function(a,b){var c=a.split("."),e=m;c[0]in e||!e.execScript||e.execScript("var "+c[0]);for(var d;c.length&&(d=c.shift());)c.length||void 0===b?e=e[d]?e[d]:e[d]={}:e[d]=b},t=function(a,b){function c(){} -c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.u=function(a,c,f){return b.prototype[c].apply(a,Array.prototype.slice.call(arguments,2))}};var u=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,u);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))};t(u,Error);var ba=function(a,b){for(var c=a.split("%s"),e="",d=Array.prototype.slice.call(arguments,1);d.length&&1b?1:0};var z=function(a,b){b.unshift(a);u.call(this,ba.apply(null,b));b.shift()};t(z,u);var B=function(a,b,c){if(!a){var e="Assertion failed";if(b)var e=e+(": "+b),d=Array.prototype.slice.call(arguments,2);throw new z(""+e,d||[]);}};var C=Array.prototype,D=C.indexOf?function(a,b,c){B(null!=a.length);return C.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(q(a))return q(b)&&1==b.length?a.indexOf(b,c):-1;for(;c=arguments.length?C.slice.call(a,b):C.slice.call(a,b,c)};var F;t:{var G=m.navigator;if(G){var H=G.userAgent;if(H){F=H;break t}}F=""};var I=-1!=F.indexOf("Opera")||-1!=F.indexOf("OPR"),J=-1!=F.indexOf("Trident")||-1!=F.indexOf("MSIE"),K=-1!=F.indexOf("Gecko")&&-1==F.toLowerCase().indexOf("webkit")&&!(-1!=F.indexOf("Trident")||-1!=F.indexOf("MSIE")),L=-1!=F.toLowerCase().indexOf("webkit"),M=function(){var a=m.document;return a?a.documentMode:void 0},N=function(){var a="",b;if(I&&m.opera)return a=m.opera.version,"function"==n(a)?a():a;K?b=/rv\:([^\);]+)(\)|;)/:J?b=/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/:L&&(b=/WebKit\/(\S+)/);b&&(a=(a= -b.exec(F))?a[1]:"");return J&&(b=M(),b>parseFloat(a))?String(b):a}(),fa={},O=function(a){var b;if(!(b=fa[a])){b=0;for(var c=v(String(N)).split("."),e=v(String(a)).split("."),d=Math.max(c.length,e.length),f=0;0==b&&f=a.keyCode)a.keyCode=-1}catch(b){}};var oa="closure_listenable_"+(1E6*Math.random()|0),pa=0;var qa=function(a,b,c,e,d){this.c=a;this.e=null;this.src=b;this.type=c;this.g=!!e;this.f=d;this.key=++pa;this.d=this.h=!1},ra=function(a){a.d=!0;a.c=null;a.e=null;a.src=null;a.f=null};var T=function(a){this.src=a;this.b={};this.i=0};T.prototype.add=function(a,b,c,e,d){var f=a.toString();a=this.b[f];a||(a=this.b[f]=[],this.i++);var g;t:{for(g=0;gd.keyCode||void 0!=d.returnValue)){t:{var f=!1;if(0==d.keyCode)try{d.keyCode=-1;break t}catch(g){f=!0}if(f||void 0==d.returnValue)d.returnValue=!0}d=[];for(f=c.currentTarget;f;f=f.parentNode)d.push(f);for(var f=a.type,h=d.length-1;!c.j&&0<=h;h--)c.currentTarget=d[h],e&=Aa(d[h],f,!0,c);for(h= -0;!c.j&&h>>0),xa=function(a){B(a,"Listener can not be null.");if("function"==n(a))return a;B(a.handleEvent,"An object listener must have handleEvent method.");a[X]||(a[X]=function(b){return a.handleEvent(b)});return a[X]};var Z=function(a,b,c){"number"==typeof a?(this.a=Ba(a,b||0,c||1),Y(this,c||1)):(b=typeof a,"object"==b&&null!=a||"function"==b?(this.a=Ba(a.getFullYear(),a.getMonth(),a.getDate()),Y(this,a.getDate())):(this.a=new Date(aa()),this.a.setHours(0),this.a.setMinutes(0),this.a.setSeconds(0),this.a.setMilliseconds(0)))},Ba=function(a,b,c){b=new Date(a,b,c);0<=a&&100>a&&b.setFullYear(b.getFullYear()-1900);return b};l=Z.prototype;l.getFullYear=function(){return this.a.getFullYear()};l.getYear=function(){return this.getFullYear()}; +c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.u=function(a,c,f){return b.prototype[c].apply(a,Array.prototype.slice.call(arguments,2))}};var u=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,u);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))};t(u,Error);var ba=function(a,b){for(var c=a.split("%s"),e="",d=Array.prototype.slice.call(arguments,1);d.length&&1b?1:0};var z=function(a,b){b.unshift(a);u.call(this,ba.apply(null,b));b.shift()};t(z,u);var A=function(a,b,c){if(!a){var e="Assertion failed";if(b)var e=e+(": "+b),d=Array.prototype.slice.call(arguments,2);throw new z(""+e,d||[]);}};var C=Array.prototype,D=C.indexOf?function(a,b,c){A(null!=a.length);return C.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(q(a))return q(b)&&1==b.length?a.indexOf(b,c):-1;for(;c=arguments.length?C.slice.call(a,b):C.slice.call(a,b,c)};var F;t:{var G=m.navigator;if(G){var H=G.userAgent;if(H){F=H;break t}}F=""}var I=function(a){return-1!=F.indexOf(a)};var J=I("Opera")||I("OPR"),K=I("Trident")||I("MSIE"),L=I("Gecko")&&-1==F.toLowerCase().indexOf("webkit")&&!(I("Trident")||I("MSIE")),M=-1!=F.toLowerCase().indexOf("webkit"),N=function(){var a=m.document;return a?a.documentMode:void 0},fa=function(){var a="",b;if(J&&m.opera)return a=m.opera.version,"function"==n(a)?a():a;L?b=/rv\:([^\);]+)(\)|;)/:K?b=/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/:M&&(b=/WebKit\/(\S+)/);b&&(a=(a=b.exec(F))?a[1]:"");return K&&(b=N(),b>parseFloat(a))?String(b):a}(),ga={},O=function(a){var b; +if(!(b=ga[a])){b=0;for(var c=v(String(fa)).split("."),e=v(String(a)).split("."),d=Math.max(c.length,e.length),f=0;0==b&&f=a.keyCode)a.keyCode=-1}catch(b){}};var pa="closure_listenable_"+(1E6*Math.random()|0),qa=0;var ra=function(a,b,c,e,d){this.c=a;this.e=null;this.src=b;this.type=c;this.g=!!e;this.f=d;this.key=++qa;this.d=this.h=!1},sa=function(a){a.d=!0;a.c=null;a.e=null;a.src=null;a.f=null};var T=function(a){this.src=a;this.b={};this.i=0};T.prototype.add=function(a,b,c,e,d){var f=a.toString();a=this.b[f];a||(a=this.b[f]=[],this.i++);var g;t:{for(g=0;gd.keyCode||void 0!=d.returnValue)){t:{var f=!1;if(0==d.keyCode)try{d.keyCode=-1;break t}catch(g){f=!0}if(f||void 0==d.returnValue)d.returnValue=!0}d=[];for(f=c.currentTarget;f;f=f.parentNode)d.push(f);for(var f=a.type,h=d.length-1;!c.j&&0<=h;h--)c.currentTarget=d[h],e&=Ba(d[h],f,!0,c);for(h= +0;!c.j&&h>>0),ya=function(a){A(a,"Listener can not be null.");if("function"==n(a))return a;A(a.handleEvent,"An object listener must have handleEvent method.");a[X]||(a[X]=function(b){return a.handleEvent(b)});return a[X]};var Z=function(a,b,c){"number"==typeof a?(this.a=Ca(a,b||0,c||1),Y(this,c||1)):(b=typeof a,"object"==b&&null!=a||"function"==b?(this.a=Ca(a.getFullYear(),a.getMonth(),a.getDate()),Y(this,a.getDate())):(this.a=new Date(aa()),this.a.setHours(0),this.a.setMinutes(0),this.a.setSeconds(0),this.a.setMilliseconds(0)))},Ca=function(a,b,c){b=new Date(a,b,c);0<=a&&100>a&&b.setFullYear(b.getFullYear()-1900);return b};l=Z.prototype;l.getFullYear=function(){return this.a.getFullYear()};l.getYear=function(){return this.getFullYear()}; l.getMonth=function(){return this.a.getMonth()};l.getDate=function(){return this.a.getDate()};l.getTime=function(){return this.a.getTime()};l.getUTCHours=function(){return this.a.getUTCHours()};l.setFullYear=function(a){this.a.setFullYear(a)};l.setMonth=function(a){this.a.setMonth(a)};l.setDate=function(a){this.a.setDate(a)}; l.add=function(a){if(a.p||a.n){var b=this.getMonth()+a.n+12*a.p,c=this.getYear()+Math.floor(b/12),b=b%12;0>b&&(b+=12);var e;t:{switch(b){case 1:e=0!=c%4||0==c%100&&0!=c%400?28:29;break t;case 5:case 8:case 10:case 3:e=30;break t}e=31}e=Math.min(e,this.getDate());this.setDate(1);this.setFullYear(c);this.setMonth(b);this.setDate(e)}a.m&&(b=new Date(this.getYear(),this.getMonth(),this.getDate(),12),a=new Date(b.getTime()+864E5*a.m),this.setDate(1),this.setFullYear(a.getFullYear()),this.setMonth(a.getMonth()), -this.setDate(a.getDate()),Y(this,a.getDate()))};l.r=function(){return[this.getFullYear(),x(this.getMonth()+1),x(this.getDate())].join("")+""};l.toString=function(){return this.r()};var Y=function(a,b){if(a.getDate()!=b){var c=a.getDate()b&&(b=2);--b;return Math.ceil(a/b)*b},Ha=function(a,b,c){a=a.getSelection();1==a.length&&(a=a[0],null!=a.row&&(null!=b.starttime&&(c+="&starttime="+b.starttime),null!=b.endtime&&(c+="&endtime="+b.endtime),null!=b.latency_lower&&(c+="&latency_lower="+b.latency_lower),null!=b.latency_upper&&(c+="&latency_upper="+b.latency_upper),b=c+"&detail="+a.row,window.location.href=b))}, -Ia=function(a,b,c,e,d){var f=new google.visualization.DataTable;f.addColumn("string","");f.addColumn("number","");f.addColumn({type:"string",role:"tooltip"});for(var g=0;gb&&(b=2);b-=1;return Math.ceil(a/b)*b},Ia=function(a,b,c){a=a.getSelection();1==a.length&&(a=a[0],null!=a.row&&(null!=b.starttime&&(c+="&starttime="+b.starttime),null!=b.endtime&&(c+="&endtime="+b.endtime),null!=b.latency_lower&&(c+="&latency_lower="+b.latency_lower),null!=b.latency_upper&&(c+="&latency_upper="+b.latency_upper),b=c+"&detail="+a.row,window.location.href=b))}, +Ja=function(a,b,c,e,d){var f=new google.visualization.DataTable;f.addColumn("string","");f.addColumn("number","");f.addColumn({type:"string",role:"tooltip"});for(var g=0;gb.length&&(f=b.length);for(var g=0;g>>0),ha=0,ja=function(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}},ka=function(a,b){var c=a.split("."),d=l;c[0]in d||!d.execScript||d.execScript("var "+c[0]);for(var e;c.length&&(e=c.shift());)c.length||void 0===b?d=d[e]?d[e]:d[e]={}:d[e]=b},p=function(a,b){function c(){}c.prototype=b.prototype;a.f=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.nc= function(a,c,g){return b.prototype[c].apply(a,Array.prototype.slice.call(arguments,2))}};var la=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,la);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))};p(la,Error);la.prototype.name="CustomError";var ma;var na=function(a,b){for(var c=a.split("%s"),d="",e=Array.prototype.slice.call(arguments,1);e.length&&1")&&(a=a.replace(sa,">"));-1!=a.indexOf('"')&&(a=a.replace(ta,"""));-1!=a.indexOf("'")&& -(a=a.replace(ua,"'"));-1!=a.indexOf("\x00")&&(a=a.replace(va,"�"));return a},qa=/&/g,ra=//g,ta=/"/g,ua=/'/g,va=/\x00/g,pa=/[\x00&<>"']/,q=function(a,b){return-1!=a.indexOf(b)},xa=function(a,b){return ab?1:0};var ya=function(a,b){b.unshift(a);la.call(this,na.apply(null,b));b.shift()};p(ya,la);ya.prototype.name="AssertionError"; -var za=function(a,b,c,d){var e="Assertion failed";if(c)var e=e+(": "+c),g=d;else a&&(e+=": "+a,g=b);throw new ya(""+e,g||[]);},r=function(a,b,c){a||za("",null,b,Array.prototype.slice.call(arguments,2))},Aa=function(a,b,c){fa(a)&&1==a.nodeType||za("Expected Element but got %s: %s.",[ca(a),a],b,Array.prototype.slice.call(arguments,2))},Ca=function(a,b,c,d){a instanceof b||za("Expected instanceof %s but got %s.",[Ba(b),Ba(a)],c,Array.prototype.slice.call(arguments,3))},Ba=function(a){return a instanceof -Function?a.displayName||a.name||"unknown type name":a instanceof Object?a.constructor.displayName||a.constructor.name||Object.prototype.toString.call(a):null===a?"null":typeof a};var s=Array.prototype,Da=s.indexOf?function(a,b,c){r(null!=a.length);return s.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(m(a))return m(b)&&1==b.length?a.indexOf(b,c):-1;for(;c=arguments.length?s.slice.call(a,b):s.slice.call(a,b,c)};var Ka=function(a){a=a.className;return m(a)&&a.match(/\S+/g)||[]},La=function(a,b){for(var c=Ka(a),d=Ia(arguments,1),e=c,g=0;gparseFloat(a))? -String(b):a}(),$a={},A=function(a){var b;if(!(b=$a[a])){b=0;for(var c=oa(String(Za)).split("."),d=oa(String(a)).split("."),e=Math.max(c.length,d.length),g=0;0==b&&g");c=c.join("")}c=a.createElement(c);d&&(m(d)?c.className=d:da(d)?c.className=d.join(" "):kb(c,d));2/g,ta=/"/g,ua=/'/g,va=/\x00/g,pa=/[\x00&<>"']/,xa=function(a,b){return ab?1:0};var ya=function(a,b){b.unshift(a);la.call(this,na.apply(null,b));b.shift()};p(ya,la);ya.prototype.name="AssertionError"; +var za=function(a,b,c,d){var e="Assertion failed";if(c)var e=e+(": "+c),g=d;else a&&(e+=": "+a,g=b);throw new ya(""+e,g||[]);},q=function(a,b,c){a||za("",null,b,Array.prototype.slice.call(arguments,2))},Aa=function(a,b,c){fa(a)&&1==a.nodeType||za("Expected Element but got %s: %s.",[ca(a),a],b,Array.prototype.slice.call(arguments,2))},Ba=function(a,b,c,d){a instanceof b||za("instanceof check failed.",null,c,Array.prototype.slice.call(arguments,3))};var r=Array.prototype,Ca=r.indexOf?function(a,b,c){q(null!=a.length);return r.indexOf.call(a,b,c)}:function(a,b,c){c=null==c?0:0>c?Math.max(0,a.length+c):c;if(m(a))return m(b)&&1==b.length?a.indexOf(b,c):-1;for(;c=arguments.length?r.slice.call(a,b):r.slice.call(a,b,c)};var Ja=function(a){a=a.className;return m(a)&&a.match(/\S+/g)||[]},Ka=function(a,b){for(var c=Ja(a),d=Ha(arguments,1),e=c,g=0;gparseFloat(a))?String(b):a}(),$a={},A=function(a){var b;if(!(b=$a[a])){b=0;for(var c=oa(String(Za)).split("."),d=oa(String(a)).split("."),e=Math.max(c.length,d.length),g=0;0==b&&g");c=c.join("")}c=a.createElement(c);d&&(m(d)?c.className=d:da(d)?c.className=d.join(" "):kb(c,d));2a},wb=function(a,b,c){if(!(a.nodeName in qb))if(3==a.nodeType)c?b.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):b.push(a.nodeValue);else if(a.nodeName in rb)b.push(rb[a.nodeName]);else for(a=a.firstChild;a;)wb(a,b,c),a=a.nextSibling},eb= function(a){this.Q=a||l.document||document};f=eb.prototype;f.mb=gb;f.a=function(a){return hb(this.Q,a)};f.o=function(a,b,c){return lb(this.Q,arguments)};f.createElement=function(a){return this.Q.createElement(a)};f.createTextNode=function(a){return this.Q.createTextNode(String(a))};f.appendChild=function(a,b){a.appendChild(b)};f.contains=ob; -f.I=function(a){var b;(b="A"==a.tagName||"INPUT"==a.tagName||"TEXTAREA"==a.tagName||"SELECT"==a.tagName||"BUTTON"==a.tagName?!a.disabled&&(!sb(a)||tb(a)):ub(a))&&w?(a=n(a.getBoundingClientRect)?a.getBoundingClientRect():{height:a.offsetHeight,width:a.offsetWidth},a=null!=a&&0=a.keyCode)a.keyCode=-1}catch(b){}};var Eb="closure_listenable_"+(1E6*Math.random()|0),Fb=0;var Gb=function(a,b,c,d,e){this.W=a;this.Ea=null;this.src=b;this.type=c;this.Fa=!!d;this.Ha=e;this.key=++Fb;this.ha=this.Ga=!1},Hb=function(a){a.ha=!0;a.W=null;a.Ea=null;a.src=null;a.Ha=null};var E=function(a){this.src=a;this.m={};this.ua=0};E.prototype.add=function(a,b,c,d,e){var g=a.toString();a=this.m[g];a||(a=this.m[g]=[],this.ua++);var h=Ib(a,b,d,e);-1e.keyCode||void 0!=e.returnValue)){t:{var g=!1;if(0== -e.keyCode)try{e.keyCode=-1;break t}catch(h){g=!0}if(g||void 0==e.returnValue)e.returnValue=!0}e=[];for(g=c.currentTarget;g;g=g.parentNode)e.push(g);for(var g=a.type,k=e.length-1;!c.$&&0<=k;k--)c.currentTarget=e[k],d&=Ub(e[k],g,!0,c);for(k=0;!c.$&&k>>0),Nb=function(a){r(a,"Listener can not be null.");if(n(a))return a; -r(a.handleEvent,"An object listener must have handleEvent method.");a[Vb]||(a[Vb]=function(b){return a.handleEvent(b)});return a[Vb]};var H=function(a){Bb.call(this);this.Eb=a;this.Ma={}};p(H,Bb);var Wb=[];H.prototype.c=function(a,b,c,d){da(b)||(b&&(Wb[0]=b.toString()),b=Wb);for(var e=0;e++d,"infinite loop")}c=this.dc;d=a.type||a;if(m(a))a=new C(a,c);else if(a instanceof C)a.target=a.target||c;else{var e=a;a=new C(d,c);Ta(a,e)}var e=!0,g;if(b)for(var h=b.length-1;!a.$&&0<=h;h--)g=a.currentTarget=b[h],e=Yb(g,d,!0,a)&&e;a.$||(g=a.currentTarget=c,e=Yb(g,d,!0,a)&&e,a.$||(e=Yb(g,d,!1,a)&&e));if(b)for(h=0;!a.$&&hb||b>jc(this))throw Error("Child component index out of bounds");this.F&&this.q||(this.F={},this.q=[]);if(a.getParent()==this){var d=dc(a);this.F[d]=a;Ga(this.q,a)}else Qa(this.F,dc(a),a);hc(a,this);Ja(this.q,b,0,a);if(a.g&&this.g&&a.getParent()==this)c=this.C(),c.insertBefore(a.a(),c.childNodes[b]||null);else if(c){this.d||this.o();c=N(this,b+1);b=this.C();c=c?c.d: -null;if(a.g)throw Error("Component already rendered");a.d||a.o();b?b.insertBefore(a.d,c||null):a.A.Q.body.appendChild(a.d);a.p&&!a.p.g||a.D()}else this.g&&!a.g&&a.d&&a.d.parentNode&&1==a.d.parentNode.nodeType&&a.D()};f.C=function(){return this.d}; -var kc=function(a){if(null==a.Ca){var b=a.g?a.d:a.A.Q.body,c;t:{c=fb(b);if(c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(b,null))){c=c.direction||c.getPropertyValue("direction")||"";break t}c=""}a.Ca="rtl"==(c||(b.currentStyle?b.currentStyle.direction:null)||b.style&&b.style.direction)}return a.Ca};L.prototype.ra=function(a){if(this.g)throw Error("Component already rendered");this.Ca=a}; -var jc=function(a){return a.q?a.q.length:0},gc=function(a,b){var c;a.F&&b?(c=a.F,c=(b in c?c[b]:void 0)||null):c=null;return c},N=function(a,b){return a.q?a.q[b]||null:null},ic=function(a,b,c){a.q&&t(a.q,b,c)},lc=function(a,b){return a.q&&b?Da(a.q,b):-1}; -L.prototype.removeChild=function(a,b){if(a){var c=m(a)?a:dc(a);a=gc(this,c);if(c&&a){var d=this.F;c in d&&delete d[c];Ga(this.q,a);b&&(a.ba(),a.d&&(c=a.d)&&c.parentNode&&c.parentNode.removeChild(c));hc(a,null)}}if(!a)throw Error("Child is not in parent component");return a};var mc,nc={oc:"activedescendant",tc:"atomic",uc:"autocomplete",wc:"busy",zc:"checked",Ec:"controls",Gc:"describedby",Jc:"disabled",Lc:"dropeffect",Mc:"expanded",Nc:"flowto",Pc:"grabbed",Tc:"haspopup",Vc:"hidden",Xc:"invalid",Yc:"label",Zc:"labelledby",$c:"level",ed:"live",pd:"multiline",qd:"multiselectable",ud:"orientation",vd:"owns",wd:"posinset",yd:"pressed",Cd:"readonly",Ed:"relevant",Fd:"required",Ld:"selected",Nd:"setsize",Pd:"sort",be:"valuemax",ce:"valuemin",de:"valuenow",ee:"valuetext"};var oc={pc:"alert",qc:"alertdialog",rc:"application",sc:"article",vc:"banner",xc:"button",yc:"checkbox",Ac:"columnheader",Bc:"combobox",Cc:"complementary",Dc:"contentinfo",Fc:"definition",Hc:"dialog",Ic:"directory",Kc:"document",Oc:"form",Qc:"grid",Rc:"gridcell",Sc:"group",Uc:"heading",Wc:"img",ad:"link",bd:"list",cd:"listbox",dd:"listitem",fd:"log",gd:"main",hd:"marquee",jd:"math",kd:"menu",ld:"menubar",md:"menuitem",nd:"menuitemcheckbox",od:"menuitemradio",rd:"navigation",sd:"note",td:"option", -xd:"presentation",zd:"progressbar",Ad:"radio",Bd:"radiogroup",Dd:"region",Gd:"row",Hd:"rowgroup",Id:"rowheader",Jd:"scrollbar",Kd:"search",Md:"separator",Od:"slider",Qd:"spinbutton",Rd:"status",Sd:"tab",Td:"tablist",Ud:"tabpanel",Vd:"textbox",Wd:"timer",Xd:"toolbar",Yd:"tooltip",Zd:"tree",$d:"treegrid",ae:"treeitem"};var pc=function(a,b){b?(r(Pa(oc,b),"No such ARIA role "+b),a.setAttribute("role",b)):a.removeAttribute("role")},rc=function(a,b,c){da(c)&&(c=c.join(" "));var d=qc(b);""===c||void 0==c?(mc||(mc={atomic:!1,autocomplete:"none",dropeffect:"none",haspopup:!1,live:"off",multiline:!1,multiselectable:!1,orientation:"vertical",readonly:!1,relevant:"additions text",required:!1,sort:"none",busy:!1,disabled:!1,hidden:!1,invalid:"false"}),c=mc,b in c?a.setAttribute(d,c[b]):a.removeAttribute(d)):a.setAttribute(d, -c)},qc=function(a){r(a,"ARIA attribute cannot be empty.");r(Pa(nc,a),"No such ARIA attribute "+a);return"aria-"+a};var uc=function(a,b,c,d,e){if(!(w||y&&A("525")))return!0;if(z&&e)return sc(a);if(e&&!d)return!1;"number"==typeof b&&(b=tc(b));if(!c&&(17==b||18==b||z&&91==b))return!1;if(y&&d&&c)switch(a){case 220:case 219:case 221:case 192:case 186:case 189:case 187:case 188:case 190:case 191:case 192:case 222:return!1}if(w&&d&&b==a)return!1;switch(a){case 13:return!0;case 27:return!y}return sc(a)},sc=function(a){if(48<=a&&57>=a||96<=a&&106>=a||65<=a&&90>=a||y&&0==a)return!0;switch(a){case 32:case 63:case 107:case 109:case 110:case 111:case 186:case 59:case 189:case 187:case 61:case 188:case 190:case 191:case 192:case 222:case 219:case 220:case 221:return!0; -default:return!1}},tc=function(a){if(x)a=vc(a);else if(z&&y)t:switch(a){case 93:a=91;break t}return a},vc=function(a){switch(a){case 61:return 187;case 59:return 186;case 173:return 189;case 224:return 91;case 0:return 224;default:return a}};var O=function(a,b){I.call(this);a&&wc(this,a,b)};p(O,I);f=O.prototype;f.d=null;f.Ia=null;f.Ya=null;f.Ja=null;f.r=-1;f.N=-1;f.lb=!1; -var xc={3:13,12:144,63232:38,63233:40,63234:37,63235:39,63236:112,63237:113,63238:114,63239:115,63240:116,63241:117,63242:118,63243:119,63244:120,63245:121,63246:122,63247:123,63248:44,63272:46,63273:36,63275:35,63276:33,63277:34,63289:144,63302:45},yc={Up:38,Down:40,Left:37,Right:39,Enter:13,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,"U+007F":46,Home:36,End:35,PageUp:33,PageDown:34,Insert:45},zc=w||y&&A("525"),Ac=z&&x; -O.prototype.Tb=function(a){y&&(17==this.r&&!a.ctrlKey||18==this.r&&!a.altKey||z&&91==this.r&&!a.metaKey)&&(this.N=this.r=-1);-1==this.r&&(a.ctrlKey&&17!=a.keyCode?this.r=17:a.altKey&&18!=a.keyCode?this.r=18:a.metaKey&&91!=a.keyCode&&(this.r=91));zc&&!uc(a.keyCode,this.r,a.shiftKey,a.ctrlKey,a.altKey)?this.handleEvent(a):(this.N=tc(a.keyCode),Ac&&(this.lb=a.altKey))};O.prototype.Ub=function(a){this.N=this.r=-1;this.lb=a.altKey}; -O.prototype.handleEvent=function(a){var b=a.O,c,d,e=b.altKey;w&&"keypress"==a.type?(c=this.N,d=13!=c&&27!=c?b.keyCode:0):y&&"keypress"==a.type?(c=this.N,d=0<=b.charCode&&63232>b.charCode&&sc(c)?b.charCode:0):Wa?(c=this.N,d=sc(c)?b.keyCode:0):(c=b.keyCode||this.N,d=b.charCode||0,Ac&&(e=this.lb),z&&63==d&&224==c&&(c=191));var g=c=tc(c),h=b.keyIdentifier;c?63232<=c&&c in xc?g=xc[c]:25==c&&a.shiftKey&&(g=9):h&&h in yc&&(g=yc[h]);a=g==this.r;this.r=g;b=new Bc(g,d,a,b);b.altKey=e;this.dispatchEvent(b)}; -O.prototype.a=function(){return this.d};var wc=function(a,b,c){a.Ja&&a.detach();a.d=b;a.Ia=F(a.d,"keypress",a,c);a.Ya=F(a.d,"keydown",a.Tb,c,a);a.Ja=F(a.d,"keyup",a.Ub,c,a)};O.prototype.detach=function(){this.Ia&&(G(this.Ia),G(this.Ya),G(this.Ja),this.Ja=this.Ya=this.Ia=null);this.d=null;this.N=this.r=-1};var Bc=function(a,b,c,d){D.call(this,d);this.type="key";this.keyCode=a;this.charCode=b;this.repeat=c};p(Bc,D);var P=function(a){if(a.classList)return a.classList;a=a.className;return m(a)&&a.match(/\S+/g)||[]},Cc=function(a,b){return a.classList?a.classList.contains(b):u(P(a),b)},Dc=function(a,b){a.classList?a.classList.add(b):Cc(a,b)||(a.className+=0=a.keyCode)a.keyCode=-1}catch(b){}};var Eb="closure_listenable_"+(1E6*Math.random()|0),Fb=0;var Gb=function(a,b,c,d,e){this.W=a;this.Ea=null;this.src=b;this.type=c;this.Fa=!!d;this.Ha=e;this.key=++Fb;this.ha=this.Ga=!1},Hb=function(a){a.ha=!0;a.W=null;a.Ea=null;a.src=null;a.Ha=null};var D=function(a){this.src=a;this.m={};this.ua=0};D.prototype.add=function(a,b,c,d,e){var g=a.toString();a=this.m[g];a||(a=this.m[g]=[],this.ua++);var h=Ib(a,b,d,e);-1e.keyCode||void 0!=e.returnValue)){t:{var g=!1;if(0== +e.keyCode)try{e.keyCode=-1;break t}catch(h){g=!0}if(g||void 0==e.returnValue)e.returnValue=!0}e=[];for(g=c.currentTarget;g;g=g.parentNode)e.push(g);for(var g=a.type,k=e.length-1;!c.$&&0<=k;k--)c.currentTarget=e[k],d&=Ub(e[k],g,!0,c);for(k=0;!c.$&&k>>0),Nb=function(a){q(a,"Listener can not be null.");if(n(a))return a; +q(a.handleEvent,"An object listener must have handleEvent method.");a[Vb]||(a[Vb]=function(b){return a.handleEvent(b)});return a[Vb]};var G=function(a){Bb.call(this);this.Eb=a;this.Ma={}};p(G,Bb);var Wb=[];G.prototype.c=function(a,b,c,d){da(b)||(b&&(Wb[0]=b.toString()),b=Wb);for(var e=0;e++d,"infinite loop")}c=this.dc;d=a.type||a;if(m(a))a=new B(a,c);else if(a instanceof B)a.target=a.target||c;else{var e=a;a=new B(d,c);Sa(a,e)}var e=!0,g;if(b)for(var h=b.length-1;!a.$&&0<=h;h--)g=a.currentTarget=b[h],e=Yb(g,d,!0,a)&&e;a.$||(g=a.currentTarget=c,e=Yb(g,d,!0,a)&&e,a.$||(e=Yb(g,d,!1,a)&&e));if(b)for(h=0;!a.$&&hb||b>M(this))throw Error("Child component index out of bounds");this.F&&this.q||(this.F={},this.q=[]);if(a.getParent()==this){var d=dc(a);this.F[d]=a;Fa(this.q,a)}else Pa(this.F,dc(a),a);hc(a,this);Ia(this.q,b,0,a);if(a.g&&this.g&&a.getParent()==this)c=this.C(),c.insertBefore(a.a(),c.childNodes[b]||null);else if(c){this.d||this.o();c=N(this,b+1);b=this.C();c=c?c.d:null; +if(a.g)throw Error("Component already rendered");a.d||a.o();b?b.insertBefore(a.d,c||null):a.A.Q.body.appendChild(a.d);a.p&&!a.p.g||a.D()}else this.g&&!a.g&&a.d&&a.d.parentNode&&1==a.d.parentNode.nodeType&&a.D()};f.C=function(){return this.d}; +var jc=function(a){if(null==a.Ca){var b=a.g?a.d:a.A.Q.body,c;t:{c=fb(b);if(c.defaultView&&c.defaultView.getComputedStyle&&(c=c.defaultView.getComputedStyle(b,null))){c=c.direction||c.getPropertyValue("direction")||"";break t}c=""}a.Ca="rtl"==(c||(b.currentStyle?b.currentStyle.direction:null)||b.style&&b.style.direction)}return a.Ca};L.prototype.ra=function(a){if(this.g)throw Error("Component already rendered");this.Ca=a}; +var M=function(a){return a.q?a.q.length:0},gc=function(a,b){var c;a.F&&b?(c=a.F,c=(b in c?c[b]:void 0)||null):c=null;return c},N=function(a,b){return a.q?a.q[b]||null:null},ic=function(a,b,c){a.q&&s(a.q,b,c)},kc=function(a,b){return a.q&&b?Ca(a.q,b):-1}; +L.prototype.removeChild=function(a,b){if(a){var c=m(a)?a:dc(a);a=gc(this,c);if(c&&a){var d=this.F;c in d&&delete d[c];Fa(this.q,a);b&&(a.ba(),a.d&&(c=a.d)&&c.parentNode&&c.parentNode.removeChild(c));hc(a,null)}}if(!a)throw Error("Child is not in parent component");return a};var lc,mc={oc:"activedescendant",tc:"atomic",uc:"autocomplete",wc:"busy",zc:"checked",Ec:"controls",Gc:"describedby",Jc:"disabled",Lc:"dropeffect",Mc:"expanded",Nc:"flowto",Pc:"grabbed",Tc:"haspopup",Vc:"hidden",Xc:"invalid",Yc:"label",Zc:"labelledby",$c:"level",ed:"live",pd:"multiline",qd:"multiselectable",ud:"orientation",vd:"owns",wd:"posinset",yd:"pressed",Cd:"readonly",Ed:"relevant",Fd:"required",Ld:"selected",Nd:"setsize",Pd:"sort",be:"valuemax",ce:"valuemin",de:"valuenow",ee:"valuetext"};var nc={pc:"alert",qc:"alertdialog",rc:"application",sc:"article",vc:"banner",xc:"button",yc:"checkbox",Ac:"columnheader",Bc:"combobox",Cc:"complementary",Dc:"contentinfo",Fc:"definition",Hc:"dialog",Ic:"directory",Kc:"document",Oc:"form",Qc:"grid",Rc:"gridcell",Sc:"group",Uc:"heading",Wc:"img",ad:"link",bd:"list",cd:"listbox",dd:"listitem",fd:"log",gd:"main",hd:"marquee",jd:"math",kd:"menu",ld:"menubar",md:"menuitem",nd:"menuitemcheckbox",od:"menuitemradio",rd:"navigation",sd:"note",td:"option", +xd:"presentation",zd:"progressbar",Ad:"radio",Bd:"radiogroup",Dd:"region",Gd:"row",Hd:"rowgroup",Id:"rowheader",Jd:"scrollbar",Kd:"search",Md:"separator",Od:"slider",Qd:"spinbutton",Rd:"status",Sd:"tab",Td:"tablist",Ud:"tabpanel",Vd:"textbox",Wd:"timer",Xd:"toolbar",Yd:"tooltip",Zd:"tree",$d:"treegrid",ae:"treeitem"};var oc=function(a,b){b?(q(Oa(nc,b),"No such ARIA role "+b),a.setAttribute("role",b)):a.removeAttribute("role")},qc=function(a,b,c){da(c)&&(c=c.join(" "));var d=pc(b);""===c||void 0==c?(lc||(lc={atomic:!1,autocomplete:"none",dropeffect:"none",haspopup:!1,live:"off",multiline:!1,multiselectable:!1,orientation:"vertical",readonly:!1,relevant:"additions text",required:!1,sort:"none",busy:!1,disabled:!1,hidden:!1,invalid:"false"}),c=lc,b in c?a.setAttribute(d,c[b]):a.removeAttribute(d)):a.setAttribute(d, +c)},pc=function(a){q(a,"ARIA attribute cannot be empty.");q(Oa(mc,a),"No such ARIA attribute "+a);return"aria-"+a};var tc=function(a,b,c,d,e){if(!(v||x&&A("525")))return!0;if(y&&e)return rc(a);if(e&&!d)return!1;"number"==typeof b&&(b=sc(b));if(!c&&(17==b||18==b||y&&91==b))return!1;if(x&&d&&c)switch(a){case 220:case 219:case 221:case 192:case 186:case 189:case 187:case 188:case 190:case 191:case 192:case 222:return!1}if(v&&d&&b==a)return!1;switch(a){case 13:return!0;case 27:return!x}return rc(a)},rc=function(a){if(48<=a&&57>=a||96<=a&&106>=a||65<=a&&90>=a||x&&0==a)return!0;switch(a){case 32:case 63:case 107:case 109:case 110:case 111:case 186:case 59:case 189:case 187:case 61:case 188:case 190:case 191:case 192:case 222:case 219:case 220:case 221:return!0; +default:return!1}},sc=function(a){if(w)a=uc(a);else if(y&&x)t:switch(a){case 93:a=91;break t}return a},uc=function(a){switch(a){case 61:return 187;case 59:return 186;case 173:return 189;case 224:return 91;case 0:return 224;default:return a}};var O=function(a,b){H.call(this);a&&vc(this,a,b)};p(O,H);f=O.prototype;f.d=null;f.Ia=null;f.Ya=null;f.Ja=null;f.r=-1;f.N=-1;f.lb=!1; +var wc={3:13,12:144,63232:38,63233:40,63234:37,63235:39,63236:112,63237:113,63238:114,63239:115,63240:116,63241:117,63242:118,63243:119,63244:120,63245:121,63246:122,63247:123,63248:44,63272:46,63273:36,63275:35,63276:33,63277:34,63289:144,63302:45},xc={Up:38,Down:40,Left:37,Right:39,Enter:13,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,"U+007F":46,Home:36,End:35,PageUp:33,PageDown:34,Insert:45},yc=v||x&&A("525"),zc=y&&w; +O.prototype.Tb=function(a){x&&(17==this.r&&!a.ctrlKey||18==this.r&&!a.altKey||y&&91==this.r&&!a.metaKey)&&(this.N=this.r=-1);-1==this.r&&(a.ctrlKey&&17!=a.keyCode?this.r=17:a.altKey&&18!=a.keyCode?this.r=18:a.metaKey&&91!=a.keyCode&&(this.r=91));yc&&!tc(a.keyCode,this.r,a.shiftKey,a.ctrlKey,a.altKey)?this.handleEvent(a):(this.N=sc(a.keyCode),zc&&(this.lb=a.altKey))};O.prototype.Ub=function(a){this.N=this.r=-1;this.lb=a.altKey}; +O.prototype.handleEvent=function(a){var b=a.O,c,d,e=b.altKey;v&&"keypress"==a.type?(c=this.N,d=13!=c&&27!=c?b.keyCode:0):x&&"keypress"==a.type?(c=this.N,d=0<=b.charCode&&63232>b.charCode&&rc(c)?b.charCode:0):Wa?(c=this.N,d=rc(c)?b.keyCode:0):(c=b.keyCode||this.N,d=b.charCode||0,zc&&(e=this.lb),y&&63==d&&224==c&&(c=191));var g=c=sc(c),h=b.keyIdentifier;c?63232<=c&&c in wc?g=wc[c]:25==c&&a.shiftKey&&(g=9):h&&h in xc&&(g=xc[h]);a=g==this.r;this.r=g;b=new Ac(g,d,a,b);b.altKey=e;this.dispatchEvent(b)}; +O.prototype.a=function(){return this.d};var vc=function(a,b,c){a.Ja&&a.detach();a.d=b;a.Ia=E(a.d,"keypress",a,c);a.Ya=E(a.d,"keydown",a.Tb,c,a);a.Ja=E(a.d,"keyup",a.Ub,c,a)};O.prototype.detach=function(){this.Ia&&(F(this.Ia),F(this.Ya),F(this.Ja),this.Ja=this.Ya=this.Ia=null);this.d=null;this.N=this.r=-1};var Ac=function(a,b,c,d){C.call(this,d);this.type="key";this.keyCode=a;this.charCode=b;this.repeat=c};p(Ac,C);var Q=function(a){if(a.classList)return a.classList;a=a.className;return m(a)&&a.match(/\S+/g)||[]},Bc=function(a,b){return a.classList?a.classList.contains(b):t(Q(a),b)},Cc=function(a,b){a.classList?a.classList.add(b):Bc(a,b)||(a.className+=0this.e&&b<=this.e?this.e++:athis.e&&this.e--}; -W.prototype.removeChild=function(a,b){a=m(a)?gc(this,a):a;Ca(a,T);if(a){var c=lc(this,a);-1!=c&&(c==this.e?(a.B(!1),this.e=-1):ca?c-1:a},0)},id=function(a){jd(a,function(a,c){return(a+1)%c},a.e)},hd=function(a){jd(a,function(a,c){a--;return 0>a?c-1:a},a.e)},jd=function(a,b,c){c=0>c?lc(a,a.i):c;var d=jc(a);c=b.call(a,c,d);for(var e=0;e<=d;){var g=N(a,c);if(g&&g.s()&&g.isEnabled()&&g.l&2){a.Wa(c);break}e++;c=b.call(a,c,d)}};W.prototype.Wa=function(a){ed(this,a)};var kd=function(){};p(kd,S);ba(kd);f=kd.prototype;f.v=function(){return"goog-tab"};f.fa=function(){return"tab"};f.o=function(a){var b=kd.f.o.call(this,a);(a=a.Ua())&&this.Xa(b,a);return b};f.K=function(a,b){b=kd.f.K.call(this,a,b);var c=this.Ua(b);c&&(a.tb=c);a.h&8&&(c=a.getParent())&&n(c.V)&&(a.t(8,!1),c.V(a));return b};f.Ua=function(a){return a.title||""};f.Xa=function(a,b){a&&(a.title=b||"")};var ld=function(a,b,c){T.call(this,a,b||kd.ia(),c);$c(this,8,!0);this.T|=9};p(ld,T);ld.prototype.Ua=function(){return this.tb};ld.prototype.Xa=function(a){this.Ab().Xa(this.a(),a);this.tb=a};Ic("goog-tab",function(){return new ld(null)});var X=function(){this.Hb="tablist"};p(X,Q);ba(X);X.prototype.v=function(){return"goog-tab-bar"};X.prototype.bb=function(a,b,c){this.Bb||(this.Ka||md(this),this.Bb=Ra(this.Ka));var d=this.Bb[b];d?(Mc(a,nd(d)),a.yb=d):X.f.bb.call(this,a,b,c)};X.prototype.ta=function(a){var b=X.f.ta.call(this,a);this.Ka||md(this);b.push(this.Ka[a.yb]);return b};var md=function(a){var b=a.v();a.Ka={top:b+"-top",bottom:b+"-bottom",start:b+"-start",end:b+"-end"}};var Y=function(a,b,c){a=a||"top";Mc(this,nd(a));this.yb=a;W.call(this,this.L,b||X.ia(),c);od(this)};p(Y,W);f=Y.prototype;f.ac=!0;f.H=null;f.D=function(){Y.f.D.call(this);od(this)};f.removeChild=function(a,b){pd(this,a);return Y.f.removeChild.call(this,a,b)};f.Wa=function(a){Y.f.Wa.call(this,a);this.ac&&this.V(N(this,a))};f.V=function(a){a?Yc(a,!0):this.H&&Yc(this.H,!1)}; -var pd=function(a,b){if(b&&b==a.H){for(var c=lc(a,b),d=c-1;b=N(a,d);d--)if(b.s()&&b.isEnabled()){a.V(b);return}for(c+=1;b=N(a,c);c++)if(b.s()&&b.isEnabled()){a.V(b);return}a.V(null)}};f=Y.prototype;f.Zb=function(a){this.H&&this.H!=a.target&&Yc(this.H,!1);this.H=a.target};f.$b=function(a){a.target==this.H&&(this.H=null)};f.Xb=function(a){pd(this,a.target)};f.Yb=function(a){pd(this,a.target)};f.na=function(){N(this,this.e)||this.B(this.H||N(this,0))}; -var od=function(a){fc(a).c(a,"select",a.Zb).c(a,"unselect",a.$b).c(a,"disable",a.Xb).c(a,"hide",a.Yb)},nd=function(a){return"start"==a||"end"==a?"vertical":"horizontal"};Ic("goog-tab-bar",function(){return new Y});var Z=function(a,b,c,d,e){function g(a){a&&(a.tabIndex=0,pc(a,h.fa()),Dc(a,"goog-zippy-header"),qd(h,a),a&&h.Pb.c(a,"keydown",h.Qb))}I.call(this);this.A=e||gb();this.R=this.A.a(a)||null;this.Aa=this.A.a(d||null);this.ea=(this.Qa=n(b)?b:null)||!b?null:this.A.a(b);this.k=1==c;this.Pb=new H(this);this.rb=new H(this);var h=this;g(this.R);g(this.Aa);this.S(this.k)};p(Z,I);f=Z.prototype;f.Z=!0;f.fa=function(){return"tab"};f.C=function(){return this.ea};f.toggle=function(){this.S(!this.k)}; -f.S=function(a){this.ea?J(this.ea,a):a&&this.Qa&&(this.ea=this.Qa());this.ea&&Dc(this.ea,"goog-zippy-content");if(this.Aa)J(this.R,!a),J(this.Aa,a);else if(this.R){var b=this.R;a?Dc(b,"goog-zippy-expanded"):Fc(b,"goog-zippy-expanded");b=this.R;a?Fc(b,"goog-zippy-collapsed"):Dc(b,"goog-zippy-collapsed");rc(this.R,"expanded",a)}this.k=a;this.dispatchEvent(new rd("toggle",this))};f.qb=function(){return this.Z};f.Pa=function(a){this.Z!=a&&((this.Z=a)?(qd(this,this.R),qd(this,this.Aa)):this.rb.ab())}; -var qd=function(a,b){b&&a.rb.c(b,"click",a.bc)};Z.prototype.Qb=function(a){if(13==a.keyCode||32==a.keyCode)this.toggle(),this.dispatchEvent(new C("action",this)),a.preventDefault(),a.stopPropagation()};Z.prototype.bc=function(){this.toggle();this.dispatchEvent(new C("action",this))};var rd=function(a,b){C.call(this,a,b)};p(rd,C);var td=function(a,b){this.pb=[];for(var c=ib("span","ae-zippy",hb(document,a)),d=0,e;e=c[d];d++){var g=e.parentNode.parentNode.parentNode;if(void 0!=g.nextElementSibling)g=g.nextElementSibling;else for(g=g.nextSibling;g&&1!=g.nodeType;)g=g.nextSibling;e=new Z(e,g,!1);this.pb.push(e)}this.hc=new sd(this.pb,hb(document,b))};td.prototype.lc=function(){return this.hc};td.prototype.mc=function(){return this.pb}; -var sd=function(a,b){this.va=a;if(this.va.length)for(var c=0,d;d=this.va[c];c++)F(d,"toggle",this.Wb,!1,this);this.La=0;this.k=!1;c="ae-toggle ae-plus ae-action";this.va.length||(c+=" ae-disabled");this.P=mb("span",{className:c},"Expand All");F(this.P,"click",this.Vb,!1,this);b&&b.appendChild(this.P)};sd.prototype.Vb=function(){this.va.length&&this.S(!this.k)}; -sd.prototype.Wb=function(a){a=a.currentTarget;a.k?this.La+=1:--this.La;a.k!=this.k&&(a.k?(this.k=!0,ud(this,!0)):0==this.La&&(this.k=!1,ud(this,!1)))};sd.prototype.S=function(a){this.k=a;a=0;for(var b;b=this.va[a];a++)b.k!=this.k&&b.S(this.k);ud(this)}; -var ud=function(a,b){(void 0!==b?b:a.k)?(Na(a.P,"ae-plus"),La(a.P,"ae-minus"),pb(a.P,"Collapse All")):(Na(a.P,"ae-minus"),La(a.P,"ae-plus"),pb(a.P,"Expand All"))},vd=function(a){this.cc=a;this.Db={};var b,c=mb("div",{},b=mb("div",{id:"ae-stats-details-tabs",className:"goog-tab-bar goog-tab-bar-top"}),mb("div",{className:"goog-tab-bar-clear"}),a=mb("div",{id:"ae-stats-details-tabs-content",className:"goog-tab-content"})),d=new Y;d.K(b);F(d,"select",this.Cb,!1,this);F(d,"unselect",this.Cb,!1,this); -b=0;for(var e;e=this.cc[b];b++)if(e=hb(document,"ae-stats-details-"+e)){var g=ib("h2",null,e)[0],h;h=g;var k=void 0;db&&"innerText"in h?k=h.innerText.replace(/(\r\n|\r|\n)/g,"\n"):(k=[],wb(h,k,!0),k=k.join(""));k=k.replace(/ \xAD /g," ").replace(/\xAD/g,"");k=k.replace(/\u200B/g,"");db||(k=k.replace(/ +/g," "));" "!=k&&(k=k.replace(/^\s*/,""));h=k;g&&g.parentNode&&g.parentNode.removeChild(g);g=new ld(h);this.Db[ia(g)]=e;d.Da(g,!0);a.appendChild(e);0==b?d.V(g):J(e,!1)}hb(document,"bd").appendChild(c)}; -vd.prototype.Cb=function(a){var b=this.Db[ia(a.target)];J(b,"select"==a.type)};ka("ae.Stats.Details.Tabs",vd);ka("goog.ui.Zippy",Z);Z.prototype.setExpanded=Z.prototype.S;ka("ae.Stats.MakeZippys",td);td.prototype.getExpandCollapse=td.prototype.lc;td.prototype.getZippys=td.prototype.mc;sd.prototype.setExpanded=sd.prototype.S;var $=function(){this.cb=[];this.jb=[]},wd=[[5,.2,1],[6,.2,1.2],[5,.25,1.25],[6,.25,1.5],[4,.5,2],[5,.5,2.5],[6,.5,3],[4,1,4],[5,1,5],[6,1,6],[4,2,8],[5,2,10]],xd=function(a){if(0>=a)return[2,.5,1];for(var b=1;1>a;)a*=10,b/=10;for(;10<=a;)a/=10,b*=10;for(var c=0;c');a.write('
');for(var e=0;e<=b;e++)a.write(''),a.write(''),a.write(" "+e*c+"");a.write("
\n")}; -$.prototype.kc=function(){this.jb=[];var a=xd(this.gb),b=a[0],c=a[1],a=100/a[2];this.write('\n');yd(this,b,c,a);for(var d=0;d\n\n")}; +$.prototype.kc=function(){this.jb=[];var a=wd(this.gb),b=a[0],c=a[1],a=100/a[2];this.write('
');0'),this.write(e.label),0"));this.write("");this.write('
');0this.e&&b<=this.e?this.e++:athis.e&&this.e--}; +W.prototype.removeChild=function(a,b){a=m(a)?gc(this,a):a;Ba(a,T);if(a){var c=kc(this,a);-1!=c&&(c==this.e?(a.B(!1),this.e=-1):ca?c-1:a},0)},hd=function(a){id(a,function(a,c){return(a+1)%c},a.e)},gd=function(a){id(a,function(a,c){a--;return 0>a?c-1:a},a.e)},id=function(a,b,c){c=0>c?kc(a,a.i):c;var d=M(a);c=b.call(a,c,d);for(var e=0;e<=d;){var g=N(a,c);if(g&&g.s()&&g.isEnabled()&&g.l&2){a.Wa(c);break}e++;c=b.call(a,c,d)}};W.prototype.Wa=function(a){dd(this,a)};var jd=function(){};p(jd,S);ba(jd);f=jd.prototype;f.v=function(){return"goog-tab"};f.fa=function(){return"tab"};f.o=function(a){var b=jd.f.o.call(this,a);(a=a.Ua())&&this.Xa(b,a);return b};f.K=function(a,b){b=jd.f.K.call(this,a,b);var c=this.Ua(b);c&&(a.tb=c);a.h&8&&(c=a.getParent())&&n(c.V)&&(a.t(8,!1),c.V(a));return b};f.Ua=function(a){return a.title||""};f.Xa=function(a,b){a&&(a.title=b||"")};var kd=function(a,b,c){T.call(this,a,b||jd.ia(),c);Zc(this,8,!0);this.T|=9};p(kd,T);kd.prototype.Ua=function(){return this.tb};kd.prototype.Xa=function(a){this.Ab().Xa(this.a(),a);this.tb=a};Hc("goog-tab",function(){return new kd(null)});var X=function(){this.Hb="tablist"};p(X,R);ba(X);X.prototype.v=function(){return"goog-tab-bar"};X.prototype.bb=function(a,b,c){this.Bb||(this.Ka||ld(this),this.Bb=Qa(this.Ka));var d=this.Bb[b];d?(Lc(a,md(d)),a.yb=d):X.f.bb.call(this,a,b,c)};X.prototype.ta=function(a){var b=X.f.ta.call(this,a);this.Ka||ld(this);b.push(this.Ka[a.yb]);return b};var ld=function(a){var b=a.v();a.Ka={top:b+"-top",bottom:b+"-bottom",start:b+"-start",end:b+"-end"}};var Y=function(a,b,c){a=a||"top";Lc(this,md(a));this.yb=a;W.call(this,this.L,b||X.ia(),c);nd(this)};p(Y,W);f=Y.prototype;f.ac=!0;f.H=null;f.D=function(){Y.f.D.call(this);nd(this)};f.removeChild=function(a,b){od(this,a);return Y.f.removeChild.call(this,a,b)};f.Wa=function(a){Y.f.Wa.call(this,a);this.ac&&this.V(N(this,a))};f.V=function(a){a?Xc(a,!0):this.H&&Xc(this.H,!1)}; +var od=function(a,b){if(b&&b==a.H){for(var c=kc(a,b),d=c-1;b=N(a,d);d--)if(b.s()&&b.isEnabled()){a.V(b);return}for(c+=1;b=N(a,c);c++)if(b.s()&&b.isEnabled()){a.V(b);return}a.V(null)}};f=Y.prototype;f.Zb=function(a){this.H&&this.H!=a.target&&Xc(this.H,!1);this.H=a.target};f.$b=function(a){a.target==this.H&&(this.H=null)};f.Xb=function(a){od(this,a.target)};f.Yb=function(a){od(this,a.target)};f.na=function(){N(this,this.e)||this.B(this.H||N(this,0))}; +var nd=function(a){fc(a).c(a,"select",a.Zb).c(a,"unselect",a.$b).c(a,"disable",a.Xb).c(a,"hide",a.Yb)},md=function(a){return"start"==a||"end"==a?"vertical":"horizontal"};Hc("goog-tab-bar",function(){return new Y});var Z=function(a,b,c,d,e){function g(a){a&&(a.tabIndex=0,oc(a,h.fa()),Cc(a,"goog-zippy-header"),pd(h,a),a&&h.Pb.c(a,"keydown",h.Qb))}H.call(this);this.A=e||gb();this.R=this.A.a(a)||null;this.Aa=this.A.a(d||null);this.ea=(this.Qa=n(b)?b:null)||!b?null:this.A.a(b);this.k=1==c;this.Pb=new G(this);this.rb=new G(this);var h=this;g(this.R);g(this.Aa);this.S(this.k)};p(Z,H);f=Z.prototype;f.Z=!0;f.fa=function(){return"tab"};f.C=function(){return this.ea};f.toggle=function(){this.S(!this.k)}; +f.S=function(a){this.ea?J(this.ea,a):a&&this.Qa&&(this.ea=this.Qa());this.ea&&Cc(this.ea,"goog-zippy-content");if(this.Aa)J(this.R,!a),J(this.Aa,a);else if(this.R){var b=this.R;a?Cc(b,"goog-zippy-expanded"):Ec(b,"goog-zippy-expanded");b=this.R;a?Ec(b,"goog-zippy-collapsed"):Cc(b,"goog-zippy-collapsed");qc(this.R,"expanded",a)}this.k=a;this.dispatchEvent(new qd("toggle",this))};f.qb=function(){return this.Z};f.Pa=function(a){this.Z!=a&&((this.Z=a)?(pd(this,this.R),pd(this,this.Aa)):this.rb.ab())}; +var pd=function(a,b){b&&a.rb.c(b,"click",a.bc)};Z.prototype.Qb=function(a){if(13==a.keyCode||32==a.keyCode)this.toggle(),this.dispatchEvent(new B("action",this)),a.preventDefault(),a.stopPropagation()};Z.prototype.bc=function(){this.toggle();this.dispatchEvent(new B("action",this))};var qd=function(a,b){B.call(this,a,b)};p(qd,B);var sd=function(a,b){this.pb=[];for(var c=ib("span","ae-zippy",hb(document,a)),d=0,e;e=c[d];d++){var g=e.parentNode.parentNode.parentNode;if(void 0!=g.nextElementSibling)g=g.nextElementSibling;else for(g=g.nextSibling;g&&1!=g.nodeType;)g=g.nextSibling;e=new Z(e,g,!1);this.pb.push(e)}this.hc=new rd(this.pb,hb(document,b))};sd.prototype.lc=function(){return this.hc};sd.prototype.mc=function(){return this.pb}; +var rd=function(a,b){this.va=a;if(this.va.length)for(var c=0,d;d=this.va[c];c++)E(d,"toggle",this.Wb,!1,this);this.La=0;this.k=!1;c="ae-toggle ae-plus ae-action";this.va.length||(c+=" ae-disabled");this.P=mb("span",{className:c},"Expand All");E(this.P,"click",this.Vb,!1,this);b&&b.appendChild(this.P)};rd.prototype.Vb=function(){this.va.length&&this.S(!this.k)}; +rd.prototype.Wb=function(a){a=a.currentTarget;this.La=a.k?this.La+1:this.La-1;a.k!=this.k&&(a.k?(this.k=!0,td(this,!0)):0==this.La&&(this.k=!1,td(this,!1)))};rd.prototype.S=function(a){this.k=a;a=0;for(var b;b=this.va[a];a++)b.k!=this.k&&b.S(this.k);td(this)}; +var td=function(a,b){(void 0!==b?b:a.k)?(Ma(a.P,"ae-plus"),Ka(a.P,"ae-minus"),pb(a.P,"Collapse All")):(Ma(a.P,"ae-minus"),Ka(a.P,"ae-plus"),pb(a.P,"Expand All"))},ud=function(a){this.cc=a;this.Db={};var b,c=mb("div",{},b=mb("div",{id:"ae-stats-details-tabs",className:"goog-tab-bar goog-tab-bar-top"}),mb("div",{className:"goog-tab-bar-clear"}),a=mb("div",{id:"ae-stats-details-tabs-content",className:"goog-tab-content"})),d=new Y;d.K(b);E(d,"select",this.Cb,!1,this);E(d,"unselect",this.Cb,!1,this); +b=0;for(var e;e=this.cc[b];b++)if(e=hb(document,"ae-stats-details-"+e)){var g=ib("h2",null,e)[0],h;h=g;var k=void 0;db&&"innerText"in h?k=h.innerText.replace(/(\r\n|\r|\n)/g,"\n"):(k=[],wb(h,k,!0),k=k.join(""));k=k.replace(/ \xAD /g," ").replace(/\xAD/g,"");k=k.replace(/\u200B/g,"");db||(k=k.replace(/ +/g," "));" "!=k&&(k=k.replace(/^\s*/,""));h=k;g&&g.parentNode&&g.parentNode.removeChild(g);g=new kd(h);this.Db[ia(g)]=e;d.Da(g,!0);a.appendChild(e);0==b?d.V(g):J(e,!1)}hb(document,"bd").appendChild(c)}; +ud.prototype.Cb=function(a){var b=this.Db[ia(a.target)];J(b,"select"==a.type)};ka("ae.Stats.Details.Tabs",ud);ka("goog.ui.Zippy",Z);Z.prototype.setExpanded=Z.prototype.S;ka("ae.Stats.MakeZippys",sd);sd.prototype.getExpandCollapse=sd.prototype.lc;sd.prototype.getZippys=sd.prototype.mc;rd.prototype.setExpanded=rd.prototype.S;var $=function(){this.cb=[];this.jb=[]},vd=[[5,.2,1],[6,.2,1.2],[5,.25,1.25],[6,.25,1.5],[4,.5,2],[5,.5,2.5],[6,.5,3],[4,1,4],[5,1,5],[6,1,6],[4,2,8],[5,2,10]],wd=function(a){if(0>=a)return[2,.5,1];for(var b=1;1>a;)a*=10,b/=10;for(;10<=a;)a/=10,b*=10;for(var c=0;c
');a.write('
');for(var e=0;e<=b;e++)a.write(''),a.write(''),a.write(" "+e*c+"");a.write("
\n');xd(this,b,c,a);for(var d=0;d\n\n")}yd(this,b,c,a);this.write("
');0'),this.write(e.label),0"));this.write("");this.write('
');0');this.write('');0'));0 '),this.write(e.zb),this.write(""));0");this.write("
\n");return this.jb.join("")};$.prototype.jc=function(a,b,c,d,e,g){this.gb=Math.max(this.gb,Math.max(b+c,b+d));this.cb.push({label:a,start:b,duration:c,fb:d,zb:e,ja:g})};ka("Gantt",$);$.prototype.add_bar=$.prototype.jc;$.prototype.draw=$.prototype.kc;})(); +this.write("");this.write("\n")}xd(this,b,c,a);this.write("\n");return this.jb.join("")};$.prototype.jc=function(a,b,c,d,e,g){this.gb=Math.max(this.gb,Math.max(b+c,b+d));this.cb.push({label:a,start:b,duration:c,fb:d,zb:e,ja:g})};ka("Gantt",$);$.prototype.add_bar=$.prototype.jc;$.prototype.draw=$.prototype.kc;})(); diff --git a/google/appengine/ext/mapreduce/input_readers.py b/google/appengine/ext/mapreduce/input_readers.py index 52ff6624..1acec331 100644 --- a/google/appengine/ext/mapreduce/input_readers.py +++ b/google/appengine/ext/mapreduce/input_readers.py @@ -45,8 +45,6 @@ "DatastoreInputReader", "DatastoreKeyInputReader", "FileInputReader", - "GoogleCloudStorageInputReader", - "GoogleCloudStorageRecordInputReader", "RandomStringInputReader", "RawDatastoreInputReader", "Error", @@ -99,7 +97,6 @@ try: - cloudstorage = None from google.appengine.ext import cloudstorage if hasattr(cloudstorage, "_STUB"): cloudstorage = None @@ -107,13 +104,6 @@ pass -if cloudstorage is None: - try: - import cloudstorage - except ImportError: - pass - - Error = errors.Error BadReaderParamsError = errors.BadReaderParamsError @@ -2736,9 +2726,6 @@ def __str__(self): return "CloudStorage [%s, %s]" % (status, names) -GoogleCloudStorageInputReader = _GoogleCloudStorageInputReader - - class _GoogleCloudStorageRecordInputReader(_GoogleCloudStorageInputReader): """Read data from a Google Cloud Storage file using LevelDB format. @@ -2788,9 +2775,6 @@ def next(self): self._record_reader = None -GoogleCloudStorageRecordInputReader = _GoogleCloudStorageRecordInputReader - - class _ReducerReader(_GoogleCloudStorageRecordInputReader): """Reader to read KeyValues records from GCS.""" diff --git a/google/appengine/ext/mapreduce/output_writers.py b/google/appengine/ext/mapreduce/output_writers.py index 18f611f4..5f321bf8 100644 --- a/google/appengine/ext/mapreduce/output_writers.py +++ b/google/appengine/ext/mapreduce/output_writers.py @@ -43,9 +43,6 @@ "FileRecordsOutputWriter", "GoogleCloudStorageConsistentOutputWriter", "GoogleCloudStorageConsistentRecordOutputWriter", - "GoogleCloudStorageKeyValueOutputWriter", - "GoogleCloudStorageOutputWriter", - "GoogleCloudStorageRecordOutputWriter", "KeyValueBlobstoreOutputWriter", "KeyValueFileOutputWriter", "COUNTER_IO_WRITE_BYTES", @@ -96,7 +93,6 @@ try: import cloudstorage from cloudstorage import cloudstorage_api - from cloudstorage import errors as cloud_errors except ImportError: pass @@ -973,42 +969,16 @@ class _GoogleCloudStorageBase(shard_life_cycle._ShardLifeCycle, be applied by the writer. CONTENT_TYPE_PARAM: mime type to apply on the files. If not provided, Google Cloud Storage will apply its default. - TMP_BUCKET_NAME_PARAM: name of the bucket used for writing tmp files by - consistent GCS output writers. Defaults to BUCKET_NAME_PARAM if not set. """ BUCKET_NAME_PARAM = "bucket_name" - TMP_BUCKET_NAME_PARAM = "tmp_bucket_name" ACL_PARAM = "acl" NAMING_FORMAT_PARAM = "naming_format" CONTENT_TYPE_PARAM = "content_type" + _NO_DUPLICATE = "no_duplicate" _ACCOUNT_ID_PARAM = "account_id" - _TMP_ACCOUNT_ID_PARAM = "tmp_account_id" - - @classmethod - def _get_gcs_bucket(cls, writer_spec): - return writer_spec[cls.BUCKET_NAME_PARAM] - - @classmethod - def _get_account_id(cls, writer_spec): - return writer_spec.get(cls._ACCOUNT_ID_PARAM, None) - - @classmethod - def _get_tmp_gcs_bucket(cls, writer_spec): - """Returns bucket used for writing tmp files.""" - if cls.TMP_BUCKET_NAME_PARAM in writer_spec: - return writer_spec[cls.TMP_BUCKET_NAME_PARAM] - return cls._get_gcs_bucket(writer_spec) - - @classmethod - def _get_tmp_account_id(cls, writer_spec): - """Returns the account id to use with tmp bucket.""" - - if cls.TMP_BUCKET_NAME_PARAM in writer_spec: - return writer_spec.get(cls._TMP_ACCOUNT_ID_PARAM, None) - return cls._get_account_id(writer_spec) class _GoogleCloudStorageOutputWriterBase(_GoogleCloudStorageBase): @@ -1108,22 +1078,18 @@ def validate(cls, mapper_spec): except ValueError, error: raise errors.BadWriterParamsError("Bad bucket name, %s" % (error)) + if writer_spec.get(cls._NO_DUPLICATE, False) not in (True, False): + raise errors.BadWriterParamsError("No duplicate must a boolean.") + cls._generate_filename(writer_spec, "name", "id", 0) cls._generate_filename(writer_spec, "name", "id", 0, 1, 0) @classmethod - def _open_file(cls, writer_spec, filename_suffix, use_tmp_bucket=False): + def _open_file(cls, writer_spec, filename_suffix): """Opens a new gcs file for writing.""" - if use_tmp_bucket: - bucket = cls._get_tmp_gcs_bucket(writer_spec) - account_id = cls._get_tmp_account_id(writer_spec) - else: - bucket = cls._get_gcs_bucket(writer_spec) - account_id = cls._get_account_id(writer_spec) - - filename = "/%s/%s" % (bucket, filename_suffix) + filename = "/%s/%s" % (writer_spec[cls.BUCKET_NAME_PARAM], filename_suffix) content_type = writer_spec.get(cls.CONTENT_TYPE_PARAM, None) @@ -1131,6 +1097,8 @@ def _open_file(cls, writer_spec, filename_suffix, use_tmp_bucket=False): if cls.ACL_PARAM in writer_spec: options["x-goog-acl"] = writer_spec.get(cls.ACL_PARAM) + account_id = writer_spec.get(cls._ACCOUNT_ID_PARAM, None) + return cloudstorage.open(filename, mode="w", content_type=content_type, options=options, _account_id=account_id) @@ -1190,7 +1158,6 @@ class _GoogleCloudStorageOutputWriter(_GoogleCloudStorageOutputWriterBase): _JSON_NO_DUP = "no_dup" _VALID_LENGTH = "x-goog-meta-gae-mr-valid-length" - _NO_DUPLICATE = "no_duplicate" def __init__(self, streaming_buffer, writer_spec=None): @@ -1216,14 +1183,6 @@ def __init__(self, streaming_buffer, writer_spec=None): self._seg_valid_length = 0 - @classmethod - def validate(cls, mapper_spec): - """Inherit docs.""" - writer_spec = cls.get_params(mapper_spec, allow_old=False) - if writer_spec.get(cls._NO_DUPLICATE, False) not in (True, False): - raise errors.BadWriterParamsError("No duplicate must a boolean.") - super(_GoogleCloudStorageOutputWriter, cls).validate(mapper_spec) - def _get_write_buffer(self): return self._streaming_buffer @@ -1347,9 +1306,6 @@ def _get_filename_for_test(self): return self._streaming_buffer.name -GoogleCloudStorageOutputWriter = _GoogleCloudStorageOutputWriter - - class _ConsistentStatus(object): """Object used to pass status to the next slice.""" @@ -1428,10 +1384,10 @@ def create(cls, mr_spec, shard_number, shard_attempt, _writer_state=None): return cls(status) - def _remove_tmpfile(self, filename, writer_spec): + def _remove_file(self, filename, writer_spec): if not filename: return - account_id = self._get_tmp_account_id(writer_spec) + account_id = writer_spec.get(self._ACCOUNT_ID_PARAM, None) try: cloudstorage_api.delete(filename, _account_id=account_id) except cloud_errors.NotFoundError: @@ -1443,7 +1399,7 @@ def _rewrite_tmpfile(self, mainfile, tmpfile, writer_spec): return - account_id = self._get_tmp_account_id(writer_spec) + account_id = writer_spec.get(self._ACCOUNT_ID_PARAM, None) f = cloudstorage_api.open(tmpfile, _account_id=account_id) data = f.read(self._REWRITE_BLOCK_SIZE) @@ -1468,7 +1424,7 @@ def _create_tmpfile(cls, status): id=status.mapreduce_id, shard=status.shard, random=random.getrandbits(cls._RAND_BITS)) - return cls._open_file(status.writer_spec, filename, use_tmp_bucket=True) + return cls._open_file(status.writer_spec, filename) def begin_slice(self, slice_ctx): status = self.status @@ -1476,7 +1432,7 @@ def begin_slice(self, slice_ctx): if status.tmpfile_1ago: - self._remove_tmpfile(status.tmpfile_1ago.name, writer_spec) + self._remove_file(status.tmpfile_1ago.name, writer_spec) if status.tmpfile: @@ -1492,7 +1448,7 @@ def begin_slice(self, slice_ctx): if status.mainfile.closed: status.tmpfile.close() - self._remove_tmpfile(status.tmpfile.name, writer_spec) + self._remove_file(status.tmpfile.name, writer_spec) @classmethod def from_json(cls, state): @@ -1514,11 +1470,11 @@ def _try_to_clean_garbage(self, writer_spec): tmpl = string.Template(self._TMPFILE_PREFIX) prefix = tmpl.substitute( id=self.status.mapreduce_id, shard=self.status.shard) - bucket = self._get_tmp_gcs_bucket(writer_spec) - account_id = self._get_tmp_account_id(writer_spec) + bucket = self.status.writer_spec[self.BUCKET_NAME_PARAM] + account_id = writer_spec.get(self._ACCOUNT_ID_PARAM, None) for f in cloudstorage.listbucket("/%s/%s" % (bucket, prefix), _account_id=account_id): - self._remove_tmpfile(f.filename, self.status.writer_spec) + self._remove_file(f.filename, self.status.writer_spec) def finalize(self, ctx, shard_state): if self._data_written_to_slice: @@ -1531,11 +1487,9 @@ def finalize(self, ctx, shard_state): if self.status.tmpfile_1ago: - self._remove_tmpfile(self.status.tmpfile_1ago.name, - self.status.writer_spec) + self._remove_file(self.status.tmpfile_1ago.name, self.status.writer_spec) if self.status.tmpfile: - self._remove_tmpfile(self.status.tmpfile.name, - self.status.writer_spec) + self._remove_file(self.status.tmpfile.name, self.status.writer_spec) self._try_to_clean_garbage(self.status.writer_spec) @@ -1617,9 +1571,6 @@ class _GoogleCloudStorageRecordOutputWriter( WRITER_CLS = _GoogleCloudStorageOutputWriter -GoogleCloudStorageRecordOutputWriter = _GoogleCloudStorageRecordOutputWriter - - class GoogleCloudStorageConsistentRecordOutputWriter( _GoogleCloudStorageRecordOutputWriterBase): WRITER_CLS = GoogleCloudStorageConsistentOutputWriter @@ -1645,7 +1596,4 @@ def write(self, data): proto = file_service_pb.KeyValue() proto.set_key(key) proto.set_value(value) - GoogleCloudStorageRecordOutputWriter.write(self, proto.Encode()) - - -GoogleCloudStorageKeyValueOutputWriter = _GoogleCloudStorageKeyValueOutputWriter + _GoogleCloudStorageRecordOutputWriter.write(self, proto.Encode()) diff --git a/google/appengine/ext/ndb/query.py b/google/appengine/ext/ndb/query.py index 9988bec4..e558d89d 100644 --- a/google/appengine/ext/ndb/query.py +++ b/google/appengine/ext/ndb/query.py @@ -936,10 +936,6 @@ def run_to_queue(self, queue, conn, options=None, dsquery=None): rpc = dsquery.run_async(conn, options) while rpc is not None: batch = yield rpc - if (batch.skipped_results and - datastore_query.FetchOptions.offset(options)): - offset = options.offset - batch.skipped_results - options = datastore_query.FetchOptions(offset=offset, config=options) rpc = batch.next_batch_async(options) for i, result in enumerate(batch.results): queue.putq((batch, i, result)) diff --git a/google/appengine/ext/testbed/__init__.py b/google/appengine/ext/testbed/__init__.py index 4223710d..9dae4ca2 100644 --- a/google/appengine/ext/testbed/__init__.py +++ b/google/appengine/ext/testbed/__init__.py @@ -146,7 +146,6 @@ def testInsertEntity(self): except ImportError: datastore_sqlite_stub = None from google.appengine.datastore import datastore_stub_util -from google.appengine.datastore import datastore_v4_stub from google.appengine.ext.cloudstorage import common as gcs_common from google.appengine.ext.cloudstorage import stub_dispatcher as gcs_dispatcher @@ -513,7 +512,6 @@ def init_datastore_v3_stub(self, enable=True, datastore_file=None, """ if not enable: self._disable_stub(DATASTORE_SERVICE_NAME) - self._disable_stub('datastore_v4') return if use_sqlite: if datastore_sqlite_stub is None: @@ -535,8 +533,6 @@ def init_datastore_v3_stub(self, enable=True, datastore_file=None, **stub_kw_args) self._register_stub(DATASTORE_SERVICE_NAME, stub, self._deactivate_datastore_v3_stub) - v4_stub = datastore_v4_stub.DatastoreV4Stub(os.environ['APPLICATION_ID']) - self._register_stub('datastore_v4', v4_stub) def _deactivate_datastore_v3_stub(self, stub): stub.Write() diff --git a/google/appengine/tools/app_engine_web_xml_parser.py b/google/appengine/tools/app_engine_web_xml_parser.py index e1b1ca85..f83463ce 100644 --- a/google/appengine/tools/app_engine_web_xml_parser.py +++ b/google/appengine/tools/app_engine_web_xml_parser.py @@ -106,12 +106,6 @@ def ProcessSystemPropertiesNode(self, node): prop_value = xml_parser_utils.GetAttribute(sub_node, 'value') self.app_engine_web_xml.system_properties[prop_name] = prop_value - def ProcessBetaSettingsNode(self, node): - for sub_node in xml_parser_utils.GetNodes(node, 'setting'): - prop_name = xml_parser_utils.GetAttribute(sub_node, 'name') - prop_value = xml_parser_utils.GetAttribute(sub_node, 'value') - self.app_engine_web_xml.beta_settings[prop_name] = prop_value - def ProcessVmSettingsNode(self, node): for sub_node in xml_parser_utils.GetNodes(node, 'setting'): prop_name = xml_parser_utils.GetAttribute(sub_node, 'name') @@ -359,59 +353,28 @@ def ProcessAutoIdPolicyNode(self, node): return self.app_engine_web_xml.auto_id_policy = policy - def ProcessHealthCheckNode(self, node): - health_check = HealthCheck() + def ProcessVmHealthCheckNode(self, node): + vm_health_check = VmHealthCheck() for child in node: tag = xml_parser_utils.GetTag(child) if tag == 'enable-health-check': - health_check.enable_health_check = ( + vm_health_check.enable_health_check = ( xml_parser_utils.BooleanValue(child.text)) elif tag == 'host': - health_check.host = child.text + vm_health_check.host = child.text elif tag in ('check-interval-sec', 'healthy-threshold', 'restart-threshold', 'timeout-sec', 'unhealthy-threshold'): text = child.text or '' try: value = self._PositiveInt(text) - setattr(health_check, tag.replace('-', '_'), value) + setattr(vm_health_check, tag.replace('-', '_'), value) except ValueError: self.errors.append('value for %s must be a positive integer: "%s"' % (tag, text)) else: self.errors.append( - 'unrecognized element within : <%s>' % tag) - self.app_engine_web_xml.health_check = health_check - - def ProcessVmHealthCheckNode(self, node): - self.ProcessHealthCheckNode(node) - - def ProcessResourcesNode(self, node): - resources = Resources() - for child in node: - tag = xml_parser_utils.GetTag(child) - if tag in ('cpu', 'memory-gb', 'disk-size-gb'): - text = child.text or '' - setattr(resources, tag.replace('-', '_'), text) - else: - self.errors.append( - 'unrecognized element within : <%s>' % tag) - self.app_engine_web_xml.resources = resources - - def ProcessNetworkNode(self, node): - network = Network() - for child in node: - tag = xml_parser_utils.GetTag(child) - if tag == 'instance-tag': - text = child.text or '' - setattr(network, tag.replace('-', '_'), text) - elif tag == 'forwarded-port': - if not hasattr(network, 'forwarded_ports'): - network.forwarded_ports = [] - network.forwarded_ports.append(child.text or '') - else: - self.errors.append( - 'unrecognized element within : <%s>' % tag) - self.app_engine_web_xml.network = network + 'unrecognized element within : <%s>' % tag) + self.app_engine_web_xml.vm_health_check = vm_health_check def CheckScalingConstraints(self): """Checks that at most one type of scaling is enabled.""" @@ -458,11 +421,8 @@ def __init__(self): self.source_language = None self.module = None self.system_properties = {} - self.beta_settings = {} self.vm_settings = {} - self.health_check = None - self.resources = None - self.network = None + self.vm_health_check = None self.env_variables = {} self.instance_class = None self.automatic_scaling = None @@ -643,20 +603,6 @@ def __init__(self, pattern, expiration, http_headers): self.http_headers = http_headers -class HealthCheck(ValueMixin): - """Instances contain information about health check settings.""" +class VmHealthCheck(ValueMixin): + """Instances contain information about VM health check settings.""" pass - - -class Resources(ValueMixin): - """Instances contain information about resources settings.""" - pass - - -class BetaSettings(ValueMixin): - """Instances contain information about beta settings.""" - pass - - -class Network(ValueMixin): - """Instances contain information about network settings.""" diff --git a/google/appengine/tools/appcfg.py b/google/appengine/tools/appcfg.py index b3fbfd75..64714891 100644 --- a/google/appengine/tools/appcfg.py +++ b/google/appengine/tools/appcfg.py @@ -126,6 +126,10 @@ DAY = 24*3600 SUNDAY = 6 +SUPPORTED_RUNTIMES = ( + 'contrib-dart', 'dart', 'go', 'php', 'python', 'python27', 'java', 'java7', + 'vm', 'custom') + @@ -2558,7 +2562,7 @@ def _UploadMissingFiles(self, missing_files, openfunc): self.file_batcher.Flush() self.blob_batcher.Flush() self.errorblob_batcher.Flush() - StatusUpdate('Uploaded %d files and blobs.' % num_files, self.error_fh) + StatusUpdate('Uploaded %d files and blobs' % num_files, self.error_fh) @staticmethod def _LogDoUploadException(exception): @@ -2867,13 +2871,13 @@ def __init__(self, argv, parser_class=optparse.OptionParser, if not self.options.allow_any_runtime: if self.options.runtime: - if self.options.runtime not in appinfo.GetAllRuntimes(): + if self.options.runtime not in SUPPORTED_RUNTIMES: _PrintErrorAndExit(self.error_fh, '"%s" is not a supported runtime\n' % self.options.runtime) else: appinfo.AppInfoExternal.ATTRIBUTES[appinfo.RUNTIME] = ( - '|'.join(appinfo.GetAllRuntimes())) + '|'.join(SUPPORTED_RUNTIMES)) action = self.args.pop(0) diff --git a/google/appengine/tools/appcfg_java.py b/google/appengine/tools/appcfg_java.py index fad052d3..09535016 100644 --- a/google/appengine/tools/appcfg_java.py +++ b/google/appengine/tools/appcfg_java.py @@ -34,11 +34,9 @@ from google.appengine.tools import dispatch_xml_parser from google.appengine.tools import dos_xml_parser from google.appengine.tools import jarfile -from google.appengine.tools import java_quickstart from google.appengine.tools import java_utils from google.appengine.tools import queue_xml_parser from google.appengine.tools import web_xml_parser -from google.appengine.tools import xml_parser_utils from google.appengine.tools import yaml_translator @@ -149,16 +147,7 @@ def __init__(self, basepath, options): self.app_engine_web_xml.app_id = self.options.app_id if self.options.version: self.app_engine_web_xml.version_id = self.options.version - quickstart = xml_parser_utils.BooleanValue( - self.app_engine_web_xml.beta_settings.get('java_quickstart', 'false')) - if quickstart: - web_xml_str, _ = java_quickstart.quickstart_generator(self.basepath) - webdefault_xml_str = java_quickstart.get_webdefault_xml() - web_xml_str = java_quickstart.remove_mappings( - web_xml_str, webdefault_xml_str) - self.web_xml = web_xml_parser.WebXmlParser().ProcessXml(web_xml_str) - else: - self.web_xml = self._ReadWebXml() + self.web_xml = self._ReadWebXml() def _ValidateXmlFiles(self): diff --git a/google/appengine/tools/appengine_rpc.py b/google/appengine/tools/appengine_rpc.py index f1f43e5b..a040d309 100644 --- a/google/appengine/tools/appengine_rpc.py +++ b/google/appengine/tools/appengine_rpc.py @@ -24,7 +24,6 @@ import cStringIO import fancy_urllib import gzip -import hashlib import logging import os import re @@ -34,6 +33,8 @@ import urllib import urllib2 +from google.appengine.tools import dev_appserver_login + _UPLOADING_APP_DOC_URLS = { "go": "https://developers.google.com/appengine/docs/go/tools/" "uploadinganapp#Go_Password-less_login_with_OAuth2", @@ -356,29 +357,10 @@ def _Authenticate(self): self._GetAuthCookie(auth_token) return - - @staticmethod - def _CreateDevAppServerCookieData(email, admin): - """Creates cookie payload data. - - Args: - email: The user's email address. - admin: True if the user is an admin; False otherwise. - - Returns: - String containing the cookie payload. - """ - if email: - user_id_digest = hashlib.md5(email.lower()).digest() - user_id = "1" + "".join(["%02d" % ord(x) for x in user_id_digest])[:20] - else: - user_id = "" - return "%s:%s:%s" % (email, bool(admin), user_id) - def _DevAppServerAuthenticate(self): """Authenticates the user on the dev_appserver.""" credentials = self.auth_function() - value = self._CreateDevAppServerCookieData(credentials[0], True) + value = dev_appserver_login.CreateCookieData(credentials[0], True) self.extra_headers["Cookie"] = ('dev_appserver_login="%s"; Path=/;' % value) def Send(self, request_path, payload="", diff --git a/google/appengine/tools/dev-channel-js.js b/google/appengine/tools/dev-channel-js.js index 3d6f98e2..beb5743a 100644 --- a/google/appengine/tools/dev-channel-js.js +++ b/google/appengine/tools/dev-channel-js.js @@ -1002,7 +1002,7 @@ goog.asserts.assertElement = function(value, opt_message, var_args) { return value; }; goog.asserts.assertInstanceof = function(value, type, opt_message, var_args) { - !goog.asserts.ENABLE_ASSERTS || value instanceof type || goog.asserts.doAssertFailure_("Expected instanceof %s but got %s.", [goog.asserts.getType_(type), goog.asserts.getType_(value)], opt_message, Array.prototype.slice.call(arguments, 3)); + !goog.asserts.ENABLE_ASSERTS || value instanceof type || goog.asserts.doAssertFailure_("instanceof check failed.", null, opt_message, Array.prototype.slice.call(arguments, 3)); return value; }; goog.asserts.assertObjectPrototypeIsIntact = function() { @@ -1010,9 +1010,6 @@ goog.asserts.assertObjectPrototypeIsIntact = function() { goog.asserts.fail(key + " should not be enumerable in Object.prototype."); } }; -goog.asserts.getType_ = function(value) { - return value instanceof Function ? value.displayName || value.name || "unknown type name" : value instanceof Object ? value.constructor.displayName || value.constructor.name || Object.prototype.toString.call(value) : null === value ? "null" : typeof value; -}; goog.array = {}; goog.NATIVE_ARRAY_PROTOTYPES = goog.TRUSTED_SITE; goog.array.ASSUME_NATIVE_FUNCTIONS = !1; @@ -2752,17 +2749,17 @@ goog.dom.isNodeList = function(val) { } return!1; }; -goog.dom.getAncestorByTagNameAndClass = function(element, opt_tag, opt_class, opt_maxSearchSteps) { +goog.dom.getAncestorByTagNameAndClass = function(element, opt_tag, opt_class) { if (!opt_tag && !opt_class) { return null; } var tagName = opt_tag ? opt_tag.toUpperCase() : null; return goog.dom.getAncestor(element, function(node) { return(!tagName || node.nodeName == tagName) && (!opt_class || goog.isString(node.className) && goog.array.contains(node.className.split(/\s+/), opt_class)); - }, !0, opt_maxSearchSteps); + }, !0); }; -goog.dom.getAncestorByClass = function(element, className, opt_maxSearchSteps) { - return goog.dom.getAncestorByTagNameAndClass(element, null, className, opt_maxSearchSteps); +goog.dom.getAncestorByClass = function(element, className) { + return goog.dom.getAncestorByTagNameAndClass(element, null, className); }; goog.dom.getAncestor = function(element, matcher, opt_includeNode, opt_maxSearchSteps) { opt_includeNode || (element = element.parentNode); @@ -3733,11 +3730,6 @@ goog.functions.nth = function(n) { goog.functions.withReturnValue = function(f, retValue) { return goog.functions.sequence(f, goog.functions.constant(retValue)); }; -goog.functions.equalTo = function(value, opt_useLooseComparison) { - return function(other) { - return opt_useLooseComparison ? value == other : value === other; - }; -}; goog.functions.compose = function(fn, var_args) { var functions = arguments, length = functions.length; return function() { @@ -4976,12 +4968,7 @@ goog.debug.Logger.prototype.log = function(level, msg, opt_exception) { }; goog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception, opt_fnStackContext) { var logRecord = goog.debug.LogBuffer.isBufferingEnabled() ? goog.debug.LogBuffer.getInstance().addRecord(level, msg, this.name_) : new goog.debug.LogRecord(level, String(msg), this.name_); - if (opt_exception) { - var context; - context = goog.STRICT_MODE_COMPATIBLE ? opt_fnStackContext || goog.debug.Logger.prototype.getLogRecord : opt_fnStackContext || arguments.callee.caller; - logRecord.setException(opt_exception); - logRecord.setExceptionText(goog.debug.exposeException(opt_exception, context)); - } + opt_exception && (logRecord.setException(opt_exception), logRecord.setExceptionText(goog.debug.exposeException(opt_exception, opt_fnStackContext || goog.debug.Logger.prototype.getLogRecord))); return logRecord; }; goog.debug.Logger.prototype.severe = function(msg, opt_exception) { @@ -5095,11 +5082,11 @@ goog.async.throwException = function(exception) { throw exception; }, 0); }; -goog.async.nextTick = function(callback, opt_context, opt_useSetImmediate) { +goog.async.nextTick = function(callback, opt_context) { var cb = callback; opt_context && (cb = goog.bind(callback, opt_context)); cb = goog.async.nextTick.wrapCallback_(cb); - !goog.isFunction(goog.global.setImmediate) || !opt_useSetImmediate && goog.global.Window && goog.global.Window.prototype.setImmediate == goog.global.setImmediate ? (goog.async.nextTick.setImmediate_ || (goog.async.nextTick.setImmediate_ = goog.async.nextTick.getSetImmediateEmulator_()), goog.async.nextTick.setImmediate_(cb)) : goog.global.setImmediate(cb); + !goog.isFunction(goog.global.setImmediate) || goog.global.Window && goog.global.Window.prototype.setImmediate == goog.global.setImmediate ? (goog.async.nextTick.setImmediate_ || (goog.async.nextTick.setImmediate_ = goog.async.nextTick.getSetImmediateEmulator_()), goog.async.nextTick.setImmediate_(cb)) : goog.global.setImmediate(cb); }; goog.async.nextTick.getSetImmediateEmulator_ = function() { var Channel = goog.global.MessageChannel; @@ -5463,7 +5450,7 @@ goog.Promise.prototype.executeCallback_ = function(callbackEntry, state, result) if (state == goog.Promise.State_.FULFILLED) { callbackEntry.onFulfilled(result); } else { - callbackEntry.child && this.removeUnhandledRejection_(), callbackEntry.onRejected(result); + this.removeUnhandledRejection_(), callbackEntry.onRejected(result); } }; goog.Promise.prototype.addStackTrace_ = function(err) { diff --git a/google/appengine/tools/dev_appserver_apiserver.py b/google/appengine/tools/dev_appserver_apiserver.py index d0e56f7a..7a1b5a8c 100644 --- a/google/appengine/tools/dev_appserver_apiserver.py +++ b/google/appengine/tools/dev_appserver_apiserver.py @@ -14,10 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - - """Helper CGI for Apiserver in the development app server. This is a fake apiserver proxy that does simple transforms on requests that @@ -34,6 +30,7 @@ + import base64 import cgi import cStringIO @@ -155,12 +152,12 @@ class ApiRequest(object): """ API_PREFIX = '/_ah/api/' - def __init__(self, base_env_dict, dev_appserver, request=None): + def __init__(self, base_env_dict, old_dev_appserver, request=None): """Constructor. Args: base_env_dict: Dictionary of CGI environment parameters. - dev_appserver: used to call standard SplitURL method. + old_dev_appserver: used to call standard SplitURL method. request: AppServerRequest. Can be None. """ self.cgi_env = base_env_dict @@ -168,7 +165,7 @@ def __init__(self, base_env_dict, dev_appserver, request=None): self.http_method = base_env_dict['REQUEST_METHOD'] self.port = base_env_dict['SERVER_PORT'] if request: - self.path, self.query = dev_appserver.SplitURL(request.relative_url) + self.path, self.query = old_dev_appserver.SplitURL(request.relative_url) self.body = request.infile.read() @@ -804,9 +801,9 @@ def CreateApiserverDispatcher(config_manager=None): - from google.appengine.tools import dev_appserver + from google.appengine.tools import old_dev_appserver - class ApiserverDispatcher(dev_appserver.URLDispatcher): + class ApiserverDispatcher(old_dev_appserver.URLDispatcher): """Dispatcher that handles requests to the built-in apiserver handlers.""" _API_EXPLORER_URL = 'http://apis-explorer.appspot.com/apis-explorer/?base=' @@ -833,7 +830,7 @@ def __init__(self, config_manager=None, *args, **kwargs): self.HandleApiExplorerRequest) self._AddDispatcher('/_ah/api/static/.*$', self.HandleApiStaticRequest) - dev_appserver.URLDispatcher.__init__(self, *args, **kwargs) + old_dev_appserver.URLDispatcher.__init__(self, *args, **kwargs) def _AddDispatcher(self, path_regex, dispatch_function): """Add a request path and dispatch handler. @@ -915,7 +912,7 @@ def Dispatch(self, return None - self.request = ApiRequest(base_env_dict, dev_appserver, request) + self.request = ApiRequest(base_env_dict, old_dev_appserver, request) @@ -925,7 +922,7 @@ def Dispatch(self, self._request_stage = self.RequestState.GET_API_CONFIGS - return self.GetApiConfigs(base_env_dict, dev_appserver) + return self.GetApiConfigs(base_env_dict, old_dev_appserver) def HandleApiExplorerRequest(self, unused_request, outfile, base_env_dict): """Handler for requests to _ah/api/explorer. @@ -1007,20 +1004,21 @@ def EndRedirect(self, dispatched_output, outfile): else: return self.FailRequest('EndRedirect in unexpected state', outfile) - def GetApiConfigs(self, cgi_env, dev_appserver): + def GetApiConfigs(self, cgi_env, old_dev_appserver): """Makes a call to BackendService.getApiConfigs and parses result. Args: cgi_env: CGI environment dictionary as passed in by the framework - dev_appserver: dev_appserver instance used to generate AppServerRequest. + old_dev_appserver: + old_dev_appserver instance used to generate AppServerRequest. Returns: AppServerRequest to be returned as an internal redirect to getApiConfigs """ - request = ApiRequest(cgi_env, dev_appserver) + request = ApiRequest(cgi_env, old_dev_appserver) request.path = 'BackendService.getApiConfigs' request.body = '{}' - return BuildCGIRequest(cgi_env, request, dev_appserver) + return BuildCGIRequest(cgi_env, request, old_dev_appserver) @staticmethod def VerifyResponse(response, status_code, content_type=None): @@ -1075,7 +1073,7 @@ def HandleGetApiConfigsResponse(self, dispatched_output, outfile): Returns: True on success, False on failure """ - response = dev_appserver.RewriteResponse(dispatched_output) + response = old_dev_appserver.RewriteResponse(dispatched_output) if self.VerifyResponse(response, 200, 'application/json'): self.config_manager.ParseApiConfigResponse(response.body.read()) return True @@ -1109,7 +1107,7 @@ def CallSpi(self, outfile): if not discovery_service.HandleDiscoveryRequest(self.request.path): self._request_stage = self.RequestState.SPI_CALL return BuildCGIRequest(self.request.cgi_env, self.request, - dev_appserver) + old_dev_appserver) except RequestRejectionError, rejection_error: self._EndRequest() return SendCGIRejectedResponse(rejection_error, outfile) @@ -1169,7 +1167,7 @@ def HandleSpiResponse(self, dispatched_output, outfile): None """ - response = dev_appserver.AppServerResponse( + response = old_dev_appserver.AppServerResponse( response_file=dispatched_output) response_headers, body = self.ParseCgiResponse(response) @@ -1498,16 +1496,16 @@ def TransformJsonrpcResponse(self, response_body): return ApiserverDispatcher(config_manager) -def BuildCGIRequest(base_env_dict, request, dev_appserver): +def BuildCGIRequest(base_env_dict, request, old_dev_appserver): """Build a CGI request to Call a method on an SPI backend. Args: base_env_dict: CGI environment dict request: ApiRequest to be converted to a CGI request - dev_appserver: Handle to dev_appserver to generate CGI request. + old_dev_appserver: Handle to old_dev_appserver to generate CGI request. Returns: - dev_appserver.AppServerRequest internal redirect object + old_dev_appserver.AppServerRequest internal redirect object """ if request.headers is None: request.headers = {} @@ -1528,7 +1526,7 @@ def BuildCGIRequest(base_env_dict, request, dev_appserver): body_outfile.write(request.body) header_outfile.seek(0) body_outfile.seek(0) - return dev_appserver.AppServerRequest( + return old_dev_appserver.AppServerRequest( url, None, mimetools.Message(header_outfile), body_outfile) diff --git a/google/appengine/tools/dev_appserver_blobimage.py b/google/appengine/tools/dev_appserver_blobimage.py index c83a467b..5130be15 100644 --- a/google/appengine/tools/dev_appserver_blobimage.py +++ b/google/appengine/tools/dev_appserver_blobimage.py @@ -14,10 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - - """Dispatcher for dynamic image serving requests. Classes: @@ -28,6 +24,7 @@ """ + import logging import re import urlparse @@ -62,9 +59,9 @@ def CreateBlobImageDispatcher(images_stub): - from google.appengine.tools import dev_appserver + from google.appengine.tools import old_dev_appserver - class BlobImageDispatcher(dev_appserver.URLDispatcher): + class BlobImageDispatcher(old_dev_appserver.URLDispatcher): """Dispatcher that handles image serving requests.""" _size_limit = 1600 diff --git a/google/appengine/tools/dev_appserver_blobstore.py b/google/appengine/tools/dev_appserver_blobstore.py index fce2e54d..cf78da6f 100644 --- a/google/appengine/tools/dev_appserver_blobstore.py +++ b/google/appengine/tools/dev_appserver_blobstore.py @@ -14,10 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - - """Blobstore support classes. Classes: @@ -33,6 +29,7 @@ + import cgi import cStringIO import logging @@ -300,9 +297,9 @@ def CreateUploadDispatcher(get_blob_storage=GetBlobStorage): """ - from google.appengine.tools import dev_appserver + from google.appengine.tools import old_dev_appserver - class UploadDispatcher(dev_appserver.URLDispatcher): + class UploadDispatcher(old_dev_appserver.URLDispatcher): """Dispatcher that handles uploads.""" def __init__(self): @@ -377,7 +374,7 @@ def Dispatch(self, 'Content-Length: %d\r\n' '\r\n') % (header_text, len(content_text)) - return dev_appserver.AppServerRequest( + return old_dev_appserver.AppServerRequest( success_path, None, mimetools.Message(cStringIO.StringIO(complete_headers)), @@ -411,7 +408,7 @@ def EndRedirect(self, dispatched_output, original_output): Makes sure the application upload handler returned an appropriate status code. """ - response = dev_appserver.RewriteResponse(dispatched_output) + response = old_dev_appserver.RewriteResponse(dispatched_output) logging.info('Upload handler returned %d', response.status_code) outfile = cStringIO.StringIO() outfile.write('Status: %s\n' % response.status_code) @@ -423,8 +420,8 @@ def EndRedirect(self, dispatched_output, original_output): outfile.write(''.join(response.headers.headers)) outfile.seek(0) - dev_appserver.URLDispatcher.EndRedirect(self, - outfile, - original_output) + old_dev_appserver.URLDispatcher.EndRedirect(self, + outfile, + original_output) return UploadDispatcher() diff --git a/google/appengine/tools/dev_appserver_channel.py b/google/appengine/tools/dev_appserver_channel.py index 6e49bca2..3ee93663 100644 --- a/google/appengine/tools/dev_appserver_channel.py +++ b/google/appengine/tools/dev_appserver_channel.py @@ -14,10 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - - """Channel support classes. Classes: @@ -29,6 +25,7 @@ + import cgi import os import urlparse @@ -58,9 +55,9 @@ def CreateChannelDispatcher(channel_service_stub): - from google.appengine.tools import dev_appserver + from google.appengine.tools import old_dev_appserver - class ChannelDispatcher(dev_appserver.URLDispatcher): + class ChannelDispatcher(old_dev_appserver.URLDispatcher): """Dispatcher that handles channel polls.""" def __init__(self, channel_service_stub): diff --git a/google/appengine/tools/dev_appserver_import_hook.py b/google/appengine/tools/dev_appserver_import_hook.py index 5185f8d9..61f3f053 100644 --- a/google/appengine/tools/dev_appserver_import_hook.py +++ b/google/appengine/tools/dev_appserver_import_hook.py @@ -14,9 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - """Import hook for dev_appserver.py.""" import dummy_thread diff --git a/google/appengine/tools/dev_appserver_index.py b/google/appengine/tools/dev_appserver_index.py index a64e7fd4..a5c3857f 100644 --- a/google/appengine/tools/dev_appserver_index.py +++ b/google/appengine/tools/dev_appserver_index.py @@ -14,10 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - - """Utilities for generating and updating index.yaml.""" @@ -26,6 +22,7 @@ + from google.appengine.api import apiproxy_stub_map from google.appengine.datastore.datastore_stub_index import * diff --git a/google/appengine/tools/dev_appserver_login.py b/google/appengine/tools/dev_appserver_login.py index 4aee1e70..a4d6df59 100644 --- a/google/appengine/tools/dev_appserver_login.py +++ b/google/appengine/tools/dev_appserver_login.py @@ -14,9 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - """Helper CGI for logins/logout in the development application server. This CGI has these parameters: @@ -31,6 +28,7 @@ """ + import cgi import Cookie import os diff --git a/google/appengine/tools/dev_appserver_main.py b/google/appengine/tools/dev_appserver_main.py index 7f6667c3..850b998b 100644 --- a/google/appengine/tools/dev_appserver_main.py +++ b/google/appengine/tools/dev_appserver_main.py @@ -14,9 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - """Runs a development application server for an application. %(script)s [options] @@ -149,6 +146,7 @@ + from google.appengine.tools import os_compat @@ -172,7 +170,7 @@ from google.appengine.dist import py_zipimport from google.appengine.tools import appcfg from google.appengine.tools import appengine_rpc -from google.appengine.tools import dev_appserver +from google.appengine.tools import old_dev_appserver from google.appengine.tools import dev_appserver_multiprocess as multiprocess from google.appengine.tools import sdk_update_checker @@ -623,10 +621,10 @@ def main(argv): if '_DEFAULT_ENV_AUTH_DOMAIN' in option_dict: auth_domain = option_dict['_DEFAULT_ENV_AUTH_DOMAIN'] - dev_appserver.DEFAULT_ENV['AUTH_DOMAIN'] = auth_domain + old_dev_appserver.DEFAULT_ENV['AUTH_DOMAIN'] = auth_domain if '_ENABLE_LOGGING' in option_dict: enable_logging = option_dict['_ENABLE_LOGGING'] - dev_appserver.HardenedModulesHook.ENABLE_LOGGING = enable_logging + old_dev_appserver.HardenedModulesHook.ENABLE_LOGGING = enable_logging log_level = option_dict[ARG_LOG_LEVEL] @@ -640,12 +638,12 @@ def main(argv): default_partition = option_dict[ARG_DEFAULT_PARTITION] appinfo = None try: - appinfo, _, _ = dev_appserver.LoadAppConfig( + appinfo, _, _ = old_dev_appserver.LoadAppConfig( root_path, {}, default_partition=default_partition) except yaml_errors.EventListenerError, e: logging.error('Fatal error when loading application configuration:\n%s', e) return 1 - except dev_appserver.InvalidAppConfigError, e: + except old_dev_appserver.InvalidAppConfigError, e: logging.error('Application configuration file invalid:\n%s', e) return 1 @@ -702,9 +700,9 @@ def main(argv): logging.getLogger().setLevel(logging.WARNING) try: - dev_appserver.SetupStubs(appinfo.application, - _use_atexit_for_datastore_stub=True, - **option_dict) + old_dev_appserver.SetupStubs(appinfo.application, + _use_atexit_for_datastore_stub=True, + **option_dict) except: exc_type, exc_value, exc_traceback = sys.exc_info() logging.error(str(exc_type) + ': ' + str(exc_value)) @@ -715,7 +713,7 @@ def main(argv): frontend_port=option_dict.get(ARG_MULTIPROCESS_FRONTEND_PORT, None) if frontend_port is not None: frontend_port = int(frontend_port) - http_server = dev_appserver.CreateServer( + http_server = old_dev_appserver.CreateServer( root_path, login_url, port, @@ -755,7 +753,7 @@ def main(argv): done = True except KeyboardInterrupt: pass - dev_appserver.TearDownStubs() + old_dev_appserver.TearDownStubs() return 0 diff --git a/google/appengine/tools/dev_appserver_multiprocess.py b/google/appengine/tools/dev_appserver_multiprocess.py index 330a0ed5..36ef5ec8 100644 --- a/google/appengine/tools/dev_appserver_multiprocess.py +++ b/google/appengine/tools/dev_appserver_multiprocess.py @@ -14,8 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - """This module adds support for multiple processes in the dev_appserver. Each instance of the application is started as a separate process on a unique @@ -36,6 +34,7 @@ """ + import BaseHTTPServer import copy import cStringIO diff --git a/google/appengine/tools/dev_appserver_oauth.py b/google/appengine/tools/dev_appserver_oauth.py index 16f2e692..93ed4701 100644 --- a/google/appengine/tools/dev_appserver_oauth.py +++ b/google/appengine/tools/dev_appserver_oauth.py @@ -14,14 +14,11 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - - """Helper CGI for OAuth in the development app server.""" + import cgi @@ -217,9 +214,9 @@ def CreateOAuthDispatcher(): - from google.appengine.tools import dev_appserver + from google.appengine.tools import old_dev_appserver - class OAuthDispatcher(dev_appserver.URLDispatcher): + class OAuthDispatcher(old_dev_appserver.URLDispatcher): """Dispatcher that handles requests to the built-in OAuth handlers.""" def Dispatch(self, @@ -254,7 +251,7 @@ def _Parse(self, request, base_env_dict): body or query string (in the form of {key :[value1, value2]}). """ method = base_env_dict['REQUEST_METHOD'] - path, query = dev_appserver.SplitURL(request.relative_url) + path, query = old_dev_appserver.SplitURL(request.relative_url) parameters = {} if method == 'POST': form = cgi.FieldStorage(fp=request.infile, diff --git a/google/appengine/tools/dev_appserver_upload.py b/google/appengine/tools/dev_appserver_upload.py index 98a7fddf..0bb1b602 100644 --- a/google/appengine/tools/dev_appserver_upload.py +++ b/google/appengine/tools/dev_appserver_upload.py @@ -14,10 +14,6 @@ # See the License for the specific language governing permissions and # limitations under the License. # - - - - """Helper CGI for POST uploads. Utility library contains the main logic behind simulating the blobstore @@ -29,6 +25,7 @@ """ + import base64 import cStringIO import datetime diff --git a/google/appengine/tools/devappserver2/admin/templates/instance_logs.html b/google/appengine/tools/devappserver2/admin/templates/instance_logs.html index 9fff5528..8981a56b 100644 --- a/google/appengine/tools/devappserver2/admin/templates/instance_logs.html +++ b/google/appengine/tools/devappserver2/admin/templates/instance_logs.html @@ -24,10 +24,10 @@

.