Skip to content

Commit

Permalink
Merge pull request #29 from Revolution1/fix/some-condequiality-fix
Browse files Browse the repository at this point in the history
fix some issues that codacy detected
  • Loading branch information
Revolution1 committed Mar 30, 2018
2 parents 98a8827 + b52688f commit fd19fd1
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 123 deletions.
3 changes: 3 additions & 0 deletions .codacy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@ exclude_paths:
- tests/**
- scripts/**
- docs/**
- travis_pypi_setup.py
- setup.py
- etcd3/utils.py
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

[![pypi](https://img.shields.io/pypi/v/etcd3-py.svg)](https://pypi.python.org/pypi/etcd3-py)
[![travis](https://travis-ci.org/Revolution1/etcd3-py.svg?branch=master)](https://travis-ci.org/Revolution1/etcd3-py)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/9448814cd66b4a568365bc050d88270c)](https://www.codacy.com/app/revol/etcd3-py?utm_source=github.com&utm_medium=referral&utm_content=Revolution1/etcd3-py&utm_campaign=Badge_Grade)
[![codecov](https://codecov.io/gh/Revolution1/etcd3-py/branch/master/graph/badge.svg)](https://codecov.io/gh/Revolution1/etcd3-py)
[![doc](https://readthedocs.org/projects/etcd3-py/badge/?version=latest)](http://etcd3-py.readthedocs.io/en/latest/?badge=latest)
[![updates](https://pyup.io/repos/github/Revolution1/etcd3-py/shield.svg)](https://pyup.io/repos/github/Revolution1/etcd3-py/)
Expand Down
4 changes: 2 additions & 2 deletions etcd3/baseclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ def close(self):
"""
close the stream
"""
raise NotImplemented
raise NotImplementedError

@abc.abstractmethod
def __iter__(self):
raise NotImplemented
raise NotImplementedError


class BaseClient(AuthAPI, ClusterAPI, KVAPI, LeaseAPI, MaintenanceAPI, WatchAPI, ExtraAPI):
Expand Down
4 changes: 2 additions & 2 deletions etcd3/stateful/lease.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,15 +115,15 @@ def keepalive(self, keep_cb=None, cancel_cb=None):

def keepalived():
while self.keeping:
retry(lambda: self.keepalive_once(), max_tries=3, log=log)
retry(self.keepalive_once, max_tries=3, log=log)
self.last_keep = time.time()
log.debug("keeping lease %d" % self.ID)
if keep_cb:
try:
keep_cb()
except Exception:
log.exception("stream_cb() raised an error")
for i in range(int(self.grantedTTL / 2.0)): # keep per grantedTTL/4 seconds
for _ in range(int(self.grantedTTL / 2.0)): # keep per grantedTTL/4 seconds
if self.keeping:
break
time.sleep(0.5)
Expand Down
210 changes: 93 additions & 117 deletions etcd3/swagger_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -318,125 +318,14 @@ def __init__(self, root, node, path, parent=None, name=None):
self.description = node.get('description', None)
self.title = node.get('title', None)
self.required = node.get('required', False)
if self.type == 'object':
def encode(data):
"""
:param data: dict
"""
if data is None:
return
if 'properties' not in node:
return {}
rt = {}
for k, v in self.properties._items():
value = self.properties._get(k).encode(data.get(k))
if value is None:
continue
rt[k] = value
return rt

def decode(data):
"""
:param data: dict
"""
if 'properties' not in node:
return {}
rt = {}
for k, v in six.iteritems(data):
if k not in self.properties:
continue
rt[k] = self.properties._get(k).decode(v)
return rt

def getModel():
def init(this, data):
if not isinstance(data, dict):
raise TypeError("A dict expected, got a '%s' instead" % type(data))
this._node = self
this._data = data
for k in self.properties._keys():
if k not in data:
setattr(this, k, None)
continue
v = data[k]
m = self.properties._get(k)
if m._is_schema:
m = m.getModel()
v = m(v)
setattr(this, k, v)

name = self._path[-1]
ite = lambda self: self._data.__iter__()
con = lambda self, key: self._data.__contains__(key)
rep = lambda self: '%s(%s)' % (name, ', '.join(
['%s=%s' % (k, repr(v)) for k, v in six.iteritems(self.__dict__) if k in self._data]))

return type(str(name), (), {
'__init__': init,
'__repr__': rep,
'__iter__': ite,
'__contains__': con
})

elif self.type == 'array':

def encode(data):
"""
:param data: iterable
"""
if data is None:
return
return [self.items.encode(i) for i in data]

def decode(data):
"""
:param data: iterable
"""
if data is None:
return
return [self.items.decode(i) for i in data]

def getModel():
def init(data):
if not isinstance(data, (list, tuple)):
raise TypeError("A list or tuple expected, got a '%s' instead" % type(data))
m = self.items.getModel()
return [m(i) for i in data]

return init
elif self.type in PROP_DECODERS:
def encode(data):
if isinstance(data, enum.Enum):
data = data.value
rt = PROP_ENCODERS[self.type](PROP_ENCODERS[self.format](data))
if self.default and rt is None:
rt = copy.copy(self.default)
if isinstance(rt, six.binary_type):
rt = six.text_type(rt, encoding='utf-8')
return rt

def decode(data):
r = PROP_DECODERS[self.format](PROP_DECODERS[self.type](data))
if self._is_enum:
m = name_to_model.get(self._path[-1])
if m:
r = m(r)
return r

def getModel():
return lambda x: x
# return lambda x: x.value if isinstance(x, enum.Enum) else x

if self.type in PROP_DECODERS:
self.format = node.get('format', None)
self.default = node.get('default', None)
if 'enum' in node:
self._is_enum = True
self.enum = enum.Enum(self._path[-1], [(six.text_type(i), i) for i in node.get('enum')])
else:
self.enum = name_to_model.get(self._path[-1])
elif self.type not in ('object', 'array'):
raise TypeError('Unsupported Type %s' % self.type)
self.encode = encode
self.decode = decode
self.getModel = getModel

def encode(self, data):
"""
Expand All @@ -445,7 +334,33 @@ def encode(self, data):
:param data: data to encode
:return: encoded data
"""
raise NotImplementedError
if not hasattr(self, 'type') and self.type:
raise NotImplementedError
if self.type == 'object':
if data is None:
return
if 'properties' not in self._node:
return {}
rt = {}
for k, v in self.properties._items():
value = self.properties._get(k).encode(data.get(k))
if value is None:
continue
rt[k] = value
return rt
elif self.type == 'array':
if data is None:
return []
return [self.items.encode(i) for i in data]
else:
if isinstance(data, enum.Enum):
data = data.value
rt = PROP_ENCODERS[self.type](PROP_ENCODERS[self.format](data))
if self.default and rt is None:
rt = copy.copy(self.default)
if isinstance(rt, six.binary_type):
rt = six.text_type(rt, encoding='utf-8')
return rt

def decode(self, data):
"""
Expand All @@ -454,13 +369,74 @@ def decode(self, data):
:param data: data to decode
:return: decoded data
"""
raise NotImplementedError
if not hasattr(self, 'type') and self.type:
raise NotImplementedError
if self.type == 'object':
if 'properties' not in self._node:
return {}
rt = {}
for k, v in six.iteritems(data):
if k not in self.properties:
continue
rt[k] = self.properties._get(k).decode(v)
return rt
elif self.type == 'array':
if data is None:
return
return [self.items.decode(i) for i in data]
else:
r = PROP_DECODERS[self.format](PROP_DECODERS[self.type](data))
if self._is_enum:
m = name_to_model.get(self._path[-1])
if m:
r = m(r)
return r

def getModel(self):
"""
get the model of the schema
"""
raise NotImplementedError
if not hasattr(self, 'type') and self.type:
raise NotImplementedError
if self.type == 'object':
def init(this, data):
if not isinstance(data, dict):
raise TypeError("A dict expected, got a '%s' instead" % type(data))
this._node = self
this._data = data
for k in self.properties._keys():
if k not in data:
setattr(this, k, None)
continue
v = data[k]
m = self.properties._get(k)
if m._is_schema:
m = m.getModel()
v = m(v)
setattr(this, k, v)

name = self._path[-1]
ite = lambda self: self._data.__iter__()
con = lambda self, key: self._data.__contains__(key)
rep = lambda self: '%s(%s)' % (name, ', '.join(
['%s=%s' % (k, repr(v)) for k, v in six.iteritems(self.__dict__) if k in self._data]))

return type(str(name), (), {
'__init__': init,
'__repr__': rep,
'__iter__': ite,
'__contains__': con
})
elif self.type == 'array':
def init(data):
if not isinstance(data, (list, tuple)):
raise TypeError("A list or tuple expected, got a '%s' instead" % type(data))
m = self.items.getModel()
return [m(i) for i in data]

return init
else:
return lambda x: x

@property
def _ref(self):
Expand Down
2 changes: 0 additions & 2 deletions etcd3/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -373,5 +373,3 @@ def find_executable(executable, path=None): # pragma: no cover
f = os.path.join(p, execname)
if os.path.isfile(f):
return f
else:
return None

0 comments on commit fd19fd1

Please sign in to comment.