Hello community, here is the log from the commit of package python-msrest for openSUSE:Factory checked in at 2017-07-19 11:21:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-msrest (Old) and /work/SRC/openSUSE:Factory/.python-msrest.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-msrest" Wed Jul 19 11:21:24 2017 rev:2 rq:510104 version:0.4.11 Changes: -------- --- /work/SRC/openSUSE:Factory/python-msrest/python-msrest.changes 2017-02-03 18:57:51.453661784 +0100 +++ /work/SRC/openSUSE:Factory/.python-msrest.new/python-msrest.changes 2017-07-19 12:21:53.384902716 +0200 @@ -1,0 +2,9 @@ +Mon Jul 10 13:20:42 UTC 2017 - adrian.glaub...@suse.com + +- New upstream release + + Version 0.4.11 +- Provide full source URL in Source field +- Convert package to single spec +- Remove python-enum34 from Requires + +------------------------------------------------------------------- Old: ---- msrest-0.4.4.tar.gz New: ---- msrest-0.4.11.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-msrest.spec ++++++ --- /var/tmp/diff_new_pack.Lg0E5h/_old 2017-07-19 12:21:53.876833299 +0200 +++ /var/tmp/diff_new_pack.Lg0E5h/_new 2017-07-19 12:21:53.876833299 +0200 @@ -1,7 +1,7 @@ # # spec file for package python-msrest # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -14,27 +14,32 @@ # Please submit bugfixes or comments via http://bugs.opensuse.org/ # + + +%{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-msrest -Version: 0.4.4 +Version: 0.4.11 Release: 0 Summary: AutoRest swagger generator Python client runtime License: MIT Group: Development/Languages/Python Url: https://pypi.python.org/pypi/msrest -Source: msrest-%{version}.tar.gz +Source: https://files.pythonhosted.org/packages/source/m/msrest/msrest-%{version}.tar.gz +BuildRequires: %{python_module devel} +BuildRequires: %{python_module setuptools} BuildRequires: fdupes -BuildRequires: python-devel -BuildRequires: python-setuptools -Requires: python-requests >= 2.7.0 -Requires: python-keyring >= 5.6 -Requires: python-requests-oauthlib >= 0.5.0 -Requires: python-isodate >= 0.5.4 +BuildRequires: python-rpm-macros Requires: python-certifi >= 2015.9.6.2 Requires: python-chardet >= 2.3.0 -Requires: python-enum34 >= 1.0.4 +Requires: python-isodate >= 0.5.4 +Requires: python-keyring >= 5.6 +Requires: python-requests >= 2.7.0 +Requires: python-requests-oauthlib >= 0.5.0 BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildArch: noarch +%python_subpackages + %description AutoRest swagger generator Python client runtime Swagger is a powerful open source framework: http://swagger.io @@ -43,14 +48,14 @@ %setup -q -n msrest-%{version} %build -python setup.py build +%python_build %install -python setup.py install --prefix=%{_prefix} --root=%{buildroot} +%python_install %fdupes %{buildroot}/%{python_sitelib}/* -%files +%files %{python_files} %defattr(-,root,root,-) %{python_sitelib}/* ++++++ msrest-0.4.4.tar.gz -> msrest-0.4.11.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/PKG-INFO new/msrest-0.4.11/PKG-INFO --- old/msrest-0.4.4/PKG-INFO 2016-09-14 17:29:02.000000000 +0200 +++ new/msrest-0.4.11/PKG-INFO 2017-06-21 21:22:45.000000000 +0200 @@ -1,14 +1,19 @@ Metadata-Version: 1.1 Name: msrest -Version: 0.4.4 +Version: 0.4.11 Summary: AutoRest swagger generator Python client runtime. -Home-page: https://github.com/xingwu1/autorest/tree/python/ClientRuntimes/Python/msrest +Home-page: https://github.com/Azure/msrest-for-python Author: Microsoft Corporation Author-email: UNKNOWN License: MIT License Description: AutoRest: Python Client Runtime ================================ + .. image:: https://travis-ci.org/Azure/msrest-for-python.svg?branch=master + :target: https://travis-ci.org/Azure/msrest-for-python + + .. image:: https://codecov.io/gh/azure/msrest-for-python/branch/master/graph/badge.svg + :target: https://codecov.io/gh/azure/msrest-for-python Installation ------------ @@ -23,6 +28,71 @@ Release History --------------- + 2017-06-21 Version 0.4.11 + +++++++++++++++++++++++++ + + **Bugfixes** + + - Fix incorrect dependency to "requests" 2.14.x, instead of 2.x meant in 0.4.8 + + 2017-06-15 Version 0.4.10 + +++++++++++++++++++++++++ + + **Features** + + - Add requests hooks to configuration + + 2017-06-08 Version 0.4.9 + ++++++++++++++++++++++++ + + **Bugfixes** + + - Accept "null" value for paging array as an empty list and do not raise (#30) + + 2017-05-22 Version 0.4.8 + ++++++++++++++++++++++++ + + **Bugfixes** + + - Fix random "pool is closed" error (#29) + - Fix requests dependency to version 2.x, since version 3.x is annunced to be breaking. + + 2017-04-04 Version 0.4.7 + ++++++++++++++++++++++++ + + **BugFixes** + + - Refactor paging #22: + + - "next" is renamed "advance_page" and "next" returns only 1 element (Python 2 expected behavior) + - paging objects are now real generator and support the "next()" built-in function without need for "iter()" + + - Raise accurate DeserialisationError on incorrect RestAPI discriminator usage #27 + - Fix discriminator usage of the base class name #27 + - Remove default mutable arguments in Clients #20 + - Fix object comparison in some scenarios #24 + + 2017-03-06 Version 0.4.6 + ++++++++++++++++++++++++ + + **Bugfixes** + + - Allow Model sub-classes to be serialized if type is "object" + + 2017-02-13 Version 0.4.5 + ++++++++++++++++++++++++ + + **Bugfixes** + + - Fix polymorphic deserialization #11 + - Fix regexp validation if '\\w' is used in Python 2.7 #13 + - Fix dict deserialization if keys are unicode in Python 2.7 + + **Improvements** + + - Add polymorphic serialisation from dict objects + - Remove chardet and use HTTP charset declaration (fallback to utf8) + 2016-09-14 Version 0.4.4 ++++++++++++++++++++++++ @@ -152,6 +222,7 @@ ++++++++++++++++++++++++ - Initial release. + Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Programming Language :: Python @@ -161,5 +232,6 @@ Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 Classifier: License :: OSI Approved :: MIT License Classifier: Topic :: Software Development diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/README.rst new/msrest-0.4.11/README.rst --- old/msrest-0.4.4/README.rst 1970-01-01 01:00:00.000000000 +0100 +++ new/msrest-0.4.11/README.rst 2017-06-21 21:21:28.000000000 +0200 @@ -0,0 +1,216 @@ +AutoRest: Python Client Runtime +================================ + +.. image:: https://travis-ci.org/Azure/msrest-for-python.svg?branch=master + :target: https://travis-ci.org/Azure/msrest-for-python + +.. image:: https://codecov.io/gh/azure/msrest-for-python/branch/master/graph/badge.svg + :target: https://codecov.io/gh/azure/msrest-for-python + +Installation +------------ + +To install: + +.. code-block:: bash + + $ pip install msrest + + +Release History +--------------- + +2017-06-21 Version 0.4.11 ++++++++++++++++++++++++++ + +**Bugfixes** + +- Fix incorrect dependency to "requests" 2.14.x, instead of 2.x meant in 0.4.8 + +2017-06-15 Version 0.4.10 ++++++++++++++++++++++++++ + +**Features** + +- Add requests hooks to configuration + +2017-06-08 Version 0.4.9 +++++++++++++++++++++++++ + +**Bugfixes** + +- Accept "null" value for paging array as an empty list and do not raise (#30) + +2017-05-22 Version 0.4.8 +++++++++++++++++++++++++ + +**Bugfixes** + +- Fix random "pool is closed" error (#29) +- Fix requests dependency to version 2.x, since version 3.x is annunced to be breaking. + +2017-04-04 Version 0.4.7 +++++++++++++++++++++++++ + +**BugFixes** + +- Refactor paging #22: + + - "next" is renamed "advance_page" and "next" returns only 1 element (Python 2 expected behavior) + - paging objects are now real generator and support the "next()" built-in function without need for "iter()" + +- Raise accurate DeserialisationError on incorrect RestAPI discriminator usage #27 +- Fix discriminator usage of the base class name #27 +- Remove default mutable arguments in Clients #20 +- Fix object comparison in some scenarios #24 + +2017-03-06 Version 0.4.6 +++++++++++++++++++++++++ + +**Bugfixes** + +- Allow Model sub-classes to be serialized if type is "object" + +2017-02-13 Version 0.4.5 +++++++++++++++++++++++++ + +**Bugfixes** + +- Fix polymorphic deserialization #11 +- Fix regexp validation if '\\w' is used in Python 2.7 #13 +- Fix dict deserialization if keys are unicode in Python 2.7 + +**Improvements** + +- Add polymorphic serialisation from dict objects +- Remove chardet and use HTTP charset declaration (fallback to utf8) + +2016-09-14 Version 0.4.4 +++++++++++++++++++++++++ + +**Bugfixes** + +- Remove paging URL validation, part of fix https://github.com/Azure/autorest/pull/1420 + +**Disclaimer** + +In order to get paging fixes for impacted clients, you need this package and Autorest > 0.17.0 Nightly 20160913 + +2016-09-01 Version 0.4.3 +++++++++++++++++++++++++ + +**Bugfixes** + +- Better exception message (https://github.com/Azure/autorest/pull/1300) + +2016-08-15 Version 0.4.2 +++++++++++++++++++++++++ + +**Bugfixes** + +- Fix serialization if "object" type contains None (https://github.com/Azure/autorest/issues/1353) + +2016-08-08 Version 0.4.1 +++++++++++++++++++++++++ + +**Bugfixes** + +- Fix compatibility issues with requests 2.11.0 (https://github.com/Azure/autorest/issues/1337) +- Allow url of ClientRequest to have parameters (https://github.com/Azure/autorest/issues/1217) + +2016-05-25 Version 0.4.0 +++++++++++++++++++++++++ + +This version has no bug fixes, but implements new features of Autorest: +- Base64 url type +- unixtime type +- x-ms-enum modelAsString flag + +**Behaviour changes** + +- Add Platform information in UserAgent +- Needs Autorest > 0.17.0 Nightly 20160525 + +2016-04-26 Version 0.3.0 +++++++++++++++++++++++++ + +**Bugfixes** + +- Read only values are no longer in __init__ or sent to the server (https://github.com/Azure/autorest/pull/959) +- Useless kwarg removed + +**Behaviour changes** + +- Needs Autorest > 0.16.0 Nightly 20160426 + + +2016-03-25 Version 0.2.0 +++++++++++++++++++++++++ + +**Bugfixes** + +- Manage integer enum values (https://github.com/Azure/autorest/pull/879) +- Add missing application/json Accept HTTP header (https://github.com/Azure/azure-sdk-for-python/issues/553) + +**Behaviour changes** + +- Needs Autorest > 0.16.0 Nightly 20160324 + + +2016-03-21 Version 0.1.3 +++++++++++++++++++++++++ + +**Bugfixes** + +- Deserialisation of generic resource if null in JSON (https://github.com/Azure/azure-sdk-for-python/issues/544) + + +2016-03-14 Version 0.1.2 +++++++++++++++++++++++++ + +**Bugfixes** + +- urllib3 side effect (https://github.com/Azure/autorest/issues/824) + + +2016-03-04 Version 0.1.1 +++++++++++++++++++++++++ + +**Bugfixes** + +- Source package corrupted in Pypi (https://github.com/Azure/autorest/issues/799) + +2016-03-04 Version 0.1.0 ++++++++++++++++++++++++++ + +**Behavioural Changes** + +- Removed custom logging set up and configuration. All loggers are now children of the root logger 'msrest' with no pre-defined configurations. +- Replaced _required attribute in Model class with more extensive _validation dict. + +**Improvement** + +- Removed hierarchy scanning for attribute maps from base Model class - relies on generator to populate attribute + maps according to hierarchy. +- Base class Paged now inherits from collections.Iterable. +- Data validation during serialization using custom parameters (e.g. max, min etc). +- Added ValidationError to be raised if invalid data encountered during serialization. + +2016-02-29 Version 0.0.3 +++++++++++++++++++++++++ + +**Bugfixes** + +- Source package corrupted in Pypi (https://github.com/Azure/autorest/issues/718) + +2016-02-19 Version 0.0.2 +++++++++++++++++++++++++ + +**Bugfixes** + +- Fixed bug in exception logging before logger configured. + +2016-02-19 Version 0.0.1 +++++++++++++++++++++++++ + +- Initial release. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest/configuration.py new/msrest-0.4.11/msrest/configuration.py --- old/msrest-0.4.4/msrest/configuration.py 2016-08-08 22:09:28.000000000 +0200 +++ new/msrest-0.4.11/msrest/configuration.py 2017-06-21 21:21:28.000000000 +0200 @@ -74,6 +74,11 @@ requests.__version__, msrest_version) + # Requests hooks. Must respect requests hook callback signature + # Note that we will inject the following parameters: + # - kwargs['msrest']['session'] with the current session + self.hooks = [] + self._config = configparser.ConfigParser() self._config.optionxform = str diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest/exceptions.py new/msrest-0.4.11/msrest/exceptions.py --- old/msrest-0.4.4/msrest/exceptions.py 2016-09-01 22:15:32.000000000 +0200 +++ new/msrest-0.4.11/msrest/exceptions.py 2017-06-21 21:21:28.000000000 +0200 @@ -113,7 +113,7 @@ class HttpOperationError(ClientException): - """Client request failed due to server-specificed HTTP operation error. + """Client request failed due to server-specified HTTP operation error. Attempts to deserialize response into specific error object. :param Deserializer deserialize: Deserializer with data on custom diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest/http_logger.py new/msrest-0.4.11/msrest/http_logger.py --- old/msrest-0.4.4/msrest/http_logger.py 2016-08-08 22:09:28.000000000 +0200 +++ new/msrest-0.4.11/msrest/http_logger.py 2017-06-21 21:21:28.000000000 +0200 @@ -43,6 +43,8 @@ _LOGGER.debug("Request method: %r", request.method) _LOGGER.debug("Request headers:") for header, value in request.headers.items(): + if header.lower() == 'authorization': + value = '*****' _LOGGER.debug(" %r: %r", header, value) _LOGGER.debug("Request body:") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest/paging.py new/msrest-0.4.11/msrest/paging.py --- old/msrest-0.4.4/msrest/paging.py 2016-09-14 17:28:38.000000000 +0200 +++ new/msrest-0.4.11/msrest/paging.py 2017-06-21 21:21:28.000000000 +0200 @@ -23,14 +23,17 @@ # IN THE SOFTWARE. # # -------------------------------------------------------------------------- - -import collections +try: + from collections.abc import Iterator + xrange = range +except ImportError: + from collections import Iterator from .serialization import Deserializer from .pipeline import ClientRawResponse -class Paged(collections.Iterable): +class Paged(Iterator): """A container for paged REST responses. :param requests.Response response: server response object. @@ -42,23 +45,18 @@ _attribute_map = {} def __init__(self, command, classes, raw_headers=None): - self.next_link = "" - self.current_page = [] + # Sets next_link, current_page, and _current_page_iter_index. + self.reset() self._derserializer = Deserializer(classes) self._get_next = command self._response = None self._raw_headers = raw_headers def __iter__(self): - """Iterate over response items in current page, automatically - retrieves next page. - """ - for i in self.current_page: - yield i - - while self.next_link is not None: - for i in self.next(): - yield i + """Return 'self'.""" + # Since iteration mutates this object, consider it an iterator in-and-of + # itself. + return self @classmethod def _get_subtype_map(cls): @@ -73,22 +71,42 @@ return raw def get(self, url): - """Get arbitrary page. + """Get an arbitrary page. + + This resets the iterator and then fully consumes it to return the + specific page **only**. :param str url: URL to arbitrary page results. """ + self.reset() self.next_link = url - return self.next() + return self.advance_page() def reset(self): """Reset iterator to first page.""" self.next_link = "" self.current_page = [] + self._current_page_iter_index = 0 - def next(self): - """Get next page.""" + def advance_page(self): if self.next_link is None: - raise GeneratorExit("End of paging") + raise StopIteration("End of paging") + self._current_page_iter_index = 0 self._response = self._get_next(self.next_link) self._derserializer(self, self._response) return self.current_page + + def __next__(self): + """Iterate through responses.""" + # Storing the list iterator might work out better, but there's no + # guarantee that some code won't replace the list entirely with a copy, + # invalidating an list iterator that might be saved between iterations. + if self.current_page and self._current_page_iter_index < len(self.current_page): + response = self.current_page[self._current_page_iter_index] + self._current_page_iter_index += 1 + return response + else: + self.advance_page() + return self.__next__() + + next = __next__ # Python 2 compatibility. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest/pipeline.py new/msrest-0.4.11/msrest/pipeline.py --- old/msrest-0.4.4/msrest/pipeline.py 2016-08-08 22:12:12.000000000 +0200 +++ new/msrest-0.4.11/msrest/pipeline.py 2017-06-21 21:21:28.000000000 +0200 @@ -42,136 +42,6 @@ _LOGGER = logging.getLogger(__name__) -class ClientHTTPAdapter(requests.adapters.HTTPAdapter): - """HTTP Adapter to customize REST pipeline in Requests. - Handles both request and response objects. - """ - - def __init__(self, config): - self._client_hooks = { - 'request': ClientPipelineHook(), - 'response': ClientPipelineHook()} - - super(ClientHTTPAdapter, self).__init__() - - def _test_pipeline(self, *args, **kwargs): - """ - Custom pipeline manipulation for test framework, - """ - test_hosts = [('http', 'localhost', 3000), - ('http', 'localhost.', 3000)] - for host in test_hosts: - self.poolmanager.pools[host] = \ - ClientHTTPConnectionPool(host[1], port=host[2]) - - def event_hook(event): - """Function decorator to wrap events with hook callbacks.""" - def event_wrapper(func): - - @functools.wraps(func) - def execute_hook(self, *args, **kwargs): - return self._client_hooks[event](func, self, *args, **kwargs) - - return execute_hook - return event_wrapper - - def add_hook(self, event, callback, precall=True, overwrite=False): - """Add an event callback to hook into the REST pipeline. - - :param str event: The event to hook. Currently supports 'request' - and 'response'. - :param callable callback: The function to call. - :param bool precall: Whether the function will be called before or - after the event. - :param bool overwrite: Whether the function will overwrite the - original event. - :raises: TypeError if the callback is not a function. - :raises: KeyError if the event is not supported. - """ - if not callable(callback): - raise TypeError("Callback must be callable.") - - if event not in self._client_hooks: - raise KeyError( - "Event: {!r} is not able to be hooked.".format(event)) - - if precall: - debug = "Adding %r callback before event: %r" - _LOGGER.debug(debug, callback.__name__, event) - self._client_hooks[event].precalls.append(callback) - else: - debug = "Adding %r callback after event: %r" - _LOGGER.debug(debug, callback.__name__, event) - self._client_hooks[event].postcalls.append(callback) - - debug = "Callback to overwrite original call: %r" - _LOGGER.debug(debug, overwrite) - self._client_hooks[event].overwrite_call = overwrite - - def remove_hook(self, event, callback): - """Remove a specified event hook from the pipeline. - - :param str event: The event to hook. Currently supports 'request' - and 'response'. - :param callable callback: The function to remove. - :raises: KeyError if the event is not supported. - """ - try: - hook_event = self._client_hooks[event] - except KeyError: - raise KeyError( - "Event: {!r} is not able to be hooked.".format(event)) - else: - self._client_hooks[event].precalls = [ - c for c in hook_event.precalls if c != callback] - self._client_hooks[event].postcalls = [ - c for c in hook_event.postcalls if c != callback] - - @event_hook("request") - def send(self, request, stream=False, timeout=None, verify=True, - cert=None, proxies=None): - """Sends the request object.""" - return super(ClientHTTPAdapter, self).send( - request, stream, timeout, verify, cert, proxies) - - @event_hook("response") - def build_response(self, req, resp): - """Builds the response object.""" - return super(ClientHTTPAdapter, self).build_response(req, resp) - - -class ClientPipelineHook(object): - """Pipeline hook to wrap a specific event. - - :param bool overwrite: Whether to overwrite the original event. - """ - - def __init__(self, overwrite=False): - self.precalls = [] - self.postcalls = [] - self.overwrite_call = overwrite - - def __call__(self, func, *args, **kwargs): - """Execute event and any wrapping callbacks. - The result of the event is passed into all post-event - callbacks with a 'result' keyword arg. - """ - result = requests.Response() - - for call in self.precalls: - # Execute any pre-event callabcks - call(*args, **kwargs) - - if not self.overwrite_call: - # Execute original event - result = func(*args, **kwargs) - - for call in self.postcalls: - # Execute any post-event callbacks - result = call(result=result, *args, **kwargs) - - return result - class ClientRequest(requests.Request): """Wrapper for requests.Request object.""" @@ -255,38 +125,6 @@ self.headers[name] = value -class ClientRetry(Retry): - """Wrapper for urllib3 Retry object. - """ - - def __init__(self, **kwargs): - self.retry_cookie = None - - return super(ClientRetry, self).__init__(**kwargs) - - def increment(self, method=None, url=None, response=None, - error=None, _pool=None, _stacktrace=None): - increment = super(ClientRetry, self).increment( - method, url, response, error, _pool, _stacktrace) - - if response: - # Fixes open socket warnings in Python 3. - response.close() - response.release_conn() - - # Collect retry cookie - we only do this for the test server - # at this point, unless we implement a proper cookie policy. - increment.retry_cookie = response.getheader("Set-Cookie") - return increment - - def is_forced_retry(self, method, status_code): - debug = "Received status: %r for method %r" - _LOGGER.debug(debug, status_code, method) - output = super(ClientRetry, self).is_forced_retry(method, status_code) - _LOGGER.debug("Is forced retry: %r", output) - return output - - class ClientRetryPolicy(object): """Retry configuration settings. Container for retry policy object. @@ -295,7 +133,7 @@ safe_codes = [i for i in range(500) if i != 408] + [501, 505] def __init__(self): - self.policy = ClientRetry() + self.policy = Retry() self.policy.total = 3 self.policy.connect = 3 self.policy.read = 3 @@ -419,36 +257,3 @@ return {'timeout': self.timeout, 'verify': self.verify, 'cert': self.cert} - - -class ClientHTTPConnectionPool(HTTPConnectionPool): - """Cookie logic only used for test server (localhost)""" - - def _add_test_cookie(self, retries, headers): - host = self.host.strip('.') - if retries.retry_cookie and host == 'localhost': - if headers: - headers['cookie'] = retries.retry_cookie - else: - self.headers['cookie'] = retries.retry_cookie - - def _remove_test_cookie(self, retries, headers): - host = self.host.strip('.') - if retries.retry_cookie and host == 'localhost': - retries.retry_cookie = None - if headers: - del headers['cookie'] - else: - del self.headers['cookie'] - - def urlopen(self, method, url, body=None, headers=None, - retries=None, *args, **kwargs): - if hasattr(retries, 'retry_cookie'): - self._add_test_cookie(retries, headers) - - response = super(ClientHTTPConnectionPool, self).urlopen( - method, url, body, headers, retries, *args, **kwargs) - - if hasattr(retries, 'retry_cookie'): - self._remove_test_cookie(retries, headers) - return response diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest/serialization.py new/msrest-0.4.11/msrest/serialization.py --- old/msrest-0.4.4/msrest/serialization.py 2016-08-15 19:35:24.000000000 +0200 +++ new/msrest-0.4.11/msrest/serialization.py 2017-06-21 21:21:28.000000000 +0200 @@ -37,7 +37,6 @@ except ImportError: from urllib.parse import quote -import chardet import isodate from .exceptions import ( @@ -94,7 +93,7 @@ def __eq__(self, other): """Compare objects by comparing all attributes.""" if isinstance(other, self.__class__): - return self.__class__.__dict__ == other.__class__.__dict__ + return self.__dict__ == other.__dict__ return False def __ne__(self, other): @@ -105,39 +104,46 @@ return str(self.__dict__) @classmethod - def _get_subtype_map(cls): - attr = '_subtype_map' - parents = cls.__bases__ - for base in parents: - if hasattr(base, attr) and base._subtype_map: - return base._subtype_map - return {} + def _flatten_subtype(cls, key, objects): + if not '_subtype_map' in cls.__dict__: + return {} + result = dict(cls._subtype_map[key]) + for valuetype in cls._subtype_map[key].values(): + result.update(objects[valuetype]._flatten_subtype(key, objects)) + return result @classmethod def _classify(cls, response, objects): """Check the class _subtype_map for any child classes. - We want to ignore any inheirited _subtype_maps. + We want to ignore any inherited _subtype_maps. + Remove the polymorphic key from the initial data. """ - try: - map = cls.__dict__.get('_subtype_map', {}) + for subtype_key in cls.__dict__.get('_subtype_map', {}).keys(): + subtype_value = None - for _type, _classes in map.items(): - classification = response.get(_type) + rest_api_response_key = _decode_attribute_map_key(cls._attribute_map[subtype_key]['key']) + subtype_value = response.pop(rest_api_response_key, None) or response.pop(subtype_key, None) + if subtype_value: + # Try to match base class. Can be class name only + # (bug to fix in Autorest to support x-ms-discriminator-name) + if cls.__name__ == subtype_value: + return cls + flatten_mapping_type = cls._flatten_subtype(subtype_key, objects) try: - return objects[_classes[classification]] + return objects[flatten_mapping_type[subtype_value]] except KeyError: - pass + raise DeserializationError("Subtype value {} has no mapping".format(subtype_value)) + else: + raise DeserializationError("Discriminator {} cannot be absent or null".format(subtype_key)) + return cls - for c in _classes: - try: - _cls = objects[_classes[c]] - return _cls._classify(response, objects) - except (KeyError, TypeError): - continue - raise TypeError("Object cannot be classified futher.") - except AttributeError: - raise TypeError("Object cannot be classified futher.") +def _decode_attribute_map_key(key): + """This decode a key in an _attribute_map to the actual key we want to look at + inside the received data. + :param str key: A key string from the generated code + """ + return key.replace('\\.', '.') def _convert_to_datatype(data, data_type, localtypes): if data is None: @@ -157,6 +163,7 @@ elif issubclass(data_obj, Enum): return data elif not isinstance(data, data_obj): + data_obj = data_obj._classify(data, localtypes) result = { key: _convert_to_datatype( data[key], @@ -165,10 +172,14 @@ } data = data_obj(**result) else: + constants = [name for name, config in getattr(data, '_validation', {}).items() + if config.get('constant')] try: - for attr, map in data._attribute_map.items(): + for attr, mapconfig in data._attribute_map.items(): + if attr in constants: + continue setattr(data, attr, _convert_to_datatype( - getattr(data, attr), map['type'], localtypes)) + getattr(data, attr), mapconfig['type'], localtypes)) except AttributeError: pass return data @@ -191,11 +202,11 @@ "maximum_ex": lambda x, y: x >= y, "min_items": lambda x, y: len(x) < y, "max_items": lambda x, y: len(x) > y, - "pattern": lambda x, y: not re.match(y, x), + "pattern": lambda x, y: not re.match(y, x, re.UNICODE), "unique": lambda x, y: len(x) != len(set(x)), "multiple": lambda x, y: x % y != 0 } - flattten = re.compile(r"(?<!\\)\.") + flatten = re.compile(r"(?<!\\)\.") def __init__(self, classes=None): self.serialize_type = { @@ -241,18 +252,17 @@ try: attributes = target_obj._attribute_map - self._classify_data(target_obj, class_name, serialized) - for attr, map in attributes.items(): attr_name = attr + debug_name = "{}.{}".format(class_name, attr_name) try: - keys = self.flattten.split(map['key']) - keys = [k.replace('\\.', '.') for k in keys] + keys = self.flatten.split(map['key']) + keys = [_decode_attribute_map_key(k) for k in keys] attr_type = map['type'] orig_attr = getattr(target_obj, attr) validation = target_obj._validation.get(attr_name, {}) orig_attr = self.validate( - orig_attr, attr_name, **validation) + orig_attr, debug_name, **validation) new_attr = self.serialize_data( orig_attr, attr_type, **kwargs) @@ -271,24 +281,12 @@ continue except (AttributeError, KeyError, TypeError) as err: - msg = "Attribute {} in object {} cannot be serialized.".format( - attr_name, class_name) + msg = "Attribute {} in object {} cannot be serialized.\n{}".format( + attr_name, class_name, str(target_obj)) raise_with_traceback(SerializationError, msg, err) else: return serialized - def _classify_data(self, target_obj, class_name, serialized): - """Check whether this object is a child and therefor needs to be - classified in the message. - """ - try: - for _type, _classes in target_obj._get_subtype_map().items(): - for ref, name in _classes.items(): - if name == class_name: - serialized[_type] = ref - except AttributeError: - pass # TargetObj has no _subtype_map so we don't need to classify. - def body(self, data, data_type, **kwargs): """Serialize data intended for a request body. @@ -498,10 +496,10 @@ serialized = {} for key, value in attr.items(): try: - serialized[str(key)] = self.serialize_data( + serialized[self.serialize_unicode(key)] = self.serialize_data( value, dict_type, **kwargs) except ValueError: - serialized[str(key)] = None + serialized[self.serialize_unicode(key)] = None return serialized def serialize_object(self, attr, **kwargs): @@ -518,15 +516,17 @@ obj_type = type(attr) if obj_type in self.basic_types: return self.serialize_basic(attr, self.basic_types[obj_type]) + elif obj_type in self.dependencies.values(): + return self._serialize(attr) if obj_type == dict: serialized = {} for key, value in attr.items(): try: - serialized[str(key)] = self.serialize_object( + serialized[self.serialize_unicode(key)] = self.serialize_object( value, **kwargs) except ValueError: - serialized[str(key)] = None + serialized[self.serialize_unicode(key)] = None return serialized if obj_type == list: @@ -751,9 +751,9 @@ while '.' in key: dict_keys = self.flatten.split(key) if len(dict_keys) == 1: - key = dict_keys[0].replace('\\.', '.') + key = _decode_attribute_map_key(dict_keys[0]) break - working_key = dict_keys[0].replace('\\.', '.') + working_key = _decode_attribute_map_key(dict_keys[0]) working_data = working_data.get(working_key, data) key = '.'.join(dict_keys[1:]) @@ -785,8 +785,8 @@ try: target = target._classify(data, self.dependencies) - except (TypeError, AttributeError): - pass # Target has no subclasses, so can't classify further. + except AttributeError: + pass # Target is not a Model, no classify return target, target.__class__.__name__ def _unpack_content(self, raw_data): @@ -797,25 +797,17 @@ be returned. """ if raw_data and isinstance(raw_data, bytes): - data = raw_data.decode( - encoding=chardet.detect(raw_data)['encoding']) + data = raw_data.decode(encoding='utf-8') else: data = raw_data - if hasattr(raw_data, 'content'): - if not raw_data.content: + try: + # This is a requests.Response, json valid if nothing fail + if not raw_data.text: return None - - if isinstance(raw_data.content, bytes): - encoding = chardet.detect(raw_data.content)["encoding"] - data = raw_data.content.decode(encoding=encoding) - else: - data = raw_data.content - try: - return json.loads(data) - except (ValueError, TypeError): - return data - + return json.loads(raw_data.text) + except (ValueError, TypeError, AttributeError): + pass return data def _instantiate_model(self, response, attrs): @@ -825,7 +817,7 @@ :param d_attrs: The deserialized response attributes. """ if callable(response): - subtype = response._get_subtype_map() + subtype = getattr(response, '_subtype_map', {}) try: readonly = [k for k, v in response._validation.items() if v.get('readonly')] @@ -906,9 +898,9 @@ :rtype: dict """ if isinstance(attr, list): - return {str(x['key']): self.deserialize_data( + return {x['key']: self.deserialize_data( x['value'], dict_type) for x in attr} - return {str(k): self.deserialize_data( + return {k: self.deserialize_data( v, dict_type) for k, v in attr.items()} def deserialize_object(self, attr, **kwargs): @@ -931,10 +923,10 @@ deserialized = {} for key, value in attr.items(): try: - deserialized[str(key)] = self.deserialize_object( + deserialized[key] = self.deserialize_object( value, **kwargs) except ValueError: - deserialized[str(key)] = None + deserialized[key] = None return deserialized if obj_type == list: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest/service_client.py new/msrest-0.4.11/msrest/service_client.py --- old/msrest-0.4.4/msrest/service_client.py 2016-08-08 22:09:28.000000000 +0200 +++ new/msrest-0.4.11/msrest/service_client.py 2017-06-21 21:21:28.000000000 +0200 @@ -33,10 +33,10 @@ from urllib.parse import urljoin, urlparse from oauthlib import oauth2 -import requests +import requests.adapters from .authentication import Authentication -from .pipeline import ClientHTTPAdapter, ClientRequest +from .pipeline import ClientRequest from .http_logger import log_request, log_response from .exceptions import ( TokenExpiredError, @@ -60,13 +60,8 @@ def __init__(self, creds, config): self.config = config self.creds = creds if creds else Authentication() - - self._adapter = ClientHTTPAdapter(config) self._headers = {} - self._adapter.add_hook("request", log_request) - self._adapter.add_hook("response", log_response, precall=False) - def _format_data(self, data): """Format field data according to whether it is a stream or a string for a form-data request. @@ -131,14 +126,28 @@ return redirect_logic(resp, req, **kwargs) if attempt else [] session.resolve_redirects = wrapped_redirect - self._adapter.max_retries = config.get( + def log_hook(r, *args, **kwargs): + log_request(None, r.request) + log_response(None, r.request, r, result=r) + session.hooks['response'].append(log_hook) + + def make_user_hook_cb(user_hook, session): + def user_hook_cb(r, *args, **kwargs): + kwargs.setdefault("msrest", {})['session'] = session + return user_hook(r, *args, **kwargs) + return user_hook_cb + + for user_hook in self.config.hooks: + session.hooks['response'].append(make_user_hook_cb(user_hook, session)) + + max_retries = config.get( 'retries', self.config.retry_policy()) for protocol in self._protocols: - session.mount(protocol, self._adapter) - + session.mount(protocol, + requests.adapters.HTTPAdapter(max_retries=max_retries)) return kwargs - def send_formdata(self, request, headers={}, content={}, **config): + def send_formdata(self, request, headers=None, content=None, **config): """Send data as a multipart form-data request. We only deal with file-like objects or strings at this point. The requests is not yet streamed. @@ -148,11 +157,11 @@ :param dict content: Dictionary of the fields of the formdata. :param config: Any specific config overrides. """ + if content is None: + content = {} file_data = {f: self._format_data(d) for f, d in content.items()} - try: - del headers['Content-Type'] - except KeyError: - pass + if headers: + headers.pop('Content-Type', None) return self.send(request, headers, None, files=file_data, **config) def send(self, request, headers=None, content=None, **config): @@ -231,7 +240,6 @@ callback(chunk, response=data) yield chunk data.close() - self._adapter.close() def stream_upload(self, data, callback): """Generator for streaming request body data. @@ -261,26 +269,6 @@ url = urljoin(base + '/', url) return url - def add_hook(self, event, hook, precall=True, overwrite=False): - """ - Add event callback. - - :param str event: The pipeline event to hook. Currently supports - 'request' and 'response'. - :param callable hook: The callback function. - """ - self._adapter.add_hook(event, hook, precall, overwrite) - - def remove_hook(self, event, hook): - """ - Remove event callback. - - :param str event: The pipeline event to hook. Currently supports - 'request' and 'response'. - :param callable hook: The callback function. - """ - self._adapter.remove_hook(event, hook) - def add_header(self, header, value): """Add a persistent header - this header will be applied to all requests sent during the current client session. @@ -290,7 +278,7 @@ """ self._headers[header] = value - def get(self, url=None, params={}): + def get(self, url=None, params=None): """Create a GET request object. :param str url: The request URL. @@ -300,7 +288,7 @@ request.method = 'GET' return request - def put(self, url=None, params={}): + def put(self, url=None, params=None): """Create a PUT request object. :param str url: The request URL. @@ -310,7 +298,7 @@ request.method = 'PUT' return request - def post(self, url=None, params={}): + def post(self, url=None, params=None): """Create a POST request object. :param str url: The request URL. @@ -320,7 +308,7 @@ request.method = 'POST' return request - def head(self, url=None, params={}): + def head(self, url=None, params=None): """Create a HEAD request object. :param str url: The request URL. @@ -330,7 +318,7 @@ request.method = 'HEAD' return request - def patch(self, url=None, params={}): + def patch(self, url=None, params=None): """Create a PATCH request object. :param str url: The request URL. @@ -340,7 +328,7 @@ request.method = 'PATCH' return request - def delete(self, url=None, params={}): + def delete(self, url=None, params=None): """Create a DELETE request object. :param str url: The request URL. @@ -350,7 +338,7 @@ request.method = 'DELETE' return request - def merge(self, url=None, params={}): + def merge(self, url=None, params=None): """Create a MERGE request object. :param str url: The request URL. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest/version.py new/msrest-0.4.11/msrest/version.py --- old/msrest-0.4.4/msrest/version.py 2016-09-14 17:28:38.000000000 +0200 +++ new/msrest-0.4.11/msrest/version.py 2017-06-21 21:21:28.000000000 +0200 @@ -25,4 +25,4 @@ # -------------------------------------------------------------------------- -msrest_version = "0.4.4" +msrest_version = "0.4.11" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest.egg-info/PKG-INFO new/msrest-0.4.11/msrest.egg-info/PKG-INFO --- old/msrest-0.4.4/msrest.egg-info/PKG-INFO 2016-09-14 17:29:02.000000000 +0200 +++ new/msrest-0.4.11/msrest.egg-info/PKG-INFO 2017-06-21 21:22:45.000000000 +0200 @@ -1,14 +1,19 @@ Metadata-Version: 1.1 Name: msrest -Version: 0.4.4 +Version: 0.4.11 Summary: AutoRest swagger generator Python client runtime. -Home-page: https://github.com/xingwu1/autorest/tree/python/ClientRuntimes/Python/msrest +Home-page: https://github.com/Azure/msrest-for-python Author: Microsoft Corporation Author-email: UNKNOWN License: MIT License Description: AutoRest: Python Client Runtime ================================ + .. image:: https://travis-ci.org/Azure/msrest-for-python.svg?branch=master + :target: https://travis-ci.org/Azure/msrest-for-python + + .. image:: https://codecov.io/gh/azure/msrest-for-python/branch/master/graph/badge.svg + :target: https://codecov.io/gh/azure/msrest-for-python Installation ------------ @@ -23,6 +28,71 @@ Release History --------------- + 2017-06-21 Version 0.4.11 + +++++++++++++++++++++++++ + + **Bugfixes** + + - Fix incorrect dependency to "requests" 2.14.x, instead of 2.x meant in 0.4.8 + + 2017-06-15 Version 0.4.10 + +++++++++++++++++++++++++ + + **Features** + + - Add requests hooks to configuration + + 2017-06-08 Version 0.4.9 + ++++++++++++++++++++++++ + + **Bugfixes** + + - Accept "null" value for paging array as an empty list and do not raise (#30) + + 2017-05-22 Version 0.4.8 + ++++++++++++++++++++++++ + + **Bugfixes** + + - Fix random "pool is closed" error (#29) + - Fix requests dependency to version 2.x, since version 3.x is annunced to be breaking. + + 2017-04-04 Version 0.4.7 + ++++++++++++++++++++++++ + + **BugFixes** + + - Refactor paging #22: + + - "next" is renamed "advance_page" and "next" returns only 1 element (Python 2 expected behavior) + - paging objects are now real generator and support the "next()" built-in function without need for "iter()" + + - Raise accurate DeserialisationError on incorrect RestAPI discriminator usage #27 + - Fix discriminator usage of the base class name #27 + - Remove default mutable arguments in Clients #20 + - Fix object comparison in some scenarios #24 + + 2017-03-06 Version 0.4.6 + ++++++++++++++++++++++++ + + **Bugfixes** + + - Allow Model sub-classes to be serialized if type is "object" + + 2017-02-13 Version 0.4.5 + ++++++++++++++++++++++++ + + **Bugfixes** + + - Fix polymorphic deserialization #11 + - Fix regexp validation if '\\w' is used in Python 2.7 #13 + - Fix dict deserialization if keys are unicode in Python 2.7 + + **Improvements** + + - Add polymorphic serialisation from dict objects + - Remove chardet and use HTTP charset declaration (fallback to utf8) + 2016-09-14 Version 0.4.4 ++++++++++++++++++++++++ @@ -152,6 +222,7 @@ ++++++++++++++++++++++++ - Initial release. + Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Programming Language :: Python @@ -161,5 +232,6 @@ Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 Classifier: License :: OSI Approved :: MIT License Classifier: Topic :: Software Development diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest.egg-info/SOURCES.txt new/msrest-0.4.11/msrest.egg-info/SOURCES.txt --- old/msrest-0.4.4/msrest.egg-info/SOURCES.txt 2016-09-14 17:29:02.000000000 +0200 +++ new/msrest-0.4.11/msrest.egg-info/SOURCES.txt 2017-06-21 21:22:45.000000000 +0200 @@ -1,5 +1,6 @@ MANIFEST.in -readme.rst +README.rst +setup.cfg setup.py msrest/__init__.py msrest/authentication.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/msrest.egg-info/requires.txt new/msrest-0.4.11/msrest.egg-info/requires.txt --- old/msrest-0.4.4/msrest.egg-info/requires.txt 2016-09-14 17:29:02.000000000 +0200 +++ new/msrest-0.4.11/msrest.egg-info/requires.txt 2017-06-21 21:22:45.000000000 +0200 @@ -1,7 +1,7 @@ -requests>=2.7.0 -keyring>=5.6 +requests~=2.14 requests_oauthlib>=0.5.0 isodate>=0.5.4 -certifi>=2015.9.6.2 -chardet>=2.3.0 +certifi>=2017.4.17 + +[:python_version<'3.4'] enum34>=1.0.4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/readme.rst new/msrest-0.4.11/readme.rst --- old/msrest-0.4.4/readme.rst 2016-09-14 17:28:38.000000000 +0200 +++ new/msrest-0.4.11/readme.rst 1970-01-01 01:00:00.000000000 +0100 @@ -1,146 +0,0 @@ -AutoRest: Python Client Runtime -================================ - - -Installation ------------- - -To install: - -.. code-block:: bash - - $ pip install msrest - - -Release History ---------------- - -2016-09-14 Version 0.4.4 -++++++++++++++++++++++++ - -**Bugfixes** - -- Remove paging URL validation, part of fix https://github.com/Azure/autorest/pull/1420 - -**Disclaimer** - -In order to get paging fixes for impacted clients, you need this package and Autorest > 0.17.0 Nightly 20160913 - -2016-09-01 Version 0.4.3 -++++++++++++++++++++++++ - -**Bugfixes** - -- Better exception message (https://github.com/Azure/autorest/pull/1300) - -2016-08-15 Version 0.4.2 -++++++++++++++++++++++++ - -**Bugfixes** - -- Fix serialization if "object" type contains None (https://github.com/Azure/autorest/issues/1353) - -2016-08-08 Version 0.4.1 -++++++++++++++++++++++++ - -**Bugfixes** - -- Fix compatibility issues with requests 2.11.0 (https://github.com/Azure/autorest/issues/1337) -- Allow url of ClientRequest to have parameters (https://github.com/Azure/autorest/issues/1217) - -2016-05-25 Version 0.4.0 -++++++++++++++++++++++++ - -This version has no bug fixes, but implements new features of Autorest: -- Base64 url type -- unixtime type -- x-ms-enum modelAsString flag - -**Behaviour changes** - -- Add Platform information in UserAgent -- Needs Autorest > 0.17.0 Nightly 20160525 - -2016-04-26 Version 0.3.0 -++++++++++++++++++++++++ - -**Bugfixes** - -- Read only values are no longer in __init__ or sent to the server (https://github.com/Azure/autorest/pull/959) -- Useless kwarg removed - -**Behaviour changes** - -- Needs Autorest > 0.16.0 Nightly 20160426 - - -2016-03-25 Version 0.2.0 -++++++++++++++++++++++++ - -**Bugfixes** - -- Manage integer enum values (https://github.com/Azure/autorest/pull/879) -- Add missing application/json Accept HTTP header (https://github.com/Azure/azure-sdk-for-python/issues/553) - -**Behaviour changes** - -- Needs Autorest > 0.16.0 Nightly 20160324 - - -2016-03-21 Version 0.1.3 -++++++++++++++++++++++++ - -**Bugfixes** - -- Deserialisation of generic resource if null in JSON (https://github.com/Azure/azure-sdk-for-python/issues/544) - - -2016-03-14 Version 0.1.2 -++++++++++++++++++++++++ - -**Bugfixes** - -- urllib3 side effect (https://github.com/Azure/autorest/issues/824) - - -2016-03-04 Version 0.1.1 -++++++++++++++++++++++++ - -**Bugfixes** - -- Source package corrupted in Pypi (https://github.com/Azure/autorest/issues/799) - -2016-03-04 Version 0.1.0 -+++++++++++++++++++++++++ - -**Behavioural Changes** - -- Removed custom logging set up and configuration. All loggers are now children of the root logger 'msrest' with no pre-defined configurations. -- Replaced _required attribute in Model class with more extensive _validation dict. - -**Improvement** - -- Removed hierarchy scanning for attribute maps from base Model class - relies on generator to populate attribute - maps according to hierarchy. -- Base class Paged now inherits from collections.Iterable. -- Data validation during serialization using custom parameters (e.g. max, min etc). -- Added ValidationError to be raised if invalid data encountered during serialization. - -2016-02-29 Version 0.0.3 -++++++++++++++++++++++++ - -**Bugfixes** - -- Source package corrupted in Pypi (https://github.com/Azure/autorest/issues/718) - -2016-02-19 Version 0.0.2 -++++++++++++++++++++++++ - -**Bugfixes** - -- Fixed bug in exception logging before logger configured. - -2016-02-19 Version 0.0.1 -++++++++++++++++++++++++ - -- Initial release. \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/setup.cfg new/msrest-0.4.11/setup.cfg --- old/msrest-0.4.4/setup.cfg 2016-09-14 17:29:02.000000000 +0200 +++ new/msrest-0.4.11/setup.cfg 2017-06-21 21:22:45.000000000 +0200 @@ -1,5 +1,7 @@ +[bdist_wheel] +universal = 1 + [egg_info] -tag_date = 0 -tag_svn_revision = 0 tag_build = +tag_date = 0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/msrest-0.4.4/setup.py new/msrest-0.4.11/setup.py --- old/msrest-0.4.4/setup.py 2016-09-14 17:28:38.000000000 +0200 +++ new/msrest-0.4.11/setup.py 2017-06-21 21:21:28.000000000 +0200 @@ -28,14 +28,13 @@ setup( name='msrest', - version='0.4.4', + version='0.4.11', author='Microsoft Corporation', packages=['msrest'], - url=("https://github.com/xingwu1/autorest/tree/python/" - "ClientRuntimes/Python/msrest"), + url=("https://github.com/Azure/msrest-for-python"), license='MIT License', description='AutoRest swagger generator Python client runtime.', - long_description=open('readme.rst').read(), + long_description=open('README.rst').read(), classifiers=[ 'Development Status :: 4 - Beta', 'Programming Language :: Python', @@ -45,14 +44,16 @@ 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', 'License :: OSI Approved :: MIT License', 'Topic :: Software Development'], install_requires=[ - "requests>=2.7.0", - "keyring>=5.6", + "requests~=2.14", "requests_oauthlib>=0.5.0", "isodate>=0.5.4", - "certifi>=2015.9.6.2", - "chardet>=2.3.0", - "enum34>=1.0.4"], + "certifi>=2017.4.17", + ], + extras_require={ + ":python_version<'3.4'": ['enum34>=1.0.4'], + } )