#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#





"""Errors used in the Python appinfo API, used by app developers."""










class Error(Exception):
  """Base datastore AppInfo type."""


class EmptyConfigurationFile(Error):
  """Tried to load empty configuration file"""


class MultipleConfigurationFile(Error):
  """Tried to load configuration file with multiple AppInfo objects"""


class UnknownHandlerType(Error):
  """Raised when it is not possible to determine URL mapping type."""


class UnexpectedHandlerAttribute(Error):
  """Raised when a handler type has an attribute that it does not use."""


class MissingHandlerAttribute(Error):
  """Raised when a handler is missing an attribute required by its type."""


class MissingURLMapping(Error):
  """Raised when there are no URL mappings in external appinfo."""


class TooManyURLMappings(Error):
  """Raised when there are too many URL mappings in external appinfo."""


class PositionUsedInAppYamlHandler(Error):
  """Raised when position attribute is used in handler in AppInfoExternal."""


class InvalidBuiltinFormat(Error):
  """Raised when the name of the builtin in a list item cannot be identified."""


class MultipleBuiltinsSpecified(Error):
  """Raised when more than one builtin is specified in a single list element."""


class DuplicateBuiltinsSpecified(Error):
  """Raised when a builtin is specified more than once in the same file."""


class BackendNotFound(Error):
  """Raised when a Backend is required but not specified."""


class DuplicateBackend(Error):
  """Raised when a backend is found more than once in 'backends'."""


class MissingApiConfig(Error):
  """Raised if an api_endpoint handler is configured but no api_config."""


class RuntimeDoesNotSupportLibraries(Error):
  """Raised when 'libraries' is used in a runtime that does not support it."""


class DuplicateLibrary(Error):
  """Raised when a library is found more than once in 'libraries'."""


class InvalidLibraryVersion(Error):
  """Raised when a library uses a version that isn't supported."""


class InvalidLibraryName(Error):
  """Raised when a library is specified that isn't supported."""


class ThreadsafeWithCgiHandler(Error):
  """Raised when threadsafe is enabled with a CGI handler specified."""


class MissingThreadsafe(Error):
  """Raised when the runtime needs a threadsafe declaration and it's missing."""


class InvalidHttpHeaderName(Error):
  """Raised when an invalid HTTP header name is used.

  This issue arrises what a static handler uses http_headers. For example, the
  following would not be allowed:

    handlers:
    - url: /static
      static_dir: static
      http_headers:
        D@nger: Will Robinson
  """


class InvalidHttpHeaderValue(Error):
  """Raised when an invalid HTTP header value is used.

  This issue arrises what a static handler uses http_headers. For example, the
  following would not be allowed:

    handlers:
    - url: /static
      static_dir: static
      http_headers:
        Some-Unicode: "\u2628"
  """


class ContentTypeSpecifiedMultipleTimes(Error):
  """Raised when mime_type and http_headers specify a mime type.

  N.B. This will be raised even when both fields specify the same content type.
  E.g. the following configuration (snippet) will be rejected:

    handlers:
    - url: /static
      static_dir: static
      mime_type: text/html
      http_headers:
        content-type: text/html

  This only applies to static handlers i.e. a handler that specifies static_dir
  or static_files.
  """


class TooManyHttpHeaders(Error):
  """Raised when a handler specified too many HTTP headers.

  The message should indicate the maximum number of headers allowed.
  """


class TooManyScalingSettingsError(Error):
  """Raised when more than one scaling settings section is present."""
