aboutsummaryrefslogtreecommitdiffstats
path: root/python_openapi_client/fatcat_openapi_client/configuration.py
diff options
context:
space:
mode:
Diffstat (limited to 'python_openapi_client/fatcat_openapi_client/configuration.py')
-rw-r--r--python_openapi_client/fatcat_openapi_client/configuration.py289
1 files changed, 221 insertions, 68 deletions
diff --git a/python_openapi_client/fatcat_openapi_client/configuration.py b/python_openapi_client/fatcat_openapi_client/configuration.py
index dacf77c9..f9707622 100644
--- a/python_openapi_client/fatcat_openapi_client/configuration.py
+++ b/python_openapi_client/fatcat_openapi_client/configuration.py
@@ -1,5 +1,3 @@
-# coding: utf-8
-
"""
fatcat
@@ -11,31 +9,21 @@
"""
-from __future__ import absolute_import
-
import copy
import logging
import multiprocessing
import sys
import urllib3
-import six
-from six.moves import http_client as httplib
-
+from http import client as http_client
+from fatcat_openapi_client.exceptions import ApiValueError
-class TypeWithDefault(type):
- def __init__(cls, name, bases, dct):
- super(TypeWithDefault, cls).__init__(name, bases, dct)
- cls._default = None
-
- def __call__(cls, **kwargs):
- if cls._default is None:
- cls._default = type.__call__(cls, **kwargs)
- return copy.copy(cls._default)
-
- def set_default(cls, default):
- cls._default = copy.copy(default)
+JSON_SCHEMA_VALIDATION_KEYWORDS = {
+ 'multipleOf', 'maximum', 'exclusiveMaximum',
+ 'minimum', 'exclusiveMinimum', 'maxLength',
+ 'minLength', 'pattern', 'maxItems', 'minItems'
+}
class Configuration(object):
"""NOTE: This class is auto generated by OpenAPI Generator
@@ -44,25 +32,111 @@ class Configuration(object):
Do not edit the class manually.
:param host: Base url
+ :param api_key: Dict to store API key(s).
+ Each entry in the dict specifies an API key.
+ The dict key is the name of the security scheme in the OAS specification.
+ The dict value is the API key secret.
+ :param api_key_prefix: Dict to store API prefix (e.g. Bearer)
+ The dict key is the name of the security scheme in the OAS specification.
+ The dict value is an API key prefix when generating the auth data.
:param username: Username for HTTP basic authentication
:param password: Password for HTTP basic authentication
+ :param discard_unknown_keys: Boolean value indicating whether to discard
+ unknown properties. A server may send a response that includes additional
+ properties that are not known by the client in the following scenarios:
+ 1. The OpenAPI document is incomplete, i.e. it does not match the server
+ implementation.
+ 2. The client was generated using an older version of the OpenAPI document
+ and the server has been upgraded since then.
+ If a schema in the OpenAPI document defines the additionalProperties attribute,
+ then all undeclared properties received by the server are injected into the
+ additional properties map. In that case, there are undeclared properties, and
+ nothing to discard.
+ :param disabled_client_side_validations (string): Comma-separated list of
+ JSON schema validation keywords to disable JSON schema structural validation
+ rules. The following keywords may be specified: multipleOf, maximum,
+ exclusiveMaximum, minimum, exclusiveMinimum, maxLength, minLength, pattern,
+ maxItems, minItems.
+ By default, the validation is performed for data generated locally by the client
+ and data received from the server, independent of any validation performed by
+ the server side. If the input data does not satisfy the JSON schema validation
+ rules specified in the OpenAPI document, an exception is raised.
+ If disabled_client_side_validations is set, structural validation is
+ disabled. This can be useful to troubleshoot data validation problem, such as
+ when the OpenAPI document validation rules do not match the actual API data
+ received by the server.
+ :param server_index: Index to servers configuration.
+ :param server_variables: Mapping with string values to replace variables in
+ templated server configuration. The validation of enums is performed for
+ variables with defined enum values before.
+ :param server_operation_index: Mapping from operation ID to an index to server
+ configuration.
+ :param server_operation_variables: Mapping from operation ID to a mapping with
+ string values to replace variables in templated server configuration.
+ The validation of enums is performed for variables with defined enum values before.
+ :param ssl_ca_cert: str - the path to a file of concatenated CA certificates
+ in PEM format
+
+ :Example:
+
+ API Key Authentication Example.
+ Given the following security scheme in the OpenAPI specification:
+ components:
+ securitySchemes:
+ cookieAuth: # name for the security scheme
+ type: apiKey
+ in: cookie
+ name: JSESSIONID # cookie name
+
+ You can programmatically set the cookie:
+
+conf = fatcat_openapi_client.Configuration(
+ api_key={'cookieAuth': 'abc123'}
+ api_key_prefix={'cookieAuth': 'JSESSIONID'}
+)
+
+ The following cookie will be added to the HTTP request:
+ Cookie: JSESSIONID abc123
"""
- def __init__(self, host="https://api.fatcat.wiki/v0",
- username="", password=""):
+ _default = None
+
+ def __init__(self, host=None,
+ api_key=None, api_key_prefix=None,
+ access_token=None,
+ username=None, password=None,
+ discard_unknown_keys=False,
+ disabled_client_side_validations="",
+ server_index=None, server_variables=None,
+ server_operation_index=None, server_operation_variables=None,
+ ssl_ca_cert=None,
+ ):
"""Constructor
"""
- self.host = host
+ self._base_path = "https://api.fatcat.wiki/v0" if host is None else host
"""Default Base url
"""
+ self.server_index = 0 if server_index is None and host is None else server_index
+ self.server_operation_index = server_operation_index or {}
+ """Default server index
+ """
+ self.server_variables = server_variables or {}
+ self.server_operation_variables = server_operation_variables or {}
+ """Default server variables
+ """
self.temp_folder_path = None
"""Temp file folder for downloading files
"""
# Authentication Settings
+ self.access_token = access_token
self.api_key = {}
+ if api_key:
+ self.api_key = api_key
"""dict to store API key(s)
"""
self.api_key_prefix = {}
+ if api_key_prefix:
+ self.api_key_prefix = api_key_prefix
"""dict to store API prefix (e.g. Bearer)
"""
self.refresh_api_key_hook = None
@@ -74,6 +148,8 @@ class Configuration(object):
self.password = password
"""Password for HTTP basic authentication
"""
+ self.discard_unknown_keys = discard_unknown_keys
+ self.disabled_client_side_validations = disabled_client_side_validations
self.logger = {}
"""Logging Settings
"""
@@ -100,7 +176,7 @@ class Configuration(object):
Set this to false to skip verifying SSL certificate when calling API
from https server.
"""
- self.ssl_ca_cert = None
+ self.ssl_ca_cert = ssl_ca_cert
"""Set this to customize the certificate file to verify the peer.
"""
self.cert_file = None
@@ -124,6 +200,9 @@ class Configuration(object):
self.proxy = None
"""Proxy URL
"""
+ self.no_proxy = None
+ """bypass proxy for host in the no_proxy list.
+ """
self.proxy_headers = None
"""Proxy headers
"""
@@ -133,6 +212,60 @@ class Configuration(object):
self.retries = None
"""Adding retries to override urllib3 default value 3
"""
+ # Enable client side validation
+ self.client_side_validation = True
+
+ # Options to pass down to the underlying urllib3 socket
+ self.socket_options = None
+
+ def __deepcopy__(self, memo):
+ cls = self.__class__
+ result = cls.__new__(cls)
+ memo[id(self)] = result
+ for k, v in self.__dict__.items():
+ if k not in ('logger', 'logger_file_handler'):
+ setattr(result, k, copy.deepcopy(v, memo))
+ # shallow copy of loggers
+ result.logger = copy.copy(self.logger)
+ # use setters to configure loggers
+ result.logger_file = self.logger_file
+ result.debug = self.debug
+ return result
+
+ def __setattr__(self, name, value):
+ object.__setattr__(self, name, value)
+ if name == 'disabled_client_side_validations':
+ s = set(filter(None, value.split(',')))
+ for v in s:
+ if v not in JSON_SCHEMA_VALIDATION_KEYWORDS:
+ raise ApiValueError(
+ "Invalid keyword: '{0}''".format(v))
+ self._disabled_client_side_validations = s
+
+ @classmethod
+ def set_default(cls, default):
+ """Set default instance of configuration.
+
+ It stores default configuration, which can be
+ returned by get_default_copy method.
+
+ :param default: object of Configuration
+ """
+ cls._default = copy.deepcopy(default)
+
+ @classmethod
+ def get_default_copy(cls):
+ """Return new instance of configuration.
+
+ This method returns newly created, based on default constructor,
+ object of Configuration class or returns a copy of default
+ configuration passed by the set_default method.
+
+ :return: The configuration object.
+ """
+ if cls._default is not None:
+ return copy.deepcopy(cls._default)
+ return Configuration()
@property
def logger_file(self):
@@ -162,7 +295,7 @@ class Configuration(object):
# then add file handler and remove stream handler.
self.logger_file_handler = logging.FileHandler(self.__logger_file)
self.logger_file_handler.setFormatter(self.logger_formatter)
- for _, logger in six.iteritems(self.logger):
+ for _, logger in self.logger.items():
logger.addHandler(self.logger_file_handler)
@property
@@ -184,17 +317,17 @@ class Configuration(object):
self.__debug = value
if self.__debug:
# if debug status is True, turn on debug logging
- for _, logger in six.iteritems(self.logger):
+ for _, logger in self.logger.items():
logger.setLevel(logging.DEBUG)
- # turn on httplib debug
- httplib.HTTPConnection.debuglevel = 1
+ # turn on http_client debug
+ http_client.HTTPConnection.debuglevel = 1
else:
# if debug status is False, turn off debug logging,
# setting log level to default `logging.WARNING`
- for _, logger in six.iteritems(self.logger):
+ for _, logger in self.logger.items():
logger.setLevel(logging.WARNING)
- # turn off httplib debug
- httplib.HTTPConnection.debuglevel = 0
+ # turn off http_client debug
+ http_client.HTTPConnection.debuglevel = 0
@property
def logger_format(self):
@@ -219,15 +352,16 @@ class Configuration(object):
self.__logger_format = value
self.logger_formatter = logging.Formatter(self.__logger_format)
- def get_api_key_with_prefix(self, identifier):
+ def get_api_key_with_prefix(self, identifier, alias=None):
"""Gets API key (with prefix if set).
:param identifier: The identifier of apiKey.
+ :param alias: The alternative identifier of apiKey.
:return: The token for api key authentication.
"""
if self.refresh_api_key_hook is not None:
self.refresh_api_key_hook(self)
- key = self.api_key.get(identifier)
+ key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None)
if key:
prefix = self.api_key_prefix.get(identifier)
if prefix:
@@ -240,8 +374,14 @@ class Configuration(object):
:return: The token for basic HTTP authentication.
"""
+ username = ""
+ if self.username is not None:
+ username = self.username
+ password = ""
+ if self.password is not None:
+ password = self.password
return urllib3.util.make_headers(
- basic_auth=self.username + ':' + self.password
+ basic_auth=username + ':' + password
).get('authorization')
def auth_settings(self):
@@ -249,15 +389,17 @@ class Configuration(object):
:return: The Auth Settings information dict.
"""
- return {
- 'Bearer':
- {
- 'type': 'api_key',
- 'in': 'header',
- 'key': 'Authorization',
- 'value': self.get_api_key_with_prefix('Authorization')
- },
- }
+ auth = {}
+ if 'Bearer' in self.api_key:
+ auth['Bearer'] = {
+ 'type': 'api_key',
+ 'in': 'header',
+ 'key': 'Authorization',
+ 'value': self.get_api_key_with_prefix(
+ 'Bearer',
+ ),
+ }
+ return auth
def to_debug_report(self):
"""Gets the essential information for debugging.
@@ -268,7 +410,7 @@ class Configuration(object):
"OS: {env}\n"\
"Python Version: {pyversion}\n"\
"Version of the API: 0.5.0\n"\
- "SDK Package Version: 0.5.0".\
+ "SDK Package Version: 0.5.1".\
format(env=sys.platform, pyversion=sys.version)
def get_host_settings(self):
@@ -283,41 +425,52 @@ class Configuration(object):
}
]
- def get_host_from_settings(self, index, variables={}):
+ def get_host_from_settings(self, index, variables=None, servers=None):
"""Gets host URL based on the index and variables
:param index: array index of the host settings
:param variables: hash of variable and the corresponding value
+ :param servers: an array of host settings or None
:return: URL based on host settings
"""
+ if index is None:
+ return self._base_path
- servers = self.get_host_settings()
+ variables = {} if variables is None else variables
+ servers = self.get_host_settings() if servers is None else servers
- # check array index out of bound
- if index < 0 or index >= len(servers):
+ try:
+ server = servers[index]
+ except IndexError:
raise ValueError(
- "Invalid index {} when selecting the host settings. Must be less than {}" # noqa: E501
- .format(index, len(servers)))
+ "Invalid index {0} when selecting the host settings. "
+ "Must be less than {1}".format(index, len(servers)))
- server = servers[index]
url = server['url']
- # go through variable and assign a value
- for variable_name in server['variables']:
- if variable_name in variables:
- if variables[variable_name] in server['variables'][
- variable_name]['enum_values']:
- url = url.replace("{" + variable_name + "}",
- variables[variable_name])
- else:
- raise ValueError(
- "The variable `{}` in the host URL has invalid value {}. Must be {}." # noqa: E501
- .format(
- variable_name, variables[variable_name],
- server['variables'][variable_name]['enum_values']))
- else:
- # use default value
- url = url.replace(
- "{" + variable_name + "}",
- server['variables'][variable_name]['default_value'])
+ # go through variables and replace placeholders
+ for variable_name, variable in server.get('variables', {}).items():
+ used_value = variables.get(
+ variable_name, variable['default_value'])
+
+ if 'enum_values' in variable \
+ and used_value not in variable['enum_values']:
+ raise ValueError(
+ "The variable `{0}` in the host URL has invalid value "
+ "{1}. Must be {2}.".format(
+ variable_name, variables[variable_name],
+ variable['enum_values']))
+
+ url = url.replace("{" + variable_name + "}", used_value)
return url
+
+ @property
+ def host(self):
+ """Return generated host."""
+ return self.get_host_from_settings(self.server_index, variables=self.server_variables)
+
+ @host.setter
+ def host(self, value):
+ """Fix base path."""
+ self._base_path = value
+ self.server_index = None