Skip to content
This repository has been archived by the owner on Aug 21, 2020. It is now read-only.

Commit

Permalink
Fix sort_target parameter off-by-one.
Browse files Browse the repository at this point in the history
Fixes #18
  • Loading branch information
fasaxc authored and dims committed Apr 10, 2018
1 parent 797cb2e commit 11cf6c4
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 4 deletions.
9 changes: 5 additions & 4 deletions etcd3gw/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from etcd3gw.utils import DEFAULT_TIMEOUT
from etcd3gw import watch

_SORT_ORDER = ['ascend', 'descend']
_SORT_ORDER = ['none', 'ascend', 'descend']
_SORT_TARGET = ['key', 'version', 'create', 'mod', 'value']

_EXCEPTIONS_BY_CODE = {
Expand Down Expand Up @@ -194,14 +194,14 @@ def get(self, key, metadata=False, sort_order=None,
try:
order = 0
if sort_order:
order = _SORT_ORDER.index(sort_order) + 1
order = _SORT_ORDER.index(sort_order)
except ValueError:
raise ValueError('sort_order must be one of "ascend" or "descend"')

try:
target = 0
if sort_target:
target = _SORT_TARGET.index(sort_target) + 1
target = _SORT_TARGET.index(sort_target)
except ValueError:
raise ValueError('sort_target must be one of "key", '
'"version", "create", "mod" or "value"')
Expand Down Expand Up @@ -251,7 +251,8 @@ def get_prefix(self, key_prefix, sort_order=None, sort_target=None):
return self.get(key_prefix,
metadata=True,
range_end=_encode(_increment_last_byte(key_prefix)),
sort_order=sort_order)
sort_order=sort_order,
sort_target=sort_target)

def replace(self, key, initial_value, new_value):
"""Atomically replace the value of a key with a new value.
Expand Down
53 changes: 53 additions & 0 deletions etcd3gw/tests/test_etcd3gw.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,59 @@ def remove_prefix(string, prefix):

assert reverse_keys == ''.join(reversed(initial_keys))

@unittest.skipUnless(
_is_etcd3_running(), "etcd3 is not available")
def test_get_prefix_sort_order_explicit_sort_target_key(self):
def remove_prefix(string, prefix):
return string[len(prefix):]

initial_keys_ordered = 'abcde'
initial_keys = 'aebdc'
initial_values = 'qwert'

for k, v in zip(initial_keys, initial_values):
self.client.put('/doot2/{}'.format(k), v)

keys = ''
for value, meta in self.client.get_prefix(
'/doot2', sort_order='ascend', sort_target='key'):
keys += remove_prefix(meta['key'], '/doot2/')

assert keys == initial_keys_ordered

reverse_keys = ''
for value, meta in self.client.get_prefix(
'/doot2', sort_order='descend', sort_target='key'):
reverse_keys += remove_prefix(meta['key'], '/doot2/')

assert reverse_keys == ''.join(reversed(initial_keys_ordered))

@unittest.skipUnless(
_is_etcd3_running(), "etcd3 is not available")
def test_get_prefix_sort_order_explicit_sort_target_rev(self):
def remove_prefix(string, prefix):
return string[len(prefix):]

initial_keys = 'aebdc'
initial_values = 'qwert'

for k, v in zip(initial_keys, initial_values):
self.client.put('/expsortmod/{}'.format(k), v)

keys = ''
for value, meta in self.client.get_prefix(
'/expsortmod', sort_order='ascend', sort_target='mod'):
keys += remove_prefix(meta['key'], '/expsortmod/')

assert keys == initial_keys

reverse_keys = ''
for value, meta in self.client.get_prefix(
'/expsortmod', sort_order='descend', sort_target='mod'):
reverse_keys += remove_prefix(meta['key'], '/expsortmod/')

assert reverse_keys == ''.join(reversed(initial_keys))

@unittest.skipUnless(
_is_etcd3_running(), "etcd3 is not available")
def test_replace_success(self):
Expand Down

0 comments on commit 11cf6c4

Please sign in to comment.