Hello community,
here is the log from the commit of package python-marathon for
openSUSE:Leap:15.2 checked in at 2020-03-15 13:35:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-marathon (Old)
and /work/SRC/openSUSE:Leap:15.2/.python-marathon.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-marathon"
Sun Mar 15 13:35:46 2020 rev:16 rq:783214 version:0.12.0
Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/python-marathon/python-marathon.changes
2020-03-09 18:08:37.732961224 +0100
+++
/work/SRC/openSUSE:Leap:15.2/.python-marathon.new.3160/python-marathon.changes
2020-03-15 13:35:50.658819592 +0100
@@ -1,0 +2,8 @@
+Thu Mar 5 14:40:42 UTC 2020 - [email protected]
+
+- version update to 0.12.0
+ Downloading Log For App #265
+ Always create TZ-aware datetime objects. (also drop support for python 2)
#267 (EvanKrall)
+ Compatible with event stream redirect behavior. #262 (fengyehong)
+
+-------------------------------------------------------------------
Old:
----
marathon-0.11.0.tar.gz
New:
----
marathon-0.12.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-marathon.spec ++++++
--- /var/tmp/diff_new_pack.E5LhLa/_old 2020-03-15 13:35:51.010819802 +0100
+++ /var/tmp/diff_new_pack.E5LhLa/_new 2020-03-15 13:35:51.014819804 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-marathon
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,8 +17,9 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
+%define skip_python2 1
Name: python-marathon
-Version: 0.11.0
+Version: 0.12.0
Release: 0
Summary: Marathon Client Library
License: MIT
++++++ marathon-0.11.0.tar.gz -> marathon-0.12.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/PKG-INFO new/marathon-0.12.0/PKG-INFO
--- old/marathon-0.11.0/PKG-INFO 2019-01-15 20:14:09.000000000 +0100
+++ new/marathon-0.12.0/PKG-INFO 2019-11-14 02:39:46.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: marathon
-Version: 0.11.0
+Version: 0.12.0
Summary: Marathon Client Library
Home-page: https://github.com/thefactory/marathon-python
Author: Mike Babineau
@@ -13,9 +13,8 @@
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon/_compat.py
new/marathon-0.12.0/marathon/_compat.py
--- old/marathon-0.11.0/marathon/_compat.py 2017-06-21 18:49:56.000000000
+0200
+++ new/marathon-0.12.0/marathon/_compat.py 1970-01-01 01:00:00.000000000
+0100
@@ -1,11 +0,0 @@
-"""
-Support for python 2 & 3, ripped pieces from six.py
-"""
-import sys
-
-PY3 = sys.version_info[0] == 3
-
-if PY3:
- string_types = str,
-else:
- string_types = basestring,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon/client.py
new/marathon-0.12.0/marathon/client.py
--- old/marathon-0.11.0/marathon/client.py 2019-01-15 20:07:53.000000000
+0100
+++ new/marathon-0.12.0/marathon/client.py 2019-11-14 02:17:23.000000000
+0100
@@ -17,7 +17,7 @@
from .util import MarathonJsonEncoder, MarathonMinimalJsonEncoder
-class MarathonClient(object):
+class MarathonClient:
"""Client interface for the Marathon REST API."""
@@ -79,7 +79,7 @@
'Content-Type': 'application/json', 'Accept': 'application/json'}
if self.auth_token:
- headers['Authorization'] = "token={}".format(self.auth_token)
+ headers['Authorization'] = f"token={self.auth_token}"
response = None
servers = list(self.servers)
@@ -122,9 +122,12 @@
def _do_sse_request(self, path, params=None):
"""Query Marathon server for events."""
- for server in list(self.servers):
- url = ''.join([server.rstrip('/'), path])
+ urls = [''.join([server.rstrip('/'), path]) for server in self.servers]
+ while urls:
+ url = urls.pop()
try:
+ # Requests does not set the original Authorization header on
cross origin
+ # redirects. If set allow_redirects=True we may get a 401
response.
response = self.sse_session.get(
url,
params=params,
@@ -132,12 +135,16 @@
headers={'Accept': 'text/event-stream'},
auth=self.auth,
verify=self.verify,
+ allow_redirects=False
)
except Exception as e:
marathon.log.error(
'Error while calling %s: %s', url, e.message)
else:
- if response.ok:
+ if response.is_redirect and response.next:
+ urls.append(response.next.url)
+ marathon.log.debug(f"Got redirect to {response.next.url}")
+ elif response.ok:
return response.iter_lines()
raise MarathonError('No remaining Marathon servers to try')
@@ -250,7 +257,7 @@
params['embed'] = filtered_embed_params
response = self._do_request(
- 'GET', '/v2/apps/{app_id}'.format(app_id=app_id), params=params)
+ 'GET', f'/v2/apps/{app_id}', params=params)
return self._parse_response(response, MarathonApp, resource_name='app')
def restart_app(self, app_id, force=False):
@@ -263,7 +270,7 @@
"""
params = {'force': force}
response = self._do_request(
- 'POST', '/v2/apps/{app_id}/restart'.format(app_id=app_id),
params=params)
+ 'POST', f'/v2/apps/{app_id}/restart', params=params)
return response.json()
def update_app(self, app_id, app, force=False, minimal=True):
@@ -288,7 +295,7 @@
data = app.to_json(minimal=minimal)
response = self._do_request(
- 'PUT', '/v2/apps/{app_id}'.format(app_id=app_id), params=params,
data=data)
+ 'PUT', f'/v2/apps/{app_id}', params=params, data=data)
return response.json()
def update_apps(self, apps, force=False, minimal=True):
@@ -330,7 +337,7 @@
params = {'force': force}
data = json.dumps({'version': version})
response = self._do_request(
- 'PUT', '/v2/apps/{app_id}'.format(app_id=app_id), params=params,
data=data)
+ 'PUT', f'/v2/apps/{app_id}', params=params, data=data)
return response.json()
def delete_app(self, app_id, force=False):
@@ -344,7 +351,7 @@
"""
params = {'force': force}
response = self._do_request(
- 'DELETE', '/v2/apps/{app_id}'.format(app_id=app_id), params=params)
+ 'DELETE', f'/v2/apps/{app_id}', params=params)
return response.json()
def scale_app(self, app_id, instances=None, delta=None, force=False):
@@ -371,7 +378,7 @@
try:
app = self.get_app(app_id)
except NotFoundError:
- marathon.log.error('App "{app}" not found'.format(app=app_id))
+ marathon.log.error(f'App "{app_id}" not found')
return
desired = instances if instances is not None else (
@@ -414,7 +421,7 @@
:rtype: :class:`marathon.models.group.MarathonGroup`
"""
response = self._do_request(
- 'GET', '/v2/groups/{group_id}'.format(group_id=group_id))
+ 'GET', f'/v2/groups/{group_id}')
return self._parse_response(response, MarathonGroup)
def update_group(self, group_id, group, force=False, minimal=True):
@@ -439,7 +446,7 @@
data = group.to_json(minimal=minimal)
response = self._do_request(
- 'PUT', '/v2/groups/{group_id}'.format(group_id=group_id),
data=data, params=params)
+ 'PUT', f'/v2/groups/{group_id}', data=data, params=params)
return response.json()
def rollback_group(self, group_id, version, force=False):
@@ -471,7 +478,7 @@
"""
params = {'force': force}
response = self._do_request(
- 'DELETE', '/v2/groups/{group_id}'.format(group_id=group_id),
params=params)
+ 'DELETE', f'/v2/groups/{group_id}', params=params)
return response.json()
def scale_group(self, group_id, scale_by):
@@ -485,7 +492,7 @@
"""
data = {'scaleBy': scale_by}
response = self._do_request(
- 'PUT', '/v2/groups/{group_id}'.format(group_id=group_id),
data=json.dumps(data))
+ 'PUT', f'/v2/groups/{group_id}', data=json.dumps(data))
return response.json()
def list_tasks(self, app_id=None, **kwargs):
@@ -551,7 +558,7 @@
if host:
params['host'] = host
response = self._do_request(
- 'DELETE', '/v2/apps/{app_id}/tasks'.format(app_id=app_id),
params)
+ 'DELETE', f'/v2/apps/{app_id}/tasks', params)
# Marathon is inconsistent about what type of object it returns on
the multi
# task deletion endpoint, depending on the version of Marathon.
See:
#
https://github.com/mesosphere/marathon/blob/06a6f763a75fb6d652b4f1660685ae234bd15387/src/main/scala/mesosphere/marathon/api/v2/AppTasksResource.scala#L88-L95
@@ -569,12 +576,12 @@
# Pause until the tasks have been killed to avoid race
# conditions
- killed_task_ids = set(t.id for t in killed_tasks)
+ killed_task_ids = {t.id for t in killed_tasks}
running_task_ids = killed_task_ids
while killed_task_ids.intersection(running_task_ids):
time.sleep(1)
- running_task_ids = set(
- t.id for t in self.get_app(app_id).tasks)
+ running_task_ids = {
+ t.id for t in self.get_app(app_id).tasks}
if batch_delay == 0:
# Pause until the replacement tasks are healthy
@@ -619,7 +626,7 @@
:rtype: list[str]
"""
response = self._do_request(
- 'GET', '/v2/apps/{app_id}/versions'.format(app_id=app_id))
+ 'GET', f'/v2/apps/{app_id}/versions')
return [version for version in response.json()['versions']]
def get_version(self, app_id, version):
@@ -708,12 +715,12 @@
return {}
else:
response = self._do_request(
- 'DELETE',
'/v2/deployments/{deployment}'.format(deployment=deployment_id))
+ 'DELETE', f'/v2/deployments/{deployment_id}')
return response.json()
def reset_delay(self, app_id):
self._do_request(
- "DELETE", '/v2/queue/{app_id}/delay'.format(app_id=app_id)
+ "DELETE", f'/v2/queue/{app_id}/delay'
)
def get_info(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon/exceptions.py
new/marathon-0.12.0/marathon/exceptions.py
--- old/marathon-0.11.0/marathon/exceptions.py 2019-01-15 20:07:53.000000000
+0100
+++ new/marathon-0.12.0/marathon/exceptions.py 2019-11-14 02:17:23.000000000
+0100
@@ -14,7 +14,7 @@
self.error_message = content.get('message', self.error_message)
self.error_details = content.get('details')
self.status_code = response.status_code
- super(MarathonHttpError, self).__init__(self.__str__())
+ super().__init__(self.__str__())
def __repr__(self):
return 'MarathonHttpError: HTTP %s returned with message, "%s"' % \
@@ -39,7 +39,7 @@
class InvalidChoiceError(MarathonError):
def __init__(self, param, value, options):
- super(InvalidChoiceError, self).__init__(
+ super().__init__(
'Invalid choice "{value}" for param "{param}". Must be one of
{options}'.format(
param=param, value=value, options=options
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon/models/app.py
new/marathon-0.12.0/marathon/models/app.py
--- old/marathon-0.11.0/marathon/models/app.py 2018-08-08 19:24:04.000000000
+0200
+++ new/marathon-0.12.0/marathon/models/app.py 2019-11-14 02:17:23.000000000
+0100
@@ -1,12 +1,11 @@
-from datetime import datetime
-
from ..exceptions import InvalidChoiceError
from .base import MarathonResource, MarathonObject, assert_valid_path
from .constraint import MarathonConstraint
from .container import MarathonContainer
from .deployment import MarathonDeployment
from .task import MarathonTask
-from ..util import is_stringy, get_log
+from ..util import get_log
+from ..util import to_datetime
log = get_log()
@@ -216,7 +215,7 @@
if command is None:
self.command = None
- elif is_stringy(command):
+ elif isinstance(command, str):
self.command = {
"value": command
}
@@ -226,7 +225,7 @@
"value": command['value']
}
else:
- raise ValueError('Invalid command format: {}'.format(command))
+ raise ValueError(f'Invalid command format: {command}')
self.grace_period_seconds = grace_period_seconds
self.interval_seconds = interval_seconds
@@ -256,8 +255,6 @@
:param str version: app version with which this task was started
"""
- DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S.%fZ'
-
def __init__(self, app_id=None, host=None, message=None, task_id=None,
instance_id=None,
slave_id=None, state=None, timestamp=None, version=None):
self.app_id = app_id
@@ -267,8 +264,7 @@
self.instance_id = instance_id
self.slave_id = slave_id
self.state = state
- self.timestamp = timestamp if (timestamp is None or
isinstance(timestamp, datetime)) \
- else datetime.strptime(timestamp, self.DATETIME_FORMAT)
+ self.timestamp = to_datetime(timestamp)
self.version = version
@@ -320,7 +316,7 @@
def from_json(cls, attributes):
if attributes == cls.DISABLED:
return cls.DISABLED
- return super(MarathonUnreachableStrategy, cls).from_json(attributes)
+ return super().from_json(attributes)
class MarathonAppVersionInfo(MarathonObject):
@@ -334,25 +330,9 @@
:param str host: mesos slave running the task
"""
- DATETIME_FORMATS = [
- '%Y-%m-%dT%H:%M:%S.%fZ',
- '%Y-%m-%dT%H:%M:%SZ',
- ]
-
def __init__(self, last_scaling_at=None, last_config_change_at=None):
- self.last_scaling_at = self._to_datetime(last_scaling_at)
- self.last_config_change_at = self._to_datetime(last_config_change_at)
-
- def _to_datetime(self, timestamp):
- if (timestamp is None or isinstance(timestamp, datetime)):
- return timestamp
- else:
- for fmt in self.DATETIME_FORMATS:
- try:
- return datetime.strptime(timestamp, fmt)
- except ValueError:
- pass
- raise ValueError('Unrecognized datetime format:
{}'.format(timestamp))
+ self.last_scaling_at = to_datetime(last_scaling_at)
+ self.last_config_change_at = to_datetime(last_config_change_at)
class MarathonTaskStats(MarathonObject):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon/models/base.py
new/marathon-0.12.0/marathon/models/base.py
--- old/marathon-0.11.0/marathon/models/base.py 2018-08-08 19:24:04.000000000
+0200
+++ new/marathon-0.12.0/marathon/models/base.py 2019-11-14 02:17:23.000000000
+0100
@@ -4,7 +4,7 @@
from marathon.util import to_camel_case, to_snake_case, MarathonJsonEncoder,
MarathonMinimalJsonEncoder
-class MarathonObject(object):
+class MarathonObject:
"""Base Marathon object."""
def __repr__(self):
@@ -61,7 +61,7 @@
def __repr__(self):
if 'id' in list(vars(self).keys()):
- return "{clazz}::{id}".format(clazz=self.__class__.__name__,
id=self.id)
+ return f"{self.__class__.__name__}::{self.id}"
else:
return "{clazz}::{obj}".format(clazz=self.__class__.__name__,
obj=self.to_json())
@@ -78,7 +78,7 @@
return hash(self.to_json())
def __str__(self):
- return "{clazz}::".format(clazz=self.__class__.__name__) +
str(self.__dict__)
+ return f"{self.__class__.__name__}::" + str(self.__dict__)
# See:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon/models/events.py
new/marathon-0.12.0/marathon/models/events.py
--- old/marathon-0.11.0/marathon/models/events.py 2018-08-08
19:24:04.000000000 +0200
+++ new/marathon-0.12.0/marathon/models/events.py 2019-11-14
02:17:23.000000000 +0100
@@ -206,7 +206,7 @@
'pod_deleted_event': MarathonPodDeletedEvent,
}
- class_to_event = dict((v, k) for k, v in event_to_class.items())
+ class_to_event = {v: k for k, v in event_to_class.items()}
def process(self, event):
event_type = event['eventType']
@@ -214,4 +214,4 @@
clazz = self.event_to_class[event_type]
return clazz.from_json(event)
else:
- raise MarathonError('Unknown event_type: {}, data:
{}'.format(event_type, event))
+ raise MarathonError(f'Unknown event_type: {event_type}, data:
{event}')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon/models/task.py
new/marathon-0.12.0/marathon/models/task.py
--- old/marathon-0.11.0/marathon/models/task.py 2019-01-15 20:07:53.000000000
+0100
+++ new/marathon-0.12.0/marathon/models/task.py 2019-11-14 02:17:23.000000000
+0100
@@ -1,6 +1,5 @@
-from datetime import datetime
-
from .base import MarathonResource, MarathonObject
+from ..util import to_datetime
class MarathonTask(MarathonResource):
@@ -44,10 +43,8 @@
self.ports = ports or []
self.service_ports = service_ports or []
self.slave_id = slave_id
- self.staged_at = staged_at if (staged_at is None or
isinstance(staged_at, datetime)) \
- else datetime.strptime(staged_at, self.DATETIME_FORMAT)
- self.started_at = started_at if (started_at is None or
isinstance(started_at, datetime)) \
- else datetime.strptime(started_at, self.DATETIME_FORMAT)
+ self.staged_at = to_datetime(staged_at)
+ self.started_at = to_datetime(started_at)
self.state = state
self.version = version
self.ip_addresses = [
@@ -90,12 +87,9 @@
last_failure_cause=None, instance_id=None):
self.alive = alive
self.consecutive_failures = consecutive_failures
- self.first_success = first_success if (first_success is None or
isinstance(first_success, datetime)) \
- else datetime.strptime(first_success, self.DATETIME_FORMAT)
- self.last_failure = last_failure if (last_failure is None or
isinstance(last_failure, datetime)) \
- else datetime.strptime(last_failure, self.DATETIME_FORMAT)
- self.last_success = last_success if (last_success is None or
isinstance(last_success, datetime)) \
- else datetime.strptime(last_success, self.DATETIME_FORMAT)
+ self.first_success = to_datetime(first_success)
+ self.last_failure = to_datetime(last_failure)
+ self.last_success = to_datetime(last_success)
self.task_id = task_id
self.last_failure_cause = last_failure_cause
self.instance_id = instance_id
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon/util.py
new/marathon-0.12.0/marathon/util.py
--- old/marathon-0.11.0/marathon/util.py 2018-08-08 19:24:04.000000000
+0200
+++ new/marathon-0.12.0/marathon/util.py 2019-11-14 02:17:23.000000000
+0100
@@ -8,17 +8,11 @@
import simplejson as json
import re
-from ._compat import string_types
-
def get_log():
return logging.getLogger(__name__.split('.')[0])
-def is_stringy(obj):
- return isinstance(obj, string_types)
-
-
class MarathonJsonEncoder(json.JSONEncoder):
"""Custom JSON encoder for Marathon object serialization."""
@@ -30,7 +24,7 @@
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
- if isinstance(obj, collections.Iterable) and not is_stringy(obj):
+ if isinstance(obj, collections.Iterable) and not isinstance(obj, str):
try:
return {k: self.default(v) for k, v in obj.items()}
except AttributeError:
@@ -50,7 +44,7 @@
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%dT%H:%M:%S.%fZ')
- if isinstance(obj, collections.Iterable) and not is_stringy(obj):
+ if isinstance(obj, collections.Iterable) and not isinstance(obj, str):
try:
return {k: self.default(v) for k, v in obj.items() if (v or v
in (False, 0))}
except AttributeError:
@@ -67,3 +61,21 @@
def to_snake_case(camel_str):
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', camel_str)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()
+
+
+DATETIME_FORMATS = [
+ '%Y-%m-%dT%H:%M:%S.%fZ',
+ '%Y-%m-%dT%H:%M:%SZ', # Marathon omits milliseconds when they would be
.000
+]
+
+
+def to_datetime(timestamp):
+ if (timestamp is None or isinstance(timestamp, datetime.datetime)):
+ return timestamp
+ else:
+ for fmt in DATETIME_FORMATS:
+ try:
+ return datetime.datetime.strptime(timestamp,
fmt).replace(tzinfo=datetime.timezone.utc)
+ except ValueError:
+ pass
+ raise ValueError(f'Unrecognized datetime format: {timestamp}')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon.egg-info/PKG-INFO
new/marathon-0.12.0/marathon.egg-info/PKG-INFO
--- old/marathon-0.11.0/marathon.egg-info/PKG-INFO 2019-01-15
20:14:09.000000000 +0100
+++ new/marathon-0.12.0/marathon.egg-info/PKG-INFO 2019-11-14
02:39:46.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: marathon
-Version: 0.11.0
+Version: 0.12.0
Summary: Marathon Client Library
Home-page: https://github.com/thefactory/marathon-python
Author: Mike Babineau
@@ -13,9 +13,8 @@
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.4
+Classifier: Programming Language :: Python :: 3.6
+Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development :: Libraries :: Python Modules
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/marathon.egg-info/SOURCES.txt
new/marathon-0.12.0/marathon.egg-info/SOURCES.txt
--- old/marathon-0.11.0/marathon.egg-info/SOURCES.txt 2019-01-15
20:14:09.000000000 +0100
+++ new/marathon-0.12.0/marathon.egg-info/SOURCES.txt 2019-11-14
02:39:46.000000000 +0100
@@ -4,7 +4,6 @@
setup.cfg
setup.py
marathon/__init__.py
-marathon/_compat.py
marathon/client.py
marathon/exceptions.py
marathon/util.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/marathon-0.11.0/setup.py new/marathon-0.12.0/setup.py
--- old/marathon-0.11.0/setup.py 2019-01-15 20:10:03.000000000 +0100
+++ new/marathon-0.12.0/setup.py 2019-11-14 02:21:55.000000000 +0100
@@ -8,7 +8,7 @@
setup(
name='marathon',
- version='0.11.0',
+ version='0.12.0',
description='Marathon Client Library',
long_description="""Python interface to the Mesos Marathon REST API.""",
author='Mike Babineau',
@@ -24,10 +24,9 @@
'Intended Audience :: System Administrators',
'License :: OSI Approved :: MIT License',
'Operating System :: OS Independent',
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.4',
+ 'Programming Language :: Python :: 3.6',
+ 'Programming Language :: Python :: 3.7',
'Programming Language :: Python',
'Topic :: Software Development :: Libraries :: Python Modules'
],